最近在做一个功能,大概功能是这样的,供应商提供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请求产生的编码问题相关推荐

  1. PhotonServer,客户端发送请求给服务端,服务端解析请求,发送回客户端响应,客户端再解析服务端发过来的响应。

    1.(客户端发送给服务端)test中的构造参数并且发送 完整代码如下 test.cs using System; using System.Collections; using System.Coll ...

  2. NodeJS http服务端获取POST请求数据

    http服务 我们知道,使用nodejs标准库的http模块创建一个http服务很简单,如下: const http = require('http');const hostname = '127.0 ...

  3. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  4. ASP.NET之通过JS向服务端(后台)发出请求(__doPostBack is undefined)

    ASP.NET回发数据是通过函数__doPostBack来实现的.该函数在加入了服务端控件,并将AutoPostBack设置为true之后,将自己主动生成,详细能够參看以下的图. 同一时候还会生成隐藏 ...

  5. Python原生服务端签名生成请求订单信息「orderString」

    接口文档:https://docs.open.alipay.com/204/105465/ 一.签名方法示例:「代码中的私钥是随机生成无法使用,做示例用」 def sign(params):sort_ ...

  6. H5请求服务端发送POST请求之预请求-OPTIONS

    1.问题场景 1.1 H5端请求服务端接口时,需要在header中携带服务端用jwt规范生成的token 1.2 在接收到H5的请求时Filter需要从请求头中拿出token做校验,检查当前的toke ...

  7. JAVA 服务端模拟客户端请求http/https

    涉及的包:httpcore-4.3.1.jar,httpclient-4.3.2.jar,httpmime-4.3.2.jar,htmlparser.jar,htmllexer.jar /*  */ ...

  8. 客户端请求下载,服务端响应下载请求并返回文件流

    工作中遇到这样的需求: 1.A项目提供下载服务 2.B项目封装A项目的下载服务 3.通过B项目来下载文件. 遇到的场景是:只有A服务可以下载文件,这里ip 限制,其他的服务器无法直接下载文件,这里类似 ...

  9. 关闭网页如何接收服务器消息,WebSocket服务端发消息给客户端,浏览器收到消息就关闭了...

    引用 2 楼 fly_dragon_fly 的回复: 收到的消息是什么 0000   00 0b ab 7a 86 83 18 f4 6a 36 60 a2 08 00 45 00  ...z.... ...

最新文章

  1. 只在必要时保存服务器控件视图状态
  2. Overview of ISA and TMG Networking and ISA Networking Case Study (Part 1)
  3. c语言p gt name,c语言中strcmp(p-name,s)是什么意思?
  4. BUUCTF(pwn) jarvisoj_level4 栈溢出,泄露libc
  5. Xamarin Evolve 2016 Keynote回顾
  6. Spark笔记——技术点汇总
  7. php嗅探木马,PHP安全-密码嗅探
  8. android-async-http取消请求
  9. 试题1 入门训练 Fibonacci数列
  10. PyTorch 入坑九:权重初始化
  11. Java导入导出Excel控件简介
  12. Github和Git是啥意思?下面来简单了解下。
  13. OpenStack实践(十一):Instance Live Migrate and Evacuate
  14. 【论文阅读】DeepPap: Deep Convolutional Networks for Cervical Cell Classification
  15. 我的jquery之路(二)
  16. 像诗人一样睿智,像天才一样疯狂
  17. 协通xt800 anydesk teamview 密码获取
  18. ESXI自动关机 ping值检测关机脚本
  19. 块存储、文件存储、对象存储这三者的区别
  20. 雷军亲自站台,游戏手机能否成为市场增长新引擎?

热门文章

  1. oracle存储过程建分区表,oracle存储过程创建表分区实例
  2. android6.0 主题,Android 6.0 DatePickerDialog主题
  3. 重新分区_完全不需要装软件!教你轻松调整硬盘分区
  4. 开机自启动脚本_Linux配置开机自启动执行脚本的两种方法
  5. linux安装ncurses教程,Linux ncurses安装教程(2种方法)
  6. linux下glew例子,一个简单的GLSL Shader例子
  7. matlab中imfilter是什么意思,matlab中imfilter的用法
  8. hive load data inpath 空目录_Hive内部表 | 每日五分钟学大数据
  9. mciSendString 的两个小坑
  10. 梳理:python—同一个类中的方法调用