C# get post之 get 方式

1.C# get post之 get 方式。

get 方式通过在网络地址附加参数来完成数据的提交,比如在地址 http://www.google.com/webhp?hl=zh-CN 中,前面部分 http://www.google.com/webhp 表示数据提交的网址,后面部分 hl=zh-CN 表示附加的参数,其中 hl 表示一个键(key), zh-CN 表示这个键对应的值(value)。程序代码如下:

1.            HttpWebRequest req (HttpWebRequest) 
HttpWebRequest.Create( 
"http://www.google.com/webhp?hl=zh-CN" );  

2.            req.Method "GET";  

3.            using (WebResponse wr req.GetResponse())  

4.            {  

5.            //在这里对接收到的页面内容进行处理  

6.            }  

2.C# get post之post方式。

post方式通过在页面内容中填写参数的方法来完成数据的提交,参数的格式和 get 方式一样,是类似于 hl=zh-CN&newwindow=1 这样的结构。程序代码如下:

7.            string param "hl=zh-CN&newwindow=1";  

8.            byte[] bs Encoding.ASCII.GetBytes(param);  

9.            HttpWebRequest req (HttpWebRequest)
HttpWebRequest.Create( 
"http://www.google.com/intl/zh-CN/" );  

10.        req.Method "POST";  

11.        req.ContentType "application/x-www-form-urlencoded";  

12.        req.ContentLength bs.Length;  

13.        using (Stream reqStream req.GetRequestStream())  

14.        {  

15.        reqStream.Write(bs, 0, bs.Length);  

16.        }  

17.        using (WebResponse wr req.GetResponse())  

18.        {  

19.        //在这里对接收到的页面内容进行处理  

20.        }  

在上面的代码中,我们访问了 www.google.com 的网址,分别以 get 和post方式提交了数据,并接收了返回的页面内容。然而,如果提交的参数中含有中文,那么这样的处理是不够的,需要对其进行编码,让对方网站能够识别。

3. C# get post之使用 get 方式提交中文数据。

get 方式通过在网络地址中附加参数来完成数据提交,对于中文的编码,常用的有 gb2312 和 utf8 两种,用 gb2312 方式编码访问的程序代码如下:

21.        Encoding myEncoding Encoding.GetEncoding("gb2312");  

22.        string address "http://www.baidu.com/s?" +
HttpUtility.UrlEncode(
"参数一"myEncoding)
"=" HttpUtility.UrlEncode("值一"myEncoding);  

23.        HttpWebRequest req (HttpWebRequest)HttpWebRequest.Create(address);  

24.        req.Method "GET";  

25.        using (WebResponse wr req.GetResponse())  

26.        {  

27.        //在这里对接收到的页面内容进行处理  

28.        

在上面的程序代码中,我们以 get 方式访问了网址 http://www.baidu.com/s ,传递了参数“参数一=值一”,由于无法告知对方提交数据的编码类型,所以编码方式要以对方的网站为标准。常见的网站中, www.baidu.com (百度)的编码方式是 gb2312, www.google.com (谷歌)的编码方式是 utf8。

4. C# get post之使用post方式提交中文数据。

post方式通过在页面内容中填写参数的方法来完成数据的提交,由于提交的参数中可以说明使用的编码方式,所以理论上能获得更大的兼容性。用 gb2312 方式编码访问的程序代码如下:

29.        Encoding myEncoding Encoding.GetEncoding("gb2312");  

30.        string param HttpUtility.UrlEncode("参数一"myEncoding) "=" 
HttpUtility.UrlEncode(
"值一"myEncoding) "&" +
HttpUtility.UrlEncode(
"参数二"myEncoding) "=" 
HttpUtility.UrlEncode(
"值二"myEncoding);  

31.        byte[] postBytes Encoding.ASCII.GetBytes(param);  

32.        HttpWebRequest req (HttpWebRequest) HttpWebRequest.Create
"http://www.baidu.com/s" );  

33.        req.Method "POST";  

34.        req.ContentType "application/x-www-form-urlencoded;charset=gb2312";  

35.        req.ContentLength postBytes.Length;  

36.        using (Stream reqStream req.GetRequestStream())  

37.        {  

38.        reqStream.Write(bs, 0, bs.Length);  

39.        }  

40.        using (WebResponse wr req.GetResponse())  

