1.问题的出现:
线下开发时候使用httpUrlConnction测试调用远程接口一点问题都没有,可是打包后放到线上去后出现400的错误一样的参数在线下能够调试,放在线上就不行了。java
通常报400说明接口接收到了错误的参数,因为是远程调用别人的服务器接口看不到那边的日志,咱们这边只有一个400 ,信息提示说对面json解析错误。那么咱们一样的参数为何放在线上就会出问题, 缘由多是咱们的服务器的环境或者编码不对。
修改参数的编码,可是无论对json字符串怎么编码,都无论用,最后发现要再读入流的时候对参数进行编码才能够,编码的地方不对
/** * 调用远程接口 * @param url 接口的url路径 * @param pamare List的json数组 * @return */ public static String sendPost(String url, String pamare) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { // 打开和URL之间的链接 HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); // 设置通用的请求属性 conn.setRequestMethod("POST"); conn.setConnectTimeout(4 * 1000); conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8"); // 发送POST请求必须设置以下两行 conn.setDoOutput(true); conn.setDoInput(true); // 获取URLConnection对象对应的输出流 out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8")); out.println(pamare); // flush输出流的缓冲 out.flush(); InputStream is = null; if (conn.getResponseCode() >= 400) { is = conn.getErrorStream(); } else { is = conn.getInputStream(); } // 定义BufferedReader输入流来读取URL的响应 in = new BufferedReader(new InputStreamReader(is,"utf-8")); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("发送 POST 请求出现异常!" + e); e.printStackTrace(); } //使用finally块来关闭输出流、输入流 finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; }