Java HttpURLConnection模拟请求Rest接口解决中文乱码问题

转自:http://blog.csdn.net/hwj3747/article/details/53635539

Java使用HttpURLConnection请求rest接口的时候出现了POST请求出现中文乱码的问题,经过把传入的String通过多种方法进行编码发现都解决不了,如下:

 String teString=new String("你好".getBytes("ISO-8859-1"),"UTF-8");

网上HttpURLConnection的请求通常是这样子的:

public static String PostRequest(String URL,String obj) {
        String jsonString="";
        try {
            //创建连接
            URL url = new URL(URL);
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setRequestMethod("POST"); //设置请求方法
            connection.setRequestProperty("Charsert", "UTF-8"); //设置请求编码
            connection.setUseCaches(false);
            connection.setInstanceFollowRedirects(true);
            connection.setRequestProperty("Content-Type",
                    "application/json"); 

            connection.connect(); 

            //POST请求
            DataOutputStream out = new DataOutputStream(
                    connection.getOutputStream()); //关键的一步

            out.writeBytes(obj);
            out.flush();
            out.close(); 

            // 读取响应
            if (connection.getResponseCode()==200) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String lines;
                StringBuffer sb = new StringBuffer("");
                while ((lines = reader.readLine()) != null) {
                    lines = new String(lines.getBytes(), "utf-8");
                    sb.append(lines);
                }
                jsonString=sb.toString();
                reader.close();
            }//返回值为200输出正确的响应信息

            if (connection.getResponseCode()==400) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
                String lines;
                StringBuffer sb = new StringBuffer("");
                while ((lines = reader.readLine()) != null) {
                    lines = new String(lines.getBytes(), "utf-8");
                    sb.append(lines);
                }
                jsonString=sb.toString();
                reader.close();
            }//返回值错误,输出错误的返回信息
            // 断开连接
            connection.disconnect();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return jsonString;
    } 

需要注意的是返回值为200时,connection.getInputStream()才有值,返回值为400时connection.getInputStream()是空的,connection.getErrorStream()才有值。

以上是大多数网上博客文章的写法,但是我用这种方法遇到了中文乱码的问题。在out.writeBytes(obj);这一步无论对obj这个字符串怎样转换,得到的结果还是乱码,最终得到的解决方法是这样的:

把这个部分代码,

 DataOutputStream out = new DataOutputStream(
                    connection.getOutputStream()); //关键的一步
            out.writeBytes(obj); 

改成

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

解决。

时间: 2024-10-31 00:16:31

Java HttpURLConnection模拟请求Rest接口解决中文乱码问题的相关文章

java web过滤器实际应用(解决中文乱码 html标签转义功能 敏感字符过滤功能)

转载地址:http://www.cnblogs.com/xdp-gacl/p/3952405.html 在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求. 一.Decorator设计模式 1.1.Decorator设计模式介绍 当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强: 编写子类,覆盖需增强的

java解压多目录Zip文件(解决中文乱码问题)--转载

原文地址:http://zhangyongbo.iteye.com/blog/1749439 import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import org.apache.tools.zi

java如果模拟请求重启路由器(网络爬虫常用),还有java如何下载图片

我们如果在公司或家里使用网络爬虫去抓取自己索要的一些数据的时候,常常对方的网站有defence机制,会给你的http请求返回500错误,只要是相同IP就请求不到数据,这时候我们只能去重启路由器,这样IP地址会改变,网络爬虫就能正常工作了 下面是通过发送Socket请求来模拟路由器的重启指令: protected void rebotadsl() { try { BufferedOutputStream sender = null; String url = baseURL; URL target

Java底层代码实现单文件读取和写入(解决中文乱码问题)

需求: 将"E:/data/车站一次/阿坝藏族羌族自治州.csv"文件中的内容读取,写入到"E:/data//车站一次.csv". 代码: public class FileOpe { public static void main(String[] args) { sigle(); } public static void sigle(){ BufferedReader bufr = null; BufferedWriter bufw = null; try {

在线HTTP POST/GET模拟请求api接口http请求测试工具https://post.jsonin.com/

在线HTTP POST/GET模拟请求api接口http请求测试工具 在线POST/GET接口测试工具https://post.jsonin.com/ Json在线解析及格式化校验工具 https://jsonin.com/ 原文地址:https://www.cnblogs.com/daxiangxm/p/postjson.html

javaEE:day2-servlet生命周期、提交解决中文乱码、tomcat加载jar包或类文件的顺序

servlet生命周期 生命周期简介: servlet在服务器第一次被请求的时候new出来,并初始化(即init())再调用service方法.这个实在服务器中new出来,然后用HashMap加的,与客户端无关.客户端之后访问只调用这个servlet的service方法. 具体分为4步: 1 构造方法 :服务器在被客户端第一次请求的时候运行 仅在服务器中运行一次 2 init方法:客户端第一次访问服务器的时候在服务器中进行初始化 仅一次.并且可以通过config参数在 web.xml中通过(ke

[原创]java WEB学习笔记17:关于中文乱码的问题 和 tomcat在eclipse中起动成功,主页却打不开

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

Struts用Filter过滤器解决中文乱码

(1)首先看一下项目的结构:(就是com.lc.filter下的MyFilter.java) (2)其中MyFilter.java的代码如下: package com.lc.filter; //ctrl+shift+o 导入各种包 即可 /** * 过滤器的使用方法 * 在创建类的时候 要用到接口Filter * 要自己在web.xml文件中配置过滤器 * @author xuliugen * */ public class MyFilter extends HttpServlet implem

Javaweb 使用Servlet技术改写用户登录 使用Filter技术解决中文乱码

先把实验3的jsp页面复制过来: WebContent->WEB-INF->lib下面的jar包8.0版本也要记得复制: Java Resources->src下的 cn.edu.henu.bean(User.java 用户数据库操作)和cn.edu.henu.util(DBConnection.java 数据库的连接操作)这两个包 <?xml version="1.0" encoding="UTF-8"?> <web-app x