`
zwchen
  • 浏览: 785610 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

HTTP客户端POST方式中文解决方案

阅读更多
这段时间,在给一个地区门户网站(alexa全球排行1200左右)做SSO集成,其中的一个部分就是Web Services服务接口,以及客户端,我们采用的是REST方式,不是SOAP,大致就是客户端通过HTTP POST方式向服务器提交数据,如账号同步,服务器返回xml,给客户端反馈。但提交过程中中文问题出来了,因为账号中有个realName字段是中文。客户端有以下几种:
1、Java HTTP客户端(HttpURLConnection)
2、PHP客户端(curl库)
3、ajax 客户端(XMLHTTP)
4、普通表单提交(POST方式)
…..

开发上面四种客户端API和 demo都很快,现在就记录一下中文解决方案问题吧。
我之所以要发表出来,是因为我这儿的解决方式是自动化的,编码量最小,并且我进行了无数次尝试,确定怎样行,怎样不行,并找出原因。
注意:我只是说明了request的中文解决方案,并且只是POST方式,但只要是对这个很理解,response的中文也就很简单了。

开始时候,我也是采用了比较机械的,在服务器端servlet中将得到的参数值:
byte[] b = value.getBytes("ISO-8859-1");
output = new String(b,"UTF-8");

这样可以解决问题,而且都成功了,但必须在四种客户端发送的中文时候要进行encoding操作。最后我觉得这肯定不是最优解,因为工作量太大,于是决定重构。
将发往服务器的request都用filter拦截,主要就是下面这句话,其实这个方式非常old了,不值得一提。在doFilter里:
request.setCharacterEncoding(encoding); 

也就是将到来的所有请求(还没有说到response呢)都用指定的编码(UTF-8)进行编码。
用filter,可以解决服务器移植的问题,如我最熟悉的Tomcat,resin,WL,WS。

我用axis (著名的Web Services SOAP引擎)附带的TCPMonitor来探测发出的POST请求。

Java HTTP客户端(HttpURLConnection):
必须将请求数据的key/value的value,进行编码:
URLEncoder.encode(value,"UTF-8")
;

PHP客户端(curl库):
同上,必须进行转码:
$truename = iconv("GBK", "UTF-8","陈志武");

因为我们PHP默认环境是中文

ajax客户端:
发送POST请求时,直接用中文,不需要用Javascript的encodeURI(),或者escape(),但是用了也不影响。
why?因为ajax POST方式默认是以UTF-8方式发送的。对已经编码的中文,也就是一些%E9%99%88%E5%BF%97%E6%AD%A6这样的正常符号了,服务器就忽略编码了,因为编和不编一个样。
注意,这两个函数对中文encode后结果不一样。用encodeURI()是以UTF-8编码,但没有其它编码类型可选择,这样,如果你的服务器端的filter用GBK默认,那么,就不能象这样自动处理。
所以,用ajax客户端时,必须慎重点。

普通表单提交(POST方式)
如果希望自动解决问题,在filter里对request请求编码设置为UTF-8的前提下,最好就是加入如下:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

如果charset为GBK,那么到Server端就是乱码的。
why?因为,用submit方式提交时,我们的提交的表单编码类型(enctype)是:
Content-Type: application/x-www-form-urlencoded,也就是说,提交的时候,我们的中文会自动进行编码,但依据就是上面的那个html指令。这个证据可以从TCPMonitor拦截的HTTP数据包里看到。
和上面的方式比较,ajax方式感觉是浏览器为我们建立了一个http通道,直接将中文提交上去了,和最前面介绍的两种一样。

在服务器端,我们的Java Web容器或应用服务器会自动给我们的request参数解码。将编码后的字符还原为本来面目。
如果你在控制台里面看到的都是正确的中文,你就可以抛开数据库这个存在编码问题了,但那个有时也有点麻烦。
分享到:
评论

相关推荐

    android客户端上传数据中文乱码3中解决方案

    android客户端上传数据中文乱码3中解决方案 一种HttpPost两种HTTPURLCONNECTION

    封装一个类搞定90%安卓客户端与服务器端交互

    本实例封装了一个处理安卓客户端与服务器端交互的几个方法,对于中文乱码问题本实例也找到了解决方案.本例可以处理的场景如下: 1.与服务器端交互json数据. 2.Get方式与服务器端交互数据. 3.Post方式与服务器端交互...

    JSPrintManager:先进的Java客户端打印和扫描解决方案

    JSPrintManager从Javascript打印命令和文件,管理打印机和扫描文档是针对客户端打印和扫描方案的Javascript + Client App解决方案,旨在用于在任何Web平台(如ASP.NET,PHP,Django,Ruby On Rails(RoR),Express....

    跨域WebService请求-Nginx_SOAP服务_Ajax客户端.docx

    一般的解决方案是使用服务器代理(由同域服务器跨域请求后返回),但导致过于复杂(参见:Java-webservice-CXF-SOAP服务.docx服务器代理)。 如果服务器能够操作,也可以使用JSONP允许跨域请求。

    Ajax跨域问题及解决方案(jsonp,cors)

    解决方案: 1.jsonp  在远程服务器上设法动态的把数据装进js格式的文本代码段中,供客户端调用和进一步处理;在前台通过动态添加script标签及src属性,表面看上去与ajax极为相似,但是,这和ajax并没有任何关系;...

    html5 postMessage解决跨域、跨窗口消息传递方案

    postMessage()方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档、多窗口、跨域消息传递。 postMessage(data,origin)方法接受两个参数  1.data:要传递的数据,html5规范中提到该参数可以是Jav

    riak-cli:Riak 命令行客户端

    有更好的解决方案,请参考 -&gt;使用带有curl的Riak http api查询riak真的很烦人! 于是工具诞生了。 干杯! 这是一个 Riak 终端查询工具,提供基本的 POST/PUT/DELETE/GET 等方法。安装 $ brew install node$ git ...

    js跨域请求的5中解决方式

    跨域请求数据解决方案主要有如下解决方法: JSONP方式 表单POST方式 服务器代理 Html5的XDomainRequest Flash request 分开说明: 一、JSONP: 直观的理解: 就是在客户端动态注册一个函数 function a(data),然后...

    JSValidation-----强大而灵活的表单客户端验证框架

    在应用服务器或者开发框架不提供验证的情况下,例如,普通的JSP, ASP, PHP等开发,以及一些不提供验证支持的开发框架,如Tapestry, Velocity等,JSValidation提供了一种灵活的解决方案。与其他验证方式相比,它最大...

    Clever Internet Suite 9.2.0.0 for Delphi 10.3 Rio

    Clever Internet Suite 9.2....所有支持的协议完整的SSL / TLS支持完整的客户端/ 服务器解决方案。 SSL/TLS的支持。多线程下 载。数据 压缩,同时检索数据。轻松创建任何格式的邮件消息。结合并提交Web表单POST请求。

    Clever.Internet.Suite.v.8.4.904.0.D7-XE10.1.x32.Source

    - 与所有支持的协议完整的SSL / TLS支持完整的客户端/服务器解决方案。 SSL / TLS的支持。 - 多部分多线程下载。数据压缩,同时检索数据。 - 轻松创建任何格式的邮件消息。结合并提交Web表单POST请求。 - 免版税...

    Clever Internet Suite (SRC) v8.0〖D7-XE8〗

     - 与所有支持的协议完整的SSL / TLS支持完整的客户端/服务器解决方案。 SSL / TLS的支持。  - 多部分多线程下载。数据压缩,同时检索数据。  - 轻松创建任何格式的邮件消息。结合并提交Web表单POST请求。 ...

    Jsonp post 跨域方案

    近期在项目中遇到这样一问题,关于jsonp跨域问题,get传值是可以的,但post传值死活不行啊,于是网上看了一大堆关于这方面的资料,最终问题得以解决,今天抽空与大家分享下。 说明: http://www.t1.com/index.php ...

    auth0-pizza42:解决方案工程师技术挑战

    基于Auth0身份平台的解决方案,可满足Pizza 42的需求。 此解决方案的演示可。 该网站由Heroku托管。 为了获得更好的体验,请使用以下工具: 临时邮箱&gt;。 免版税个人资料图片&gt;。 浏览器的REST客户端&gt; 。 注意...

    linux下mysql乱码问题的解决方案

    项目进行到和服务器交互,通过post访问服务器端jsp,jsp访问服务器端mysql数据库,最终返回到客户端的中文出现乱码问题。 在整个流程中,出现错误的原因可能是三个:post未设置编码或者编码不相符合,jdbc出现问题,...

    restlet-practice:java restlet实践,Restlet框架即是一个客户端,又是一个服务端框架。快速搭建REST API框架的优秀解决方案

    restlet-practicejava restlet实践,Restlet框架即是一个客户端,又是一个服务端框架。可以使用restlet轻松构建基于ROA服务。效果截图:POST方法:GET方法:

    flipt:一种开源的本地特征标记解决方案

    开源的本地特征标记解决方案 | | | Flipt是一个开源的,的预置型功能标志的应用程序,让你在你的环境中运行不同服务的实验。 Flipt可以部署在您现有的基础架构中,因此您不必担心将信息发送给第三方或通过Internet...

    Clever Internet Suite v9.4.920.0 FS (2019.9.13).rar

    - 完整的客户端/服务器解决方案,支持所有支持的协议的完全SSL / TLS。SSL / TLS支持。 - 多部分多线程下载。检索数据时的数据压缩。 - 轻松创建任何格式的邮件消息。组合并提交Web窗体POST请求。 - 版税免费许可。...

    httpcat:httpcat是用于在命令行上构造原始HTTP请求的简单实用程序

    httpcat httpcat是用于在命令行上构造原始HTTP请求的简单实用程序。 为什么? 有时能够在命令行上创建实际的原始很有用: ... 一个典型的解决方案涉及到echo的使用: $ echo -ne ' POST /post HTTP/1.1\

    JavaScript使用HTML5的window.postMessage实现跨域通信例子

    当然解决方案也有很多: 1.document.domain+iframe的设置,应用于主域相同而子域不同; 2.利用iframe和location.hash,数据直接暴露在了url中,数据容量和类型都有限 3.Flash LocalConnection, 对象可在一个 SWF ...

Global site tag (gtag.js) - Google Analytics