4

我想从我的 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 可能根本没有回复。但是,为什么当我从独立应用程序调用它时它会回复?我真的不明白......我得到了这个例外:

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?谢谢!

4

3 回答 3

4

这可能是因为Content-Length未设置标头而发生的。并且因为没有发送 POST 请求正文的结束。服务器正在等待直到超时以结束流。

您应该尝试以下两件事以使其正常工作:

  • 在执行之前使用请求正文大小设置内容长度标头connect()
  • 尝试关闭connection.getOutputStream().close()发送 POST 请求结束的那个。
于 2012-07-03T11:34:40.957 回答
2

查看您正在点击的网址。我遇到了同样的问题,经过多次回归后才知道生成的 url 比被击中有一个空格,这是问题的原因,通过替换来解决它space你也可以通过调用记住underscore
它来将其编码为 urlURIEncoder.encode(uri);只有在 is 之后的 uri 部分?应该被编码。

于 2012-12-12T09:12:44.077 回答
0

在我们的例子中,它是 tomcat 设置为 http2 协议(默认情况下已删除强制使用 http2 协议, <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />server.xmltomcatconfig文件夹中删除,但客户端使用 http1.1,java 也需要使用证书(keyimport 工具)签名,所以根本问题是有点棘手……

于 2019-04-16T15:43:51.550 回答