您现在的位置是:网站首页 > 代码编程 > JAVA开发JAVA开发

【原】发送http请求,报错:Cannot write output after reading input.

不忘初心 不忘初心 2019-03-12 围观() 评论() 点赞() JAVA开发

简介:最近对接一个第三方,有专门的系统来对接,我们直接对接内部的系统即可,但是调用接口时,发现一直报错:Cannot write output after readi

最近对接一个第三方,有专门的系统来对接,我们直接对接内部的系统即可,但是调用接口时,发现一直报错:Cannot write output after reading input,大概意思是不能在读取了输入流之后去写输出流。

起初还以为是对接第三方报错了,仔细检查一番,竟然是同事的代码写的有问题,开启了两次输出流

错误信息如下:

2019-03-12 11:51:03,717 ERROR TongDunManager: [ApiInvoker] invoke throw exception, details: java.net.ProtocolException: Cannot write output after reading input.
        at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1330)
        at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1309)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:259)
        at com.st.gateway.project.biz.tongdun.TongDunManager.invoke(TongDunManager.java:175)
        at com.st.gateway.project.biz.tongdun.TongDunManager.ktpTaskQuery(TongDunManager.java:99)
        at com.st.gateway.project.web.rest.TongDunCallbackController.lambda$ktp$0(TongDunCallbackController.java:32)
        at com.st.gateway.common.core.biz.RestBusinessTemplate.doExecute(RestBusinessTemplate.java:66)
        at com.st.gateway.common.core.biz.RestBusinessTemplate.execute(RestBusinessTemplate.java:23)
        at com.st.gateway.project.web.rest.TongDunCallbackController.ktp(TongDunCallbackController.java:27)
        at com.st.gateway.project.web.rest.TongDunCallbackController$FastClassBySpringCGLIB$78ded699.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
        at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
        at com.st.gateway.common.base.aop.ApiDigestInterceptor.invoke(ApiDigestInterceptor.java:31)
        at sun.reflect.GeneratedMethodAccessor110.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)

错误代码片段:

conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setConnectTimeout(1000);
conn.setReadTimeout(3000);
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.getOutputStream().write(postBody.toString().getBytes());
conn.getOutputStream().flush();
int responseCode = conn.getResponseCode();
if (responseCode != 200) {
    return null;
}

错误的地方,我用红色框起来

发送http请求,报错:Cannot write output after reading input.

在开始没看代码之前,查阅了一些资料,资料中也有类似的问题,比如:在getOutputStream()之前执行getResponseCode(),这样也会有同样的错误。

更改之后的代码如下:

conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.setRequestMethod("POST");
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
os.write(postBody.toString().getBytes());
os.flush();
int responseCode = conn.getResponseCode();
if (responseCode != 200) {
    return null;
}

httphttpclientIO流

看完文章,有任何疑问,请加入群聊一起交流!!!

很赞哦! ()

文章评论

  • 请先说点什么
    人参与,条评论

请使用电脑浏览器访问本页面,使用手机浏览器访问本页面会导致下载文件异常!!!

雨落无影

关注上方公众号,回复关键字【下载】获取下载码

用完即删,每次下载需重新获取下载码

若出现下载不了的情况,请及时联系站长进行解决

站点信息

  • 网站程序:spring + freemarker
  • 主题模板:《今夕何夕》
  • 文章统计:篇文章
  • 标签管理标签云
  • 微信公众号:扫描二维码,关注我们