目前在写一个功能,主要是使用 HttpURLConnection 发送http请求调用外部接口。本来一切正常的,可是在发送post请求上传数据给服务端时,服务端返回错误信息:获取的JSON请求是乱码的。

因为请求的 JSON 里面包含了中文,所以一开始我把思路锁定在了编码问题,这样就走进了死胡同。在把tomcat、JDK、请求头的 header 中的 Content-Type 全都排查了一遍后,确认都是utf-8编码呀,

为什么还会出现乱码?熟练地打开了百度,但是一眼望去都是各种教你改 http 请求头的,或者如下:

DataOutputStream out = null;
out = new DataOutputStream(connection.getOutputStream());
//out.writeBytes(content);
out.write(content.getBytes());

把 out.writeBytes(content) 换成 out.write(content.getBytes()) ,因为 java 里的 char 类型是16位(2个字节)的,一个 char 可以存储一个中文字符,在将其转换为 byte(1个字节)后高8位会丢失,这样就无法将中文字符串完整的输出到字节输出流中。所以在可能有中文字符输出的地方最好先将字符串转换为字节数组,然后再通过 write() 写入字节输出流。

但是,这种方法只对有的人的问题生效,没有解决我的问题。直到我看到了这篇博客 https://blog.csdn.net/hwj3747/article/details/53635539

PrintWriter out = null;
out = new PrintWriter(new OutputStreamWriter(connection.getOutputStream(),"utf-8"));
out.println(content);

思路是用字符流代替字节流进行传输,因为我们传入的JSON字符串是纯字符。这样就完美避开了用字节流传输包含中文的字符串可能存在的各种转化问题。

总结:因为长期在写业务代码,所以对Java底层流机制非常生疏了。

HttpUrlConnection流传输问题(正确传输包含中文的JSON字符串)的更多相关文章

  1. PHP:JSON字符串转换为中文,中文转换为JSON字符串

    /** * 中文转换为JSON字符串 * @param $chinese_str 中文:可以包含中文字母数字 * @return string */ function json_encode($chi ...

  2. subprocess.Popen指令包含中文导致乱码问题解决

    其实解决起来非常简单,如果了解到Windows中文系统编码为GB2312的话 只需将你包含中文的指令字符串编码为GB2312即可 cmd = u'cd 我的文档' cmd.encode('gb2312 ...

  3. C# 的 WCF文章 消息契约(Message Contract)在流(Stream )传输大文件中的应用

    我也遇到同样问题,所以抄下做MARK http://www.cnblogs.com/lmjq/archive/2011/07/19/2110319.html 刚做完一个binding为netTcpBi ...

  4. 【计算机网络】-传输层-Internet传输协议-TCP

    [计算机网络]-传输层-Internet传输协议-TCP TCP介绍 在不可靠的互联网上提供一个可靠的端到端字节流 面向连接的.可靠的.端到端的.基于字节流的传输协议 TCP位置 TCP服务模型 应用 ...

  5. 【性能测试】:LR中解决接口请求中包含中文字符,服务器不识别的问题

    在LR中,直接写的接口请求,如果请求字段包含中文字段,服务器会不识别,这个时候就要用到lr_convert_string_encoding这个函数: 具体用法: lr_convert_string_e ...

  6. LR中解决接口请求中包含中文字符,服务器不识别的问题

    在LR中,直接写的接口请求,如果请求字段包含中文字段,服务器会不识别,这个时候就要用到lr_convert_string_encoding这个函数: 具体用法: lr_convert_string_e ...

  7. 使用WCF传输DataTable:DataTable和Xml格式的字符串相互转换(C#)

    背景:项目中要用到客户端向服务端传数据,使用WCF,绑定webHttpBinding,做了一个小例子. 业务逻辑简介:客户端在a表中添加了几条数据,从SQL Server数据库直接取出新添加的数据(D ...

  8. HttpURLConnection发送POST请求(可包含文件)

    import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io. ...

  9. am start的总结,-d参数的总结,以及python中传递内容包含中文及特殊字符&的解决方案

    一.am start的内容的整理 主要包含以下内容:am start的常规操作及参数的含义,-d 参数的含义,以及如何在APK中设置参数获取 使用命令如下:adb shell am start -n ...

随机推荐

  1. vue路由请求 router

    创建一个Router.js文件 // 路由请求//声明一个常量设置路菜单// import Vue from "vue/types/index";import Vue from ' ...

  2. Spring Boot:快速入门

    上一篇讲述什么是Spring Boot,这一篇讲解怎么使用IDE工具快速搭建起来独立项目. 一.构建方式 快速搭建项目有三种方式,官方也有答案给到我们: 二.构建前准备 想要使用IDE运行起来自己的S ...

  3. linux配制DNS服务器基本能功能

    1.环境 Centos 6.5 bind 关闭防火墙和SELINUX 2.安装bind服务软件 yum -y install bind 3.配制主配制文件/etc/name.conf options ...

  4. EL有11个隐含对象

    EL有11个隐含对象: 隐含对象                    类型                                             说明                ...

  5. linux 命令 jps 和 goassess

    jps (Java Virtual Machine Process Status Tool)  是java提供的一个显示当前所有java进程pid的命令,适合在linux/unix平台上简单察看当前j ...

  6. 2018-2019-2 网络对抗技术 20165305 Exp2 后门原理与实践

    常用后门工具 一.Windows获得Linux Shell 在Windows下使用ipconfig查看本机IP 使用ncat.exe程序监听本机的5305端口 在Kali环境下,使用nc指令的-e选项 ...

  7. svn基础了解

    Apache Subversion 通常被缩写成 SVN,是一个开放源代码的版本控制系统 Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的 ...

  8. javascript声明变量

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. centos6.9系列LNMP环境的安装

    一.Nginx 1.先解决Nginx的依赖关系: yum install -y pcre-devel openssl-devel 2.安装wget:sudo yum -y install wget 3 ...

  10. 初试fiddler

    1.tools->Options->HTTPS勾:Decrypt HTTPS traffic //勾:Ignore server certificate errors(unsafe) // ...