POST方式發送Http請求

介紹http請求的兩種方式,get和post方式。並用C#語言實現,如何請求url並獲取返回的數據

兩者的區別:

  1. 參數
  2. Get請求把提交的數據進行簡單編碼,同時將url的一部分發送到服務器
  3. 比如url:Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB
  4. 所以get請求方式提交的數據存在一定的安全隱患,如果在使用對安全性要求教高的操作(比如用戶登錄,支付),應使用post方式。Get請求是默認的http請求方法,我們一般通過get方法來獲取表單數據
  5. POST請求會把請求的數據放置在HTTP請求包的包體中。上面的item=bandsaw就是實際的傳輸數據。
  6. 傳輸數據的大小
  7. GET,特定的瀏覽器和服務器對URL的長度有限制。因此,在使用GET請求時,傳輸數據會受到URL長度的限制。
  8. POST,由於不是URL傳值,理論上是不會受限制的,但是實際上各個服務器會規定對POST提交數據大小進行限制,Apache、IIS都有各自的配置。
  9. 安全性
  10. POST的安全性比GET的高。這裡的安全是指真正的安全,而不同於上面GET提到的安全方法中的安全,上面提到的安全僅僅是不修改服務器的數據。比如,在進行登錄操作,通過GET請求,用戶名和密碼都會暴露再URL上,因為登錄頁面有可能被瀏覽器緩存以及其他人查看瀏覽器的歷史記錄的原因,此時的用戶名和密碼就很容易被他人拿到了。除此之外,GET請求提交的數據還可能會造成Cross-site request frogery攻擊
  11. HTTP中的GET,POST,SOAP協議都是在HTTP上運行的

Get請求

請求類

///
/// Get請求
///
///
/// 字符串
public static string GetHttpResponse(string url, int Timeout)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
request.UserAgent = null;
request.Timeout = Timeout;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

19
20
21
22
23

調用方法

string url="Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB";
string res = HttpHelper.GetHttpResponse(url, 6000);
if (res != null)
{
T mes = JsonHelper.DeserializeJsonToObject(res)
}
1
2
3
4
5
6

Post請求

 /// 創建POST方式的HTTP請求 
public static HttpWebResponse CreatePostHttpResponse(string url, IDictionary parameters, int timeout, string userAgent, CookieCollection cookies)
{
HttpWebRequest request = null;
//如果是發送HTTPS請求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
request = WebRequest.Create(url) as HttpWebRequest;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
//設置代理UserAgent和超時
//request.UserAgent = userAgent;
//request.Timeout = timeout;

if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
//發送POST數據
if (!(parameters == null || parameters.Count == 0))
{
StringBuilder buffer = new StringBuilder();
int i = 0;
foreach (string key in parameters.Keys)
{
if (i > 0)
{
buffer.AppendFormat("&{0}={1}", key, parameters[key]);
}
else
{
buffer.AppendFormat("{0}={1}", key, parameters[key]);
i++;
}
}
byte[] data = Encoding.ASCII.GetBytes(buffer.ToString());
using (Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
}
string[] values = request.Headers.GetValues("Content-Type");
return request.GetResponse() as HttpWebResponse;
}
///
/// 獲取請求的數據
///

public static string GetResponseString(HttpWebResponse webresponse)
{
using (Stream s = webresponse.GetResponseStream())
{
StreamReader reader = new StreamReader(s, Encoding.UTF8);
return reader.ReadToEnd();
}
}
1
2
3
4
5

6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

56
57
58
59
60
61
62
63
64
65

調用方法

//參數p
IDictionary parameters = new Dictionary();
parameters.Add("p", HttpUtility.UrlEncode(p));
//http請求
System.Net.HttpWebResponse res = HttpHelper.CreatePostHttpResponse(url, parameters, 3000, null, null);
if (res == null)
{
Response.Redirect("RequestFailed.aspx?result=出錯了,可能是由於您的網絡環境差、不穩定或安全軟件禁止訪問網絡,您可在網絡好時或關閉安全軟件在重新訪問網絡。");
}
else
{
//獲取返回數據轉為字符串
string mes = HttpHelper.GetResponseString(res);
T model = JsonHelper.DeserializeJsonToObject(mes);
}
C井通過GET/POST方式發送Http請求


分享到:


相關文章: