https://stackoverflow.com/questions/11413028/cannot-write-output-after-reading-input
改造http对第三方请求时出现 Cannot write output after reading input
URL url;
OutputStreamWriter osw = null;
try {
url = new URL(targetUrl);
con = (HttpURLConnection) url.openConnection();
if (!StringUtils.isBlank(cookieStr)) {
con.setRequestProperty("Cookie", cookieStr);
}
con.setRequestMethod(httpMethod);
con.setDoOutput(true);
con.setDoInput(true);
con.setUseCaches(false);
con.setRequestProperty("Content-Type", contentType);
int readTimeOut=Integer.parseInt(CoreConfig.getValueWithDefaultV("config.properties", "HTTPConTimeOut4PebCore","3000"));
log.debug("超时设定为:"+readTimeOut);
con.setConnectTimeout(readTimeOut);
con.setReadTimeout(readTimeOut);
con.connect();
if(con!=null && 200 !=con.getResponseCode()){
throw new CoreException("客户端连接失败 返回码 ResponseCode:"+con.getResponseCode());
}else{
osw = new OutputStreamWriter(con.getOutputStream(), reqCharsetName);//打开输出流进行输出
osw.write(data);
osw.flush();
}
} catch (Exception e) {
log.error("往目标URL发送POST请求失败!" + targetUrl, e);
throw new CoreException("往目标URL【" + targetUrl + "】发送POST请求失败!" + e.getMessage(), e);
} finally {
if (osw != null) {
try {
osw.close();
} catch (IOException e) {
log.error("流关闭失败,请检查环境!", e);
}
}
if (con != null) {
con.disconnect();
log.debug("关闭HTTP连接!");
}
}
return con;
加上红色内容后,导致访问的返回码一直是400,但是通过curl 拼接方式验证后,接口正常,
con.getResponseCode()调用了之后
The HTTP protocol is based on a request-response pattern: you send your request first and the server responds. Once the server responded, you can't send any more content, it wouldn't make sense. (How could the server give you a response code before it knows what is it you're trying to send?)
So when you call server.getResponseCode()
, you effectively tell the server that your request has finished and it can process it. If you want to send more data, you have to start a new request.
Looking at your code you want to check whether the connection itself was successful, but there's no need for that: if the connection isn't successful, an Exception
is thrown by server.connect()
. But the outcome of a connection attempt isn't the same as the HTTP response code, which always comes after the server processed all your input.
意思是说提前调用 getResponseCode()方法,表示该请求已经结束了!
以上所述,对响应码的判断去掉,功能可以正常请求访问