HTTP & HTTPs

HTTP

HTTP 消息

 

HTTP 方法

基础知识参见:HTTP 协议初识 - 阮一峰

http请求

在 http请求 - Node直出理论与实践总结 中,从正常模式到数据直出再到服务端渲染直出,对http请求不断优化,加快首屏渲染时间。

 

HTTPS

基础知识参见: HTTPS 升级指南 - 阮一峰

 

问题整理

使用场景:字典集参数拼接成querystring

public static string DicToQueryString(Dictionary<string, object> dic, bool isSort, bool isUrlEncode)
{
    Dictionary<string, object> tempDic = (isSort) ? 
        dic.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value) : dic;

    StringBuilder sb = new StringBuilder();
    foreach (KeyValuePair<string, object> k in tempDic) {
        string key = k.Key, val = "";
        object value = k.Value;
        if (value == null || (value is string && string.IsNullOrWhiteSpace(value.ToString()))) { continue; }

        if (value is string) { val = value.ToString(); }
        else { val = JsonConvert.SerializeObject(value); }
        val = (isUrlEncode) ? StringUtils.UrlEncode(val) : val;

        sb.Append(key).Append("=").Append(val).Append("&");
    }

    string querystring = sb.ToString();
    if (querystring.Length > 1) { querystring = querystring.Substring(0, querystring.Length - 1); }
    return querystring;
}

其中,参数isSort表示key是否排序,isUrlEncode表示value是否urlEncode处理。value的编解码方法如下

public static string UrlEncode(string str)
{
    try {
        string[] temp = str.Split(' ');
        StringBuilder sb = new StringBuilder();
        for (int t = 0; t < temp.Length; t++) {
            sb.Append(HttpUtility.UrlEncode(temp[t].ToString(), Encoding.UTF8));
            if (t < temp.Length - 1) { sb.Append("%20"); }
        }
        return sb.ToString();
    } catch (Exception e) { return null; }
}
public static string UrlDecode(string str)
{
    try {
        return HttpUtility.UrlDecode(str, Encoding.UTF8);
    } catch (Exception e) { return null; }
}

此处提供一个扩展工具类,推荐

/// <summary>
/// HttpUtility扩展
/// HttpUtility的urlencode会将空格编码成+,urldecode会将+解码成空格
/// </summary>
public class HttpUtilityEx
{
	private static string bankEncode = HttpUtility.UrlEncode(" ");
	private static string plusEncode = HttpUtility.UrlEncode("+");
	
	/// 空格符的编码(+)转换为正常编码方式(%20),默认编码为UTF8
	public static string UrlEncode(string url) {
		return UrlEncode(url,Encoding.UTF8);
	}

	/// 空格符的编码("+")转换为正常编码方式(%20)
	public static string UrlEncode(string url, Encoding e) {
		if (string.IsNullOrEmpty(url)) { return string.Empty; }
		
		string tmp = HttpUtility.UrlEncode(url,e);		
		tmp = tmp.Replace(bankEncode, "%20");//将HttpUtility.UrlEncode编码后的空格符(+)替换成%20
		return tmp;
	}

	/// 保证+不会被decode成空格。默认编码UTF8
	public static string UrlDecode(string url) {
		return UrlDecode(url,Encoding.UTF8);
	}

	/// 保证+不会被decode成空格
	public static string UrlDecode(string url,Encoding e) {
		if (string.IsNullOrEmpty(url)) { return string.Empty; }
		
		//参数中有+,先替换成HttpUtility.UrlEncode后的编码,以便HttpUtility.UrlDecode时能够还原成+,而不是把+解密成空格
		url = url.Replace("+",plusEncode);
		return HttpUtility.UrlDecode(url,e);
	}
}

请求WebApi报错:400 Bad Request

解决参考:https://blog.csdn.net/lw1242189467/article/details/80048407

 

posted @ 2015-09-28 14:47  万箭穿心,习惯就好。  阅读(172)  评论(0编辑  收藏  举报