关于java.io.IOException: Server returned HTTP response code: 400 for URL报错和string.getBytes()字符集

400 请求出错:由于语法格式有误,服务器无法理解此请求
总论:这种错误应该会有很多原因,这里指出的是因为字符集编码的原因导致400,主要代码:向服务器发送请求传输json参数用的是out.write(json.getBytes())(读取的是操作系统的字符集,如果操作系统与部署项目的服务器不同则报错);改为out.writeChars(json);或out.write(json.getBytes(服务器编码))即可。如下代码16行

 1             //创建连接
 2             URL url = new URL(u);
 3             HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 4             connection.setDoOutput(true);
 5             connection.setDoInput(true);
 6             connection.setRequestMethod("POST");
 7             connection.setRequestProperty("connection", "keep-alive");
 8             connection.setConnectTimeout(30000);
 9             connection.setReadTimeout(30000);
10             connection.setUseCaches(false);
11             connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
12             connection.connect();
13             // POST请求
14              out = new DataOutputStream(connection.getOutputStream());
15             String json = message.toString();
16             out.writeChars(json); // 这行是关键我之前写的是 out.write(json.getBytes());
17             System.out.println(json);
18             out.flush();
19             // 读取响应
20             reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
21             String lines;
22             StringBuffer sb = new StringBuffer("");
23             while ((lines = reader.readLine()) != null) {
24                 lines = new String(lines.getBytes(), "utf-8");
25                 sb.append(lines);
26             }
27             JSONObject jsStr =JSONObject.fromObject(sb.toString());
28             //获取响应值,判断是否验证通过
29             String code = (String) jsStr.get("code");
30             String msg=(String) jsStr.get("msg");
31             System.out.println("code:"+code+",msg:"+msg);
32             //接口返回验证数据是否通过
33                 if("0".equals(code)){
34                     result = "success";
35                 } else{
36                     result = "fail";
37                     System.out.println("下发出错:错误原因为" + msg + "下发内容为:" + json);
38                 }
39             reader.close();
40             // 断开连接
41             connection.disconnect();
42             

这其中也经过一些波折,比如在自己的eclipse上运行正常,部署到服务器上就不行了,json数据是一样的但是因为自己本地的服务器和部署项目的服务器编码不同,而产生这种错误。

在解决问题时百度做了很久,因为不适应我的项目做了一些错误的更改,比如找空格,在我的json中是存在空格的,但是我用的是post提交,并不会有影响。还有说要双引号转成单引号的,这让原本本地不报错的程序也报错了,可是我还傻傻的开心以为是引号的事。还有让转json编码的,但是无论json转成什么格编码out.write(json.getBytes()) 传输的时候编码格式没有设定,还是去默认操作系统的编码还是不会改对

时间: 2024-08-26 06:33:37

关于java.io.IOException: Server returned HTTP response code: 400 for URL报错和string.getBytes()字符集的相关文章

java.io.IOException: Server returned HTTP response code: 411 for URL

今日调用一post方式提交的http接口,此接口在测试环境ip调用时无问题,但在生产环境通过域名调用时一直报如下错误: java.io.IOException: Server returned HTTP response code: 411 for URL 百度之后得到:在调用时,添加如下两行代码即可,今行文以记之: /*解决411*/ httpConnection.setRequestProperty("Content-Length","0"); DataOutp

Java服务端获取360token时候报错:Server returned HTTP response code: 400 for URL

http://book.zhulang.com/299056/736640.html http://book.zhulang.com/299056/736641.html http://book.zhulang.com/299056/736643.html http://book.zhulang.com/299056/736642.html http://book.zhulang.com/299056/736644.html http://book.zhulang.com/299056/7366

异常: http://www.ly.com/news/visa.html: java.io.IOException: unzipBestEffort returned null

nutch 运行时异常: http://www.ly.com/news/visa.html: java.io.IOException: unzipBestEffort returned null 参考:http://www.tuicool.com/articles/faUB73 此页面采用这个是一个分段传输,而nutch爬虫则默认采用了非分段式处理,导致构造GZIP时出错,从而影响了后面的GZIP解压失败. 是否是分段传输可以在Http headers里面看到,如果是分段传输则有:transfe

java.io.IOException: Stream closed 异常的原因和处理

java.io.IOException: Stream closed 多个线程索引同一个input  stream,当某一个thread在执行完之后,把这个inputstream关闭了:而此时正在从这个input  stream流中读取信息的线程就会抛出  java.io.IOException:  Stream  closed  异常. 终于找到这个异常的根源所在,原来是两个页面同时调用一个jsp,这个jsp中的内建对象out在执行out.close()时发生的异常,也就是当某一个thread

hadoop错误FATAL org.apache.hadoop.hdfs.server.namenode.NameNode Exception in namenode join java.io.IOException There appears to be a gap in the edit log

错误: FATAL org.apache.hadoop.hdfs.server.namenode.NameNode Exception in namenode join java.io.IOException There appears to be a gap in the edit log 原因: namenode元数据被破坏,需要修复 解决:     恢复一下namenode hadoop namenode –recover 一路选择c,一般就OK了 如果,您认为阅读这篇博客让您有些收获,不

Caused by: java.io.EOFException: Can not read response from server.

1.错误描述 The last packet successfully received from the server was 76,997 milliseconds ago. The last packet sent successfully to the server was 78,995 milliseconds ago. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.ref

Caused by: java.io.IOException: 您的主机中的软件中止了一个已建立的连接。

异常详情 2017-07-16 10:55:26,218 ERROR [500.jsp] - java.io.IOException: 你的主机中的软件中止了一个已建立的连接. org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接. at org.apache.catalina.connector.OutputBuffer.realWriteBytes(Output

错误号org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe

在说这个错误之前,我先介绍下背景,我们项目用的是SpringBoot框架,集成Hprose+spring+mybatis,Hprose是什么,可以参考我上篇对Hprose的一个简单介绍.当前项目业务是抓取一个网站近5年的足球篮球的赔率数据.所以这是个按照日期进行的一个大循环.介于Hprose特性,Hprose服务端的处理时间会特别长,这是个重点. 在项目上线抓取数据时,linux环境下,我们的程序出现了这样一个错误,如下: 2016-06-16 12:47:52.190 WARN 10150 -

Caused by: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。

org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接. at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:321) at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:284) at o