近段时间经常对接一些接口,也遇到了一些问题。今天抽时间做个记录,也同时分享一下经验
1.request请求对方的API,
需要有TOKEN认证,认证的方式是在请求头中加入
Content-Signature:"HMAC-SHA1 SDFASDFS"
这个里面有加密算法,HMAC-SHA1的算法大家去网上查吧,比如JAVA,PHP很多。
我这里分享一个C#的:
1 /// <summary> 2 /// 加密算法 3 /// </summary> 4 /// <param name="text"></param> 5 /// <param name="key"></param> 6 /// <returns></returns> 7 public static string HmacSha1Sign(string str, string key = "") 8 { 9 if (key == "") 10 { 11 key = apiSecret; 12 } 13 byte[] keyBytes = System.Text.Encoding.UTF8.GetBytes(key); 14 HMACSHA1 hmac = new HMACSHA1(keyBytes); 15 byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(str); 16 byte[] signByte = hmac.ComputeHash(inputBytes); 17 return Convert.ToBase64String(signByte); 18 }
这个算是经过验证完全可以使用。
2.请求API
认证的加密有了开始进行请求:https 请求时就坑了一直在报404,
The remote server returned an error: (404) Not Found.
最后下班回家~~~~
第二天接着来,my god ~~~~
The remote server returned an error: (404) Not Found.
后来就开始各种怀疑,最后经过删除代码,然后在加上的方式不停的测试后来发现
header 中有一个参数:UserAgent
把这个注掉,可以了。我滴神~~~~
下面看一下什么是: Http Header之User-Agent
User Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。通过这个标 识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计;例如用手机访问谷歌和电脑访问是不一样的,这些是谷歌根据访问者的 UA来判断的。UA可以进行伪装。
浏览器的UA字串的标准格式:浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识版本信息。但各个浏览器有所不同
最后重新整理了一下请求头结果一切正常了!!!
最后分享一下C#请求方法:
1 /// <summary> 2 /// 创建POST方式的HTTP请求 3 /// </summary> 4 /// <param name="url">请求的URL</param> 5 /// <param name="parameters">随同请求POST的参数名称及参数值字典</param> 6 /// <param name="timeout">请求的超时时间</param> 7 /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param> 8 /// <param name="requestEncoding">发送HTTP请求时所用的编码</param> 9 /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param> 10 /// <returns></returns> 11 public HttpWebResponse CreatePostHttpResponse(string url, string parameters, Encoding requestEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null,bool endcode=true) 12 { 13 if (Debug) 14 { 15 Console.Write("Start Post Url:{0} ,parameters:{1} ", url, parameters); 16 17 18 } 19 20 if (string.IsNullOrEmpty(url)) 21 { 22 throw new ArgumentNullException("url"); 23 } 24 if (requestEncoding == null) 25 { 26 throw new ArgumentNullException("requestEncoding"); 27 } 28 HttpWebRequest request = null; 29 //如果是发送HTTPS请求 30 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) 31 { 32 ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); 33 request = WebRequest.Create(url) as HttpWebRequest; 34 request.ProtocolVersion = HttpVersion.Version10; 35 } 36 else 37 { 38 request = WebRequest.Create(url) as HttpWebRequest; 39 } 40 41 request.Method = "POST"; 42 //request.Host = "127.0.0.1"; 43 request.Headers.Add("Accept-Language", "zh-CN,en-GB;q=0.5"); 44 request.Method = "POST"; 45 request.Accept = "application/json;text/html;application/xhtml+xml;*/*; charset=utf-8"; 46 request.Referer = Referer; 47 request.ContentType = "application/json;charset=" + Encoding.UTF8.WebName; 48 request.Headers["Pragma"] = "no-cache"; 49 50 if (cookies != null) 51 { 52 request.CookieContainer = new CookieContainer(); 53 request.CookieContainer.Add(cookies); 54 } 55 else 56 { 57 request.CookieContainer = new CookieContainer(); 58 request.CookieContainer.Add(Cookies); 59 } 60 61 if (headers != null) 62 { 63 foreach (var header in headers) 64 { 65 request.Headers.Add(header.Key, header.Value); 66 } 67 } 68 69 //开启后会卡关请求是允许浏览器访问 70 if (!string.IsNullOrEmpty(userAgent)) 71 { 72 request.UserAgent = userAgent; 73 } 74 //else 75 //{ 76 // request.UserAgent = DefaultUserAgent; 77 //} 78 79 if (timeout.HasValue) 80 { 81 request.Timeout = timeout.Value * 1000; 82 } 83 84 //request.Expect = string.Empty; 85 86 //如果需要POST数据 87 if (!string.IsNullOrEmpty(parameters)) 88 { 89 90 var tempParam = ""; 91 if (endcode) 92 { 93 tempParam = ConvertEnCode.ConvertToEncode(parameters); 94 } 95 else 96 { 97 tempParam =parameters; 98 99 } 100 101 102 byte[] data = requestEncoding.GetBytes(tempParam); 103 using (Stream stream = request.GetRequestStream()) 104 { 105 stream.Write(data, 0, data.Length); 106 } 107 } 108 109 var v = request.GetResponse() as HttpWebResponse; 110 111 Cookies.Add(request.CookieContainer.GetCookies(new Uri("http://" + new Uri(url).Host))); 112 Cookies.Add(request.CookieContainer.GetCookies(new Uri("https://" + new Uri(url).Host))); 113 Cookies.Add(v.Cookies); 114 115 if (Debug) 116 { 117 Console.WriteLine("OK"); 118 } 119 return v; 120 }
最后再补充说明一个400,404现象: X509Certificate2
var privateKey =new X509Certificate2("xxxxxxx.pfx", "pwdxxxxxxxx",X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet).PrivateKey asRSACryptoServiceProvider;
如果有用到这个加密算法时,注意GHOST版本的系统是不行的。一定要找个正版系统或者是纯安装版的系统才可以。
原因目前不清楚~~~~