贴一下我的HTTP请求
private string ReadHTTPForPostUrl(string queryUrl, string data, string contentType, string[] hreaders)
{
if (!string.IsNullOrEmpty(queryUrl) && queryUrl.StartsWith("http//") ) queryUrl = queryUrl.Replace("http//","http://");
HttpWebRequest request = WebRequest.Create(queryUrl) as HttpWebRequest;
if (hreaders != null && hreaders.Length > 0)
{
request.Headers.Clear();
foreach (string h in hreaders)
{
string[] name_value = h.Split(":".ToCharArray());
if (name_value != null && name_value.Length == 2)
{
try
{
if ("accept".Equals(name_value[0].ToLower()))
{
request.Accept = name_value[1].Trim();
}
else if ("content-type".Equals(name_value[0].ToLower()))
{
request.ContentType = name_value[1].Trim();
}
else
{
request.Headers.Add(name_value[0], name_value[1].Trim());
}
}
catch (Exception ex)
{
Log.Info("name=" + name_value[0] + ";value=" + name_value[1].Trim());
Log.Error(ex.Message, ex);
}
}
}
}
if (data != null && data.Length > 0)
{
byte[] post_bytes = System.Text.Encoding.UTF8.GetBytes(data);
request.Method = "POST";
request.ContentType = contentType;
request.ContentLength = post_bytes.Length;
System.IO.Stream outStream = request.GetRequestStream();
outStream.Write(post_bytes, 0, post_bytes.Length);
outStream.Close();
}
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
StreamReader sr = new StreamReader(response.GetResponseStream());
string _content = sr.ReadToEnd();
try
{
sr.Close();
if (request != null)
{
request.Abort();
request=null;
}
if (response != null)
{
response.Close();
response=null;
}
}
catch { }
return _content;
}
我按照这个请求去请求别人的接口,接口一直给我返回“签名被非法篡改”。
就是说有一个参数被转码了,这个参数是加密的,我一直以为我是加密错了,然后一直找加密方法的问题。找了一天没找到问题,后来用抓包工具 Fiddler(抓包工具真的很重要!!!!)进行抓包,发现我的那个加密参数传过去的时候被转码了。没有转码之前是
Nl9m%252FYP7%252BHZWRLQva6MSHAvpVaQ%253D
被转码之后是:
Nl9m%2FYP7%2BHZWRLQva6MSHAvpVaQ%3D
找了半天不知道是哪里进行的转码,应该是浏览器自动对一些符号进行了转码吧?这里不太清楚,清楚的大佬跟我说下,谢谢。
后来我又去看接口文档,那个接口文档是按照JAVA的要求写的,其中 我看到参数加密那个地方,说进行两次 URLEncoder加密,我C#代码确实进行了两次 URLEncoder加密,后来我又去看他们给的一个JAVA 的httpdemo,JAVA我看的不是很懂,但是大致上能看懂,那个demo上又对参数进行了转码,然后我试着把参数 三次URLEncoder转码,最后就能正常访问了。
说起来这个问题解决还有一定的运气性质在里面,发现参数被转码之后还是不知道怎么解决,因为接口那边是电信公司,别人不可能为了我们这一个合作商来改动接口,最后试着改了一下加密方式竟然成功了。
这个bug解决还有一个重要的地方,就是使用抓包工具!!电信那边不能给我们对数据,如果不是使用抓包工具发现参数被转码了我现在还在找我的加密方法的问题。