41.        {  

42.        //在这里对接收到的页面内容进行处理  

43.        

从上面的代码可以看出,post中文数据的时候,先使用 UrlEncode 方法将中文字符转换为编码后的 ASCII 码,然后提交到服务器,提交的时候可以说明编码的方式,用来使对方服务器能够正确的解析。

以上列出了客户端程序使用 HTTP 协议与服务器交互的情况,常用的是 get 和post方式。现在流行的 WebService 也是通过 HTTP 协议来交互的,使用的是post方法。与以上稍有所不同的是, WebService 提交的数据内容和接收到的数据内容都是使用了 XML 方式编码。所以, HttpWebRequest 也可以使用在调用 WebService 的情况下。

以上就是对C# get post方法的简单介绍。

 

------------------------------------------------------------------------------------------

 

C#中GET和POST的简单区别

GET和POST是最基本常用的,表单提交中get和post方式的区别归纳如下几点:

  • GET是从服务器上获取数据,POST是向服务器传送数据。
  • GET 是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,例如(url=asp.aspx?id=1)在URL中可以看到。POST是通过HTTP POST机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
  • 对于GET方式,服务器端用Request.QueryString获取变量的值,对于POST方式,服务器端用Request.Form获取提交的数据。
  • GET传送的数据量较小,不能大于2KB(这主要是因为受URL长度限制)。POST传送的数据量较大,一般被默认为不受限制。但理论上,限制取决于服务器的处理能力。
  • GET 安全性较低,POST安全性较高。因为GET在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记 录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一 同显示在用户面前。POST的所有操作对用户来说都是不可见的。
  • 在FORM提交的时候,如果不指定Method,则默认为 GET请求(.net默认是POST),Form中提交的数据将会附加在url之后,以?分开与url分开。字母数字字符原样发送,但空格转换为“+” 号,其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII(或ISO Latin-1)值。GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中;GET方式提交的数据最多只能有 2048字节,而POST则没有此限制。POST传递的参数在doc里,也就http协议所传递的文本,接受时再解析参数部分。获得参数。一般用POST 比较好。POST提交数据是隐式的,GET是通过在url里面传递的,用来传递一些不需要保密的数据,GET是通过在URL里传递参数,POST不是。
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Collections; using System.IO; using System.Text.RegularExpressions; using RE = System.Text.RegularExpressions.Regex; using System.Security.Cryptography.X509Certificates; /*************************************************************************************************************************************************** * *文件名:HttpProc.cs * *创建人:HeDaode * *日 期:2007.09.01 * *描 述:实现HTTP协议中的GETPOST请求 * *使 用:HttpProc.WebClient client = new HttpProc.WebClient(); client.Encoding = System.Text.Encoding.Default;//默认编码方式,根据需要设置其他类型 client.OpenRead("http://www.baidu.com");//普通get请求 MessageBox.Show(client.RespHtml);//获取返回的网页源代码 client.DownloadFile("http://www.codepub.com/upload/163album.rar",@"C:\163album.rar");//下载文件 client.OpenRead("http://passport.baidu.com/?login","username=zhangsan&password=123456");//提交表单,此处是登录百度的示例 client.UploadFile("http://hiup.baidu.com/zhangsan/upload", @"file1=D:\1.mp3");//上传文件 client.UploadFile("http://hiup.baidu.com/zhangsan/upload", "folder=myfolder&size=4003550",@"file1=D:\1.mp3");//提交含文本域和文件域的表单 *****************************************************************************************************************************************************/ namespace HttpProc { /// ///上传事件委托 /// /// /// public delegate void WebClientUploadEvent(object sender, HttpProc.UploadEventArgs e); /// ///下载事件委托 /// /// /// public delegate void WebClientDownloadEvent(object sender, HttpProc.DownloadEventArgs e); /// ///上传事件参数 /// public struct UploadEventArgs { /// ///上传数据总大小 /// public long totalBytes; /// ///已发数据大小 /// public long bytesSent; /// ///发送进度(0-1) /// public double sendProgress; /// ///发送速度Bytes/s /// public double sendSpeed; } /// ///下载事件参数 /// public struct DownloadEventArgs { /// ///下载数据总大小 /// public long totalBytes; /// ///已接收数据大小 /// public long bytesReceived; /// ///接收数据进度(0-1) /// public double ReceiveProgress; /// ///当前缓冲区数据 /// public byte[] receivedBuffer; /// ///接收速度Bytes/s /// public double receiveSpeed; } /// ///实现向WEB服务器发送和接收数据 /// public class WebClient { private WebHeaderCollection requestHeaders, responseHeaders; private TcpClient clientSocket; private MemoryStream postStream; private Encoding encoding = Encoding.Default; private const string BOUNDARY = "--HEDAODE--"; private const int SEND_BUFFER_SIZE = 10245; private const int RECEIVE_BUFFER_SIZE = 10245; private string cookie = ""; private string respHtml = ""; private string strRequestHeaders = ""; private string strResponseHeaders = ""; private int statusCode = 0; private bool isCanceled = false; public event WebClientUploadEvent UploadProgressChanged; public event WebClientDownloadEvent DownloadProgressChanged; /// ///初始化WebClient类 /// public WebClient() { responseHeaders = new WebHeaderCollection(); requestHeaders = new WebHeaderCollection(); } /// ///读取指定URL的文本 /// ///请求的地址 ///服务器响应文本 public string OpenRead(string URL) { requestHeaders.Add("Connection", "close"); SendRequestData(URL, "GET"); return GetHtml(); } //解决证书过期无法访问的问题 class CertPolicy : ICertificatePolicy { public bool CheckValidationResult(ServicePoint srvpt, X509Certificate cert, WebRequest req, int certprb) { return true; } } /// ///采用https协议访问网络 /// ///url地址 ///发送的数据 /// public string OpenReadWithHttps(string URL,string strPostdata) { ServicePointManager.CertificatePolicy = new CertPolicy(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); request.CookieContainer = new CookieContainer(); request.Method = "POST"; request.Accept = "*/*"; request.ContentType="application/x-www-form-urlencoded"; byte[] buffer = this.encoding.GetBytes(strPostdata); request.ContentLength = buffer.Length; request.GetRequestStream().Write(buffer, 0, buffer.Length); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), encoding); this.respHtml = reader.ReadToEnd(); foreach (System.Net.Cookie ck in response.Cookies) { this.cookie += ck.Name + "=" + ck.Value + ";"; } reader.Close(); return respHtml; } /// ///读取指定URL的文本 /// ///请求的地址 ///向服务器发送的文本数据 ///服务器响应文本 public string OpenRead(string URL, string postData) { byte[] sendBytes = encoding.GetBytes(postData); postStream = new MemoryStream(); postStream.Write(sendBytes, 0, sendBytes.Length); requestHeaders.Add("Content-Length", postStream.Length.ToString()); requestHeaders.Add("Content-Type", "application/x-www-form-urlencoded"); requestHeaders.Add("Connection", "close"); SendRequestData(URL, "POST"); return GetHtml(); } /// ///读取指定URL的流 /// ///请求的地址 ///向服务器发送的数据 ///服务器响应流 public Stream GetStream(string URL, string postData) { byte[] sendBytes = encoding.GetBytes(postData); postStream = new MemoryStream(); postStream.Write(sendBytes, 0, sendBytes.Length); requestHeaders.Add("Content-Length", postStream.Length.ToString()); requestHeaders.Add("Content-Type", "application/x-www-form-urlencoded"); requestHeaders.Add("Connection", "close"); SendRequestData(URL, "POST"); MemoryStream ms = new MemoryStream(); SaveNetworkStream(ms); return ms; } /// ///上传文件到服务器 /// ///请求的地址 ///文件域(格式如:file1=C:\test.mp3&file2=C:\test.jpg) ///服务器响应文本 public string UploadFile(string URL, string fileField) { return UploadFile(URL, "", fileField); } /// ///上传文件和数据到服务器 /// ///请求地址 ///文本域(格式为:name1=value1&name2=value2) ///文件域(格式如:file1=C:\test.mp3&file2=C:\test.jpg) ///服务器响应文本 public string UploadFile(string URL, string textField, string fileField) { postStream = new MemoryStream(); if (textField != "" && fileField != "") { WriteTextField(textField); WriteFileField(fileField); } else if (fileField != "") { WriteFileField(fileField); } else if (textField != "") { WriteTextField(textField); } else throw new Exception("文本域和文件域不能同时为空。"); //写入结束标记 byte[] buffer = encoding.GetBytes("--" + BOUNDARY + "--\r\n"); postStream.Write(buffer, 0, buffer.Length); //添加请求标头 requestHeaders.Add("Content-Length", postStream.Length.ToString()); requestHeaders.Add("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); requestHeaders.Add("Connection", "Keep-Alive"); //发送请求数据 SendRequestData(URL, "POST", true); //返回响应文本 return GetHtml(); } /// ///分析文本域,添加到请求流 /// ///文本域 private void WriteTextField(string textField) { string[] strArr = RE.Split(textField, "&"); textField = ""; foreach (string var in strArr) { Match M = RE.Match(var, "([^=]+)=(.+)"); textField += "--" + BOUNDARY + "\r\n"; textField += "Content-Disposition: form-data; name=\"" + M.Groups[1].Value + "\"\r\n\r\n" + M.Groups[2].Value + "\r\n"; } byte[] buffer = encoding.GetBytes(textField); postStream.Write(buffer, 0, buffer.Length); } /// ///分析文件域,添加到请求流 /// ///文件域 private void WriteFileField(string fileField) { string filePath = ""; int count = 0; string[] strArr = RE.Split(fileField, "&"); foreach (string var in strArr) , { Match M = RE.Match(var, "([^=]+)=(.+)"); filePath = M.Groups[2].Value; fileField = "--" + BOUNDARY + "\r\n"; fileField += "Content-Disposition: form-data; name=\"" + M.Groups[1].Value + "\"; filename=\"" + Path.GetFileName(filePath) + "\"\r\n"; fileField += "Content-Type: image/jpeg\r\n\r\n"; byte[] buffer = encoding.GetBytes(fileField); postStream.Write(buffer, 0, buffer.Length); //添加文件数据 FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); buffer = new byte[50000]; do { count = fs.Read(buffer, 0, buffer.Length); postStream.Write(buffer, 0, count); } while (count > 0); fs.Close(); fs.Dispose(); fs = null; buffer = encoding.GetBytes("\r\n"); postStream.Write(buffer, 0, buffer.Length); } } /// ///从指定URL下载数据流 /// ///请求地址 ///数据流 public Stream DownloadData(string URL) { requestHeaders.Add("Connection", "close"); SendRequestData(URL, "GET"); MemoryStream ms = new MemoryStream(); SaveNetworkStream(ms, true); return ms; } /// ///从指定URL下载文件 /// ///文件URL地址 ///文件保存路径,含文件名(如:C:\test.jpg) public void DownloadFile(string URL, string fileName) { requestHeaders.Add("Connection", "close"); SendRequestData(URL, "GET"); FileStream fs = new FileStream(fileName, FileMode.Create); SaveNetworkStream(fs, true); fs.Close(); fs = null; } /// ///向服务器发送请求 /// ///请求地址 ///POSTGET ///是否显示上传进度 private void SendRequestData(string URL, string method, bool showProgress) { clientSocket = new TcpClient(); Uri URI = new Uri(URL); clientSocket.Connect(URI.Host, URI.Port); requestHeaders.Add("Host", URI.Host); byte[] request = GetRequestHeaders(method + " " + URI.PathAndQuery + " HTTP/1.1"); clientSocket.Client.Send(request); //若有实体内容就发送它 if (postStream != null) { byte[] buffer = new byte[SEND_BUFFER_SIZE]; int count = 0; Stream sm = clientSocket.GetStream(); postStream.Position = 0; UploadEventArgs e = new UploadEventArgs(); e.totalBytes = postStream.Length; System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();//计时器 timer.Start(); do { //如果取消就推出 if (isCanceled) { break; } //读取要发送的数据 count = postStream.Read(buffer, 0, buffer.Length); //发送到服务器 sm.Write(buffer, 0, count); //是否显示进度 if (showProgress) { //触发事件 e.bytesSent += count; e.sendProgress = (double)e.bytesSent / (double)e.totalBytes; double t = timer.ElapsedMilliseconds / 1000; t = t 0); timer.Stop(); postStream.Close(); //postStream.Dispose(); postStream = null; }//end if } /// ///向服务器发送请求 /// ///请求URL地址 ///POSTGET private void SendRequestData(string URL, string method) { SendRequestData(URL, method, false); } /// ///获取请求头字节数组 /// ///POSTGET请求 ///请求头字节数组 private byte[] GetRequestHeaders(string request) { requestHeaders.Add("Accept", "*/*"); requestHeaders.Add("Accept-Language", "zh-cn"); requestHeaders.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"); string headers = request + "\r\n"; foreach (string key in requestHeaders) { headers += key + ":" + requestHeaders[key] + "\r\n"; } //有Cookie就带上Cookie if (cookie != "") { headers += "Cookie:" + cookie + "\r\n"; } //空行,请求头结束 headers += "\r\n"; strRequestHeaders = headers; requestHeaders.Clear(); return encoding.GetBytes(headers); } /// ///获取服务器响应文本 /// ///服务器响应文本 private string GetHtml() { MemoryStream ms = new MemoryStream(); SaveNetworkStream(ms);//将网络流保存到内存流 StreamReader sr = new StreamReader(ms, encoding); respHtml = sr.ReadToEnd(); sr.Close(); ms.Close(); return respHtml; } /// ///将网络流保存到指定流 /// ///保存位置 ///是否显示进度 private void SaveNetworkStream(Stream toStream, bool showProgress) { //获取要保存的网络流 NetworkStream NetStream = clientSocket.GetStream(); byte[] buffer = new byte[RECEIVE_BUFFER_SIZE]; int count = 0, startIndex = 0; MemoryStream ms = new MemoryStream(); for (int i = 0; i 0); timer.Stop();//关闭计时器 if (responseHeaders["Content-Length"] != null) { toStream.SetLength(long.Parse(responseHeaders["Content-Length"])); } //else //{ // toStream.SetLength(toStream.Length); // responseHeaders.Add("Content-Length", toStream.Length.ToString());//添加响应标头 //} toStream.Position = 0; //关闭网络流和网络连接 NetStream.Close(); clientSocket.Close(); } /// ///将网络流保存到指定流 /// ///保存位置 private void SaveNetworkStream(Stream toStream) { SaveNetworkStream(toStream, false); } /// ///分析响应流,去掉响应头 /// /// private void GetResponseHeader(byte[] buffer, out int startIndex) { responseHeaders.Clear(); string html = encoding.GetString(buffer); StringReader sr = new StringReader(html); int start = html.IndexOf("\r\n\r\n") + 4;//找到空行位置 strResponseHeaders = html.Substring(0, start);//获取响应头文本 //获取响应状态码 // if (sr.Peek() > -1) { //读第一行字符串 string line = sr.ReadLine(); //分析此行字符串,获取服务器响应状态码 Match M = RE.Match(line, @"\d\d\d"); if (M.Success) { statusCode = int.Parse(M.Value); } } //获取响应头 // while (sr.Peek() > -1) { //读一行字符串 string line = sr.ReadLine(); //若非空行 if (line != "") , ; { //分析此行字符串,获取响应标头 Match M = RE.Match(line, "([^:]+):(.+)"); if (M.Success) { try { //添加响应标头到集合 responseHeaders.Add(M.Groups[1].Value.Trim(), M.Groups[2].Value.Trim()); } catch { } //获取Cookie if (M.Groups[1].Value == "Set-Cookie") { M = RE.Match(M.Groups[2].Value, "[^=]+=[^;]+"); cookie += M.Value.Trim() + ";"; } } } //若是空行,代表响应头结束响应实体开始。(响应头和响应实体间用一空行隔开) else { //如果响应头中没有实体大小标头,尝试读响应实体第一行获取实体大小 if (responseHeaders["Content-Length"] == null && sr.Peek() > -1) { //读响应实体第一行 line = sr.ReadLine(); //分析此行看是否包含实体大小 Match M = RE.Match(line, "~[0-9a-fA-F]{1,15}"); if (M.Success) { //将16进制的实体大小字符串转换为10进制 int length = int.Parse(M.Value, System.Globalization.NumberStyles.AllowHexSpecifier); responseHeaders.Add("Content-Length", length.ToString());//添加响应标头 strResponseHeaders += M.Value + "\r\n"; } } break;//跳出循环 }//End If }//End While sr.Close(); //实体开始索引 startIndex = encoding.GetBytes(strResponseHeaders).Length; } /// ///取消上传或下载,要继续开始请调用Start方法 /// public void Cancel() { isCanceled = true; } /// ///启动上传或下载,要取消请调用Cancel方法 /// public void Start() { isCanceled = false; } //************************************************************* //以下为属性 //************************************************************* /// ///获取或设置请求头 /// public WebHeaderCollection RequestHeaders { set { requestHeaders = value; } get { return requestHeaders; } } /// ///获取响应头集合 /// public WebHeaderCollection ResponseHeaders { get { return responseHeaders; } } /// ///获取请求头文本 /// public string StrRequestHeaders { get { return strRequestHeaders; } } /// ///获取响应头文本 /// public string StrResponseHeaders { get { return strResponseHeaders; } } /// ///获取或设置Cookie /// public string Cookie { set { cookie = value; } get { return cookie; } } /// ///获取或设置编码方式(默认为系统默认编码方式) /// public Encoding Encoding { set { encoding = value; } get { return encoding; } } /// ///获取服务器响应文本 /// public string RespHtml { get { return respHtml; } } /// ///获取服务器响应状态码 /// public int StatusCode { get { return statusCode; } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值