C#中POST數據和接收的幾種方式

POST方式提交數據,一種眾所周知的方式:

html頁面中使用form表單提交,接收方式,使用Request.Form[""]或Request.QueryString[""]來獲取。

?

這里介紹另外一種POST方式和接收方式,就是將整個數據作為加入到數據流中提交和接收

接收方式:

Stream s = System.Web.HttpContext.Current.Request.InputStream;
byte[] b = new byte[s.Length];
s.Read(b, 0, (int)s.Length);
return Encoding.UTF8.GetString(b);

只需要從input Stream中讀取byte數據,然后轉為string,再解析即可。如果要回復響應消息只需要用:Response.Write() ?輸出即可(和普通的頁面輸出一樣)。

?

主動POST發送方式:

復制代碼
復制代碼
復制代碼
復制代碼
            HttpWebRequest webrequest = (HttpWebRequest)HttpWebRequest.Create(url);webrequest.Method = "post";byte[] postdatabyte = Encoding.UTF8.GetBytes(postData);webrequest.ContentLength = postdatabyte.Length;Stream stream;stream = webrequest.GetRequestStream();stream.Write(postdatabyte, 0, postdatabyte.Length);stream.Close();using (var httpWebResponse = webrequest.GetResponse())using (StreamReader responseStream = new StreamReader(httpWebResponse.GetResponseStream())){String ret = responseStream.ReadToEnd();T result = XmlDeserialize<T>(ret);return result;}
復制代碼
復制代碼
復制代碼
復制代碼

使用HttpClient對象發送

