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,一经查实,立即删除!

相关文章

一卡通vip充值消费线上oracle库服务器故障排查过程

上图是oracle体系总架构图今天突然公司所有终端pos机不能刷卡消费&#xff0c;财务室不能充值&#xff0c;一下很多电话打过来了&#xff0c;第一反应肯定数据库出问题了&#xff0c;登陆到数据库服务器&#xff0c;果然sqlplus连进去后就不断提示要求输入用户名&#xff0c;弹…

数据库学习,树形结构的数据库表Schema设计方案

2019独角兽企业重金招聘Python工程师标准>>> 程序设计过程中&#xff0c;我们常常用树形结构来表征某些数据的关联关系&#xff0c;如企业上下级部门、栏目结构、商品分类等等&#xff0c;通常而言&#xff0c;这些树状结构需要借助于数据库完成持久化。然而目前的各…

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生成的汇编代码在命令行…

jQuery高度及位置操作

1. 获取滑轮位置&#xff0c;scrolltop:上下滚动的意思。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><div style"height:100px;width:10…

you have mixed tabs and spaces fix this

http://blog.csdn.net/tonyyan19781/article/details/60882443Vs2013 IDE下&#xff0c;编辑C的工程源码&#xff0c;在打开文件的时候&#xff0c;会出现 “ you have mixed tabs and spaces fix this ”&#xff0c; 然后给出三个选项 Tabify、Untabify、Dont show again。尤…

30天自制操作系统(二)汇编语言学习与Makefile入门

1 介绍文本编辑器这部分可直接略过2 继续开发helloos.nas中核心程序之前的内容和启动区以外的内容先不讲了&#xff0c;因为还涉及到一些软盘方面的知识。然后来讲的是helloos.nas这个文件; hello-os ; TAB4ORG 0x7c00 ; 指明程序的装载地址; 以下这部分记录…

java房产源码_基于jsp的房屋交易管理系统-JavaEE实现房屋交易管理系统 - java项目源码...

基于jspservletpojomysql实现一个javaee/javaweb的房屋交易管理系统, 该项目可用各类java课程设计大作业中, 房屋交易管理系统的系统架构分为前后台两部分, 最终实现在线上进行房屋交易管理系统各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类房屋交易管…

Docker 精通之入门

Docker 精通系列 Docker 精通之入门Docker 精通之微服务Docker 精通之常用命令Docker 精通之 Dockerfile 2013年发布至今&#xff0c; Docker 一直广受瞩目&#xff0c;被认为可能会改变软件行业。 但是&#xff0c;许多人并不清楚 Docker 到底是什么&#xff0c;要解决什么问…

bzoj3156 防御准备 - 斜率优化

Input 第一行为一个整数N表示战线的总长度。 第二行N个整数&#xff0c;第i个整数表示在位置i放置守卫塔的花费Ai。 Output 共一个整数&#xff0c;表示最小的战线花费值。 Sample Input 102 3 1 5 4 5 6 3 1 2 Sample Output 18 HINT 1<N<10^6,1<Ai<10^9 这题还是…

Docker 精通之微服务

Docker 精通系列 Docker 精通之入门Docker 精通之微服务Docker 精通之常用命令Docker 精通之 Dockerfile Docker 是一个容器工具&#xff0c;提供虚拟环境。很多人认为&#xff0c;它改变了我们对软件的认识。 站在 Docker 的角度&#xff0c;软件就是容器的组合&#xff1a;业…

php根据浏览器调用支付_Android通过外部浏览器调用微信H5支付,Android+PHP详解

看了好多关于讲解微信H5支付开发的文章&#xff0c;大多数都是通过微信内部浏览器来调用支付接口(其实就是公众号支付)&#xff0c;可能是因为H5支付接口刚开放不久吧。微信官方体验链接&#xff1a;http://wxpay.wxutil.com/mch/pay/h5.v2.php&#xff0c;请在微信外浏览器打开…

秒杀系统架构分析与实战

0 系列目录 秒杀系统架构 秒杀系统架构分析与实战1 秒杀业务分析 正常电子商务流程 &#xff08;1&#xff09;查询商品&#xff1b;&#xff08;2&#xff09;创建订单&#xff1b;&#xff08;3&#xff09;扣减库存&#xff1b;&#xff08;4&#xff09;更新订单&#xff1…

如何提高安卓代码的质量和语法

本文讲的是如何提高安卓代码的质量和语法&#xff0c;在这篇文章中&#xff0c;我会介绍几种不同的方式&#xff0c;让你通过自动化工具提高你的Android代码质量&#xff0c;包括 Checkstyle&#xff0c; Findbugs&#xff0c;PMD&#xff0c; 当然&#xff0c;还有我们最熟悉的…

grep 命令的 12 个实例

2019独角兽企业重金招聘Python工程师标准>>> 你是否遇到过需要在文件中查找一个特定的字符串或者样式&#xff0c;但是不知道从哪儿开始&#xff1f;那么,就请grep来帮你吧。 grep是每个Linux发行版都预装的一个强有力的文件模式搜索工具。无论何种原因&#xff0c;…

Linux : shell基础(慕课网Linux达人养成计划课程笔记)

Shell概述 shell是Linux中的命令行解释器&#xff0c;为用户提供了一个向Linux内核发送请求一边运行程序的界面系统级程序&#xff0c;用户可以用shell来启动、挂起、停止甚至编写一些程序。shell还是一个功能相当强大的编程语言&#xff0c;易编写&#xff0c;易调试&#xff…

php图型分析插件,IMAGE缩略图插件

应用信息 名称: IMAGE缩略图插件 售价: (免费) 应用ID: IMAGE 最低要求: Z-BlogPHP 1.5.1 Zero Build 151740版 本: 2 发布日期: 2014-08-27PHP最低版本要求: 5.3 更新日期: 2018-05-21立即购买 加入购物车作者信息 开发者ID: 十五楼的鸟儿 本站用户组: 管理员 联系邮箱: adm…

2017.9.5 postgresql加密函数的使用

需要安装的插件的名字&#xff1a;pgcrypto官网地址&#xff1a;https://www.postgresql.org/docs/9.4/static/pgcrypto.htmlstackoverflow:https://stackoverflow.com/questions/8000740/how-do-i-install-pgcrypto-in-postgresql-9-1-on-windows/46046367#46046367https://st…

php 序列化方法,PHP序列化操作方法分析

本文实例讲述了PHP序列化操作方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;序列化就是将变量数据转换为字符串(跟类型转换机制不同)&#xff0c;一般应用于存储数据(文件)&#xff0c;然后在别的情形下恢复(反序列化)序列化&#xff1a;$val serialize($var);f…

Redis入门到精通-Redis数据类型

2019独角兽企业重金招聘Python工程师标准>>> 登录Redis数据库 [rootlocalhost bin]# /usr/local/redis/bin/redis-cli String类型 ​ String 数据结构是简单的key-value类型&#xff0c;value其实不仅是String&#xff0c;也可以是数字&#xff0c;是包含很多种类型…