1. 程式人生 > >C#HTTP請求亂碼問題

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解決還有一個重要的地方,就是使用抓包工具!!電信那邊不能給我們對資料,如果不是使用抓包工具發現引數被轉碼了我現在還在找我的加密方法的問題。