復制代碼
復制代碼
復制代碼
復制代碼
 public static  string   PostXmlResponse(string url, string xmlString){HttpContent httpContent = new StringContent(xmlString);httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");HttpClient httpClient = new HttpClient();HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;if (response.IsSuccessStatusCode){Task<string> t = response.Content.ReadAsStringAsync();return t.Result;}return string.Empty;}
復制代碼
復制代碼
復制代碼
復制代碼

?

從代碼中可以看出僅僅是將字符串轉為byte[] 類型,并加入到請求流中,進行請求即可達到POST效果,該種POST方式與上邊所提到的接收方式相互配合使用。

下面一種方式是以鍵值對的方式主動POST傳輸的。

?

復制代碼
復制代碼
復制代碼
復制代碼
     /// <summary>/// 發起httpPost 請求,可以上傳文件/// </summary>/// <param name="url">請求的地址</param>/// <param name="files">文件</param>/// <param name="input">表單數據</param>/// <param name="endoding">編碼</param>/// <returns></returns>public static string PostResponse(string url, UpLoadFile[] files, Dictionary<string, string> input, Encoding endoding){string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);request.ContentType = "multipart/form-data; boundary=" + boundary;request.Method = "POST";request.KeepAlive = true;//request.Credentials = CredentialCache.DefaultCredentials;request.Expect = "";MemoryStream stream = new MemoryStream();byte[] line = Encoding.ASCII.GetBytes("--" + boundary + "\r\n");byte[] enterER = Encoding.ASCII.GetBytes("\r\n");提交文件if (files != null){string fformat = "Content-Disposition:form-data; name=\"{0}\";filename=\"{1}\"\r\nContent-Type:{2}\r\n\r\n";foreach (UpLoadFile file in files){stream.Write(line, 0, line.Length);        //項目分隔符string s = string.Format(fformat, file.Name, file.FileName, file.Content_Type);byte[] data = Encoding.UTF8.GetBytes(s);stream.Write(data, 0, data.Length);stream.Write(file.Data, 0, file.Data.Length);stream.Write(enterER, 0, enterER.Length);  //添加\r\n}}//提交文本字段if (input != null){string format = "--" + boundary + "\r\nContent-Disposition:form-data;name=\"{0}\"\r\n\r\n{1}\r\n";    //自帶項目分隔符foreach (string key in input.Keys){string s = string.Format(format, key, input[key]);byte[] data = Encoding.UTF8.GetBytes(s);stream.Write(data, 0, data.Length);}}byte[] foot_data = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n");      //項目最后的分隔符字符串需要帶上--  stream.Write(foot_data, 0, foot_data.Length);request.ContentLength = stream.Length;Stream requestStream = request.GetRequestStream(); //寫入請求數據stream.Position = 0L;stream.CopyTo(requestStream); //stream.Close();requestStream.Close();try{HttpWebResponse response;try{response = (HttpWebResponse)request.GetResponse();try{using (var responseStream = response.GetResponseStream())using (var mstream = new MemoryStream()){responseStream.CopyTo(mstream);string message = endoding.GetString(mstream.ToArray());return message;}}catch (Exception ex){throw ex;}}catch (WebException ex){//response = (HttpWebResponse)ex.Response;//if (response.StatusCode == HttpStatusCode.BadRequest)//{//    using (Stream data = response.GetResponseStream())//    {//        using (StreamReader reader = new StreamReader(data))//        {//            string text = reader.ReadToEnd();//            Console.WriteLine(text);//        }//    }//}throw ex;}}catch (Exception ex){throw ex;}}
復制代碼
復制代碼
復制代碼
復制代碼

?

通過兩種主動POST提交 的代碼可以看出,其主要區別在于發送前的數據格式?ContentType 的值。

下面列舉幾種常用的ContentType 值,并簡述他們的區別

Content-Type 被指定為 application/x-www-form-urlencoded 時候,傳輸的數據格式需要如 ?title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3 所示格式,才能正確解析

Content-Type 被指定為?multipart/form-data?時候,所需格式如下面代碼塊中所示

復制代碼
復制代碼
復制代碼
復制代碼
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA------WebKitFormBoundaryrGKCBY7qhFd3TrwAContent-Disposition: form-data; name="text"title------WebKitFormBoundaryrGKCBY7qhFd3TrwAContent-Disposition: form-data; name="file"; filename="chrome.png"Content-Type: image/pngPNG ... content of chrome.png ...------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
復制代碼
復制代碼
復制代碼
復制代碼

Content-Type 也可以被指定為?application/json ,最終傳輸格式為?{"title":"test","sub":[1,2,3]} ?至于如何接收本人未經嘗試,但是可以肯定的講使用文章開頭所說的接收方式接收后轉為string類型再

發序列化是可行的。

?

Content-Type指定為?text/xml ?,傳輸的數據格式為

復制代碼
復制代碼
復制代碼
復制代碼
復制代碼
復制代碼
復制代碼
復制代碼
<?xml version="1.0"?>
<methodCall><methodName>examples.getStateName</methodName><params><param><value><i4>41</i4></value></param></params>
</methodCall>
復制代碼
復制代碼
復制代碼
復制代碼
復制代碼
復制代碼
復制代碼
復制代碼

此種方式,本人亦未經嘗試,接受方式可以參考上文中?application/json 的接收方式。

由于xml的格式傳輸數據,使用相對較少,相信很多同學亦不知道如何將字符串解析為對象,下文將提供一種轉換方式,供參考

復制代碼
復制代碼
復制代碼
復制代碼
            XmlDocument doc = new XmlDocument();doc.LoadXml(weixin);//讀取xml字符串XmlElement root = doc.DocumentElement;ExmlMsg xmlMsg = new ExmlMsg(){FromUserName = root.SelectSingleNode("FromUserName").InnerText,ToUserName = root.SelectSingleNode("ToUserName").InnerText,CreateTime = root.SelectSingleNode("CreateTime").InnerText,MsgType = root.SelectSingleNode("MsgType").InnerText,};if (xmlMsg.MsgType.Trim().ToLower() == "text"){xmlMsg.Content = root.SelectSingleNode("Content").InnerText;}else if (xmlMsg.MsgType.Trim().ToLower() == "event"){xmlMsg.EventName = root.SelectSingleNode("Event").InnerText;}return xmlMsg;
復制代碼
復制代碼
復制代碼
復制代碼
復制代碼
復制代碼
復制代碼
復制代碼
        private class ExmlMsg{/// <summary>/// 本公眾賬號/// </summary>public string ToUserName { get; set; }/// <summary>/// 用戶賬號/// </summary>public string FromUserName { get; set; }/// <summary>/// 發送時間戳/// </summary>public string CreateTime { get; set; }/// <summary>/// 發送的文本內容/// </summary>public string Content { get; set; }/// <summary>/// 消息的類型/// </summary>public string MsgType { get; set; }/// <summary>/// 事件名稱/// </summary>public string EventName { get; set; }}
復制代碼
復制代碼
分類: ASP.NET
本文轉自左正博客園博客,原文鏈接:http://www.cnblogs.com/soundcode/p/7573833.html,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454825.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454825.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454825.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java自動注入注解_Spring自動注解標簽@Autowired不能注入xml配置的bean嗎?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓配置service的xmlservice代碼public class LoginServiceImpl extends BaseDaoServiceImpl implements LoginService {Overridepublic Map queryByUserName(String userName){IDao iDao super.getAppDao();return (Map)iDao.queryF…

一卡通vip充值消費線上oracle庫服務器故障排查過程

上圖是oracle體系總架構圖今天突然公司所有終端pos機不能刷卡消費&#xff0c;財務室不能充值&#xff0c;一下很多電話打過來了&#xff0c;第一反應肯定數據庫出問題了&#xff0c;登陸到數據庫服務器&#xff0c;果然sqlplus連進去后就不斷提示要求輸入用戶名&#xff0c;彈…

最詳細的Linux下C編程

gcc 目 錄 1. gcc 1. makefile寫法 2. gcc_egcs使用 3. gdb使用 4. gcc常用選項對代碼的影響 1. 一般情況 2. -O 編譯選項 3. -O2 編譯選項 4. -fomit-frame-pointer 編譯選項 5. -fomit-frame-pointer…

sqlserver 存儲過程 增加

CREATE PROCEDURE [dbo].[InsertMessage]( strTable varchar(50), --表名 strValues nvarchar(1000), --要插入的數據&#xff08;用英文逗號分隔&#xff09;,如果是字符串類型&#xff0c;需加單引號 only_field varchar(20)NULL, --唯一性字段(列名) only_valu…

java開發計算機考試服務器_2011計算機二級JAVA編程:取得服務器當前的各種具體時間...

取得服務器當前的各種具體時間/*** 取得服務器當前的各種具體時間* 回車&#xff1a;日期時間*/import java.util.*;public class GetNowDate{Calendar calendar null;public GetNowDate(){calendar Calendar.getInstance();calendar.setTime(new Date());}public int getYea…

(cljs/run-at (JSVM. :all) 細說函數)

前言 作為一門函數式編程語言&#xff0c;深入了解函數的定義和使用自然是十分重要的事情&#xff0c;下面我們一起來學習吧&#xff01; 3種基礎定義方法 defn 定義語法 (defn name [params*]exprs*) 示例 (defn tap [ns x](println ns x)x) fn 定義語法 (fn name? [params*]…

Request的getHeader()和getParameter()的區別

區別是&#xff1a;一個是獲得HTTP頭信息,一個是獲得表單參數值。轉載于:https://www.cnblogs.com/pxffly/p/7460514.html

gcc中的內嵌匯編語言(Intel i386平臺)

gcc中的內嵌匯編語言&#xff08;Inteli386平臺&#xff09; 一.聲明 雖然Linux的核心代碼大部分是用C語言編寫的&#xff0c;但是不可避免的其中還是有一部分是用匯編語言寫成的。有些匯編語言代碼是直接寫在匯編源程序中的&#xff0c;特別是Linux的啟動代碼部分&#xff1b…

數據庫學習,樹形結構的數據庫表Schema設計方案

2019獨角獸企業重金招聘Python工程師標準>>> 程序設計過程中&#xff0c;我們常常用樹形結構來表征某些數據的關聯關系&#xff0c;如企業上下級部門、欄目結構、商品分類等等&#xff0c;通常而言&#xff0c;這些樹狀結構需要借助于數據庫完成持久化。然而目前的各…

[轉載] 手工制作Win7 OEM版

只要往微軟MSDN原版ISO的sources目錄加個“$OEM$”文件夾&#xff0c;再刪除sources下面的ei.cfg文件就可以了。 來源&#xff1a;http://zxkh19501.blog.163.com/blog/static/1237851792010629113427594/轉載于:https://www.cnblogs.com/784040932/p/win7oem.html

mysql dbo_mysql-雙重分組

我的表有兩列&#xff1a;名稱和等級.看起來像這樣&#xff1a;NAME | GRADEAdam | 1Adam | 2Adam | 2Adam | 3Frank | 2Frank | 1現在,我想創建如下所示的視圖&#xff1a;NAME | GRADE 1 | GRADE 2 | GRADE 3Adam | 1 | 2 | 1Frank | 1 | 1 | 0我寫了這個&#xff1a;SELECT …

課堂作業整理三 (集合:list接口)

集合中 list的方法列表&#xff08;Arraylist和Linkedlist&#xff09; 方法名功能說明ArrayList()構造方法&#xff0c;用于創建一個空的數組列表add&#xff08;E&#xff0c;e&#xff09;將指定的元素添加到此列表的尾部get&#xff08;int index&#xff09;返回此列表中指…

LINUX系統移植(史上最全最細,強烈推薦)

Linux系統移植 目 錄 第一部分 前言...................................................................................................................................8 1 硬件環境................................................................................…

The serializable class XXX does not declare a static final serialVersionUID field of type long的警告...

原文: http://blog.csdn.net/ultrakang/article/details/41820543轉載于:https://www.cnblogs.com/Baronboy/p/7465508.html

Ubuntu17.04 之 systemd 設置開機啟動

Ubuntu從16.04開始不再使用 initd 管理系統&#xff0c;改用 systemd。 和 Centos 一樣&#xff0c;升級到 Centos7 之后使用 systemd 替代 init.d 為了像以前一樣&#xff0c;在/etc/rc.local中設置開機啟動程序&#xff0c;需要以下幾步&#xff1a; 1、鏈接文件 systemd 默…

replaceselection();java'_Java JTextComponent.replaceSelection方法代碼示例

import javax.swing.text.JTextComponent; //導入方法依賴的package包/類public void actionPerformed(final ActionEvent evt, final JTextComponent target) {if (target ! null) {if (!target.isEditable() || !target.isEnabled()) {target.getToolkit().beep();return;}Ed…

Systemd 入門教程之命令篇

Systemd 是 Linux 系統工具&#xff0c;用來啟動守護進程&#xff0c;已成為大多數發行版的標準配置。 本文介紹它的基本用法&#xff0c;分為上下兩篇。今天介紹它的主要命令&#xff0c;下一篇介紹如何用于實戰。 一、由來 歷史上&#xff0c;Linux 的啟動一直采用init進程。…

GCC生成的匯編代碼

假設我們寫了一個C代碼文件 code.c包含下面代碼&#xff1a; int accum 0; int sum(int x, int y) { int t x y; accum t; return t; } 這是用echo命令輸入源碼的效果&#xff0c;簡單的就是最好的&#xff1a;&#xff09;一、查看GCC生成的匯編代碼在命令行…

php __FILE__,__CLASS__等魔術變量,及實例

php __FILE__,__CLASS__等魔術變量,及實例 今天看到一個魔術變量&#xff0c;是以前沒見過的&#xff0c;__DIR__&#xff0c;我查了查&#xff0c;發現原來是php5.3新增的&#xff0c;順便舉幾個例子&#xff0c;解釋一下php的魔術變量 1&#xff0c;__FILE__ 文件的完整路徑和…

java虛方法和抽象方法_虛方法和抽象方法--基礎回顧

抽象方法是只有定義、沒有實際方法體的函數&#xff0c;它只能在抽象函數中出現&#xff0c;并且在子類中必須重寫&#xff1b;虛方法則有自己的函數體&#xff0c;已經提供了函數實現&#xff0c;但是允許在子類中重寫或覆蓋。重寫的子類虛函數就是被覆蓋了。抽象方法使用abst…