服务端发post请求产生的编码问题
最近在做一个功能,大概功能是这样的,供应商提供http接口给我们,然后我们抓取供应商的数据保存到数据库,问题在于他们编码格式是gb2312的,而我们是utf-8。
大家可能会有个误区,post请求是无需编码的,其实不然,只要在http请求头中 "Content-Type"为"application/x-www-form-urlencoded,调接口前都会用当前编码格式urlencode。所以如果前端post数据到后端时,前端是gb2312编码格式,后端是utf-8,只需在Content-Type中设置,application/x-www-form-urlencoded;charset=utf-8。
而我们是服务端直接调接口,而我用的是restsharp
var request = new RestRequest(Method.POST);request.RequestFormat = DataFormat.Json;
request.AddBody(model);var client = new RestClient("http://localhost:2290/Interface/Index");var response = client.Execute(request);
return response.Content;
翻阅文档,这期间会自动urlencode。。。
后来尝试设置web.config,设置默认编码格式,编码问题依然解决不了,有种冲动想去看restsharp的源码,可惜时间来不及啊。。。。(有时间一定要看下)
<globalization requestEncoding="gb2312" responseEncoding="gb2312"/>
最后终于找到了解决方案,用.net 源生的方式 httprequest
/// <summary> /// 创建POST方式的HTTP请求 /// </summary> /// <param name="url">请求的URL</param> /// <param name="parameters">随同请求POST的参数名称及参数值字典</param> /// <param name="timeout">请求的超时时间</param> /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param> /// <param name="requestEncoding">发送HTTP请求时所用的编码</param> /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param> /// <returns></returns> public static HttpWebResponse CreatePostHttpResponse(string url, IDictionary<string, string> parameters, int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies){if (string.IsNullOrEmpty(url)){throw new ArgumentNullException("url");}if (requestEncoding == null){throw new ArgumentNullException("requestEncoding");}HttpWebRequest request = null;//如果是发送HTTPS请求 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)){ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);request = WebRequest.Create(url) as HttpWebRequest;request.ProtocolVersion = HttpVersion.Version10;}else{request = WebRequest.Create(url) as HttpWebRequest;}request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded";if (!string.IsNullOrEmpty(userAgent)){request.UserAgent = userAgent;}else{request.UserAgent = DefaultUserAgent;}if (timeout.HasValue){request.Timeout = timeout.Value;}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 = requestEncoding.GetBytes(buffer.ToString());using (Stream stream = request.GetRequestStream()){stream.Write(data, 0, data.Length);}}return request.GetResponse() as HttpWebResponse;}
调用如下:
IDictionary<string, string> parameters = new Dictionary<string, string>();parameters.Add("RequestJson", jsonstr);HttpWebResponse response = HttpWebResponseUtility.CreatePostHttpResponse(url, parameters, null, null, Encoding.GetEncoding("GB2312"), null);using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8)){strres = reader.ReadToEnd();}
转载于:https://www.cnblogs.com/xuxzx/p/4383770.html
服务端发post请求产生的编码问题相关推荐
- PhotonServer,客户端发送请求给服务端,服务端解析请求,发送回客户端响应,客户端再解析服务端发过来的响应。
1.(客户端发送给服务端)test中的构造参数并且发送 完整代码如下 test.cs using System; using System.Collections; using System.Coll ...
- NodeJS http服务端获取POST请求数据
http服务 我们知道,使用nodejs标准库的http模块创建一个http服务很简单,如下: const http = require('http');const hostname = '127.0 ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- ASP.NET之通过JS向服务端(后台)发出请求(__doPostBack is undefined)
ASP.NET回发数据是通过函数__doPostBack来实现的.该函数在加入了服务端控件,并将AutoPostBack设置为true之后,将自己主动生成,详细能够參看以下的图. 同一时候还会生成隐藏 ...
- Python原生服务端签名生成请求订单信息「orderString」
接口文档:https://docs.open.alipay.com/204/105465/ 一.签名方法示例:「代码中的私钥是随机生成无法使用,做示例用」 def sign(params):sort_ ...
- H5请求服务端发送POST请求之预请求-OPTIONS
1.问题场景 1.1 H5端请求服务端接口时,需要在header中携带服务端用jwt规范生成的token 1.2 在接收到H5的请求时Filter需要从请求头中拿出token做校验,检查当前的toke ...
- JAVA 服务端模拟客户端请求http/https
涉及的包:httpcore-4.3.1.jar,httpclient-4.3.2.jar,httpmime-4.3.2.jar,htmlparser.jar,htmllexer.jar /* */ ...
- 客户端请求下载,服务端响应下载请求并返回文件流
工作中遇到这样的需求: 1.A项目提供下载服务 2.B项目封装A项目的下载服务 3.通过B项目来下载文件. 遇到的场景是:只有A服务可以下载文件,这里ip 限制,其他的服务器无法直接下载文件,这里类似 ...
- 关闭网页如何接收服务器消息,WebSocket服务端发消息给客户端,浏览器收到消息就关闭了...
引用 2 楼 fly_dragon_fly 的回复: 收到的消息是什么 0000 00 0b ab 7a 86 83 18 f4 6a 36 60 a2 08 00 45 00 ...z.... ...
最新文章
- 只在必要时保存服务器控件视图状态
- Overview of ISA and TMG Networking and ISA Networking Case Study (Part 1)
- c语言p gt name,c语言中strcmp(p-name,s)是什么意思?
- BUUCTF(pwn) jarvisoj_level4 栈溢出,泄露libc
- Xamarin Evolve 2016 Keynote回顾
- Spark笔记——技术点汇总
- php嗅探木马,PHP安全-密码嗅探
- android-async-http取消请求
- 试题1 入门训练 Fibonacci数列
- PyTorch 入坑九:权重初始化
- Java导入导出Excel控件简介
- Github和Git是啥意思?下面来简单了解下。
- OpenStack实践(十一):Instance Live Migrate and Evacuate
- 【论文阅读】DeepPap: Deep Convolutional Networks for Cervical Cell Classification
- 我的jquery之路(二)
- 像诗人一样睿智,像天才一样疯狂
- 协通xt800 anydesk teamview 密码获取
- ESXI自动关机 ping值检测关机脚本
- 块存储、文件存储、对象存储这三者的区别
- 雷军亲自站台,游戏手机能否成为市场增长新引擎?
热门文章
- oracle存储过程建分区表,oracle存储过程创建表分区实例
- android6.0 主题,Android 6.0 DatePickerDialog主题
- 重新分区_完全不需要装软件!教你轻松调整硬盘分区
- 开机自启动脚本_Linux配置开机自启动执行脚本的两种方法
- linux安装ncurses教程,Linux ncurses安装教程(2种方法)
- linux下glew例子,一个简单的GLSL Shader例子
- matlab中imfilter是什么意思,matlab中imfilter的用法
- hive load data inpath 空目录_Hive内部表 | 每日五分钟学大数据
- mciSendString 的两个小坑
- 梳理:python—同一个类中的方法调用