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.mzph.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…