C#HTTP请求乱码问题

贴一下我的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解决还有一个重要的地方,就是使用抓包工具!!电信那边不能给我们对数据,如果不是使用抓包工具发现参数被转码了我现在还在找我的加密方法的问题。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值