我想从我的servlet调用一个servlet。我可以从一个独立的应用程序调用远程servlet,但我不能从我的servlet调用它(它在Glassfish上)。我使用完全相同的代码进行调用(我在最后一个代码行得到错误):
URL serverAddress = new URL(endpoint);
//Set up the initial connection
HttpURLConnection connection = (HttpURLConnection) serverAddress.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setReadTimeout(timeOut);
connection.setRequestProperty("Content-Type", "text/xml; charset=ISO-8859-1");
connection.connect();
OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
wr.write(requestBody);
wr.flush();
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
怀疑这段代码无法读取远程servlet的响应,因此servlet根本不会回复。但是,当我从standlone应用程序调用它时,为什么会回复?我真的不明白...... 我有这个例外:
java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:769)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:766)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1049)
有人有什么想法吗?是否有可能限制servlet不使用HttpURLConnection?谢谢!
答案 0 :(得分:4)
可能会发生这种情况,因为未设置Content-Length
标头。并且因为POST结束请求正文未发送。服务器最终等到流结束超时。
你应该试试这两件事才能让它发挥作用:
connect()
connection.getOutputStream().close()
。答案 1 :(得分:3)
查看您正在点击的网址。
我有同样的问题,经过多次回归后才知道生成的网址和被点击的网址中都有空格,这是导致问题的原因,通过将space
替换为underscore
来解决问题登记/>
您也可以通过调用URIEncoder.encode(uri);
将其编码为网址。请记住,只有?
之后的部分应该被编码。
答案 2 :(得分:0)
在我们的案例中,它是将tomcat设置为http2协议(默认情况下已删除强制为http2协议,
去掉
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
来自tomcat server.xml
文件夹中的config
,但是客户端使用的是http1.1,还需要使用证书(密钥导入工具)对java进行签名,因此潜在的问题有些棘手。...