gpt4 book ai didi

java - HttpURLConnection 不读取整个响应

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:09:24 26 4
gpt4 key购买 nike

我使用 HttpURLConnection 执行 HTTP POST,但我并不总能得到完整的响应。我想调试这个问题,但是当我逐行检查它时,它就起作用了。我认为这一定是一个时间问题,所以我添加了 Thread.sleep,它确实使我的代码工作,但这只是一个临时的解决方法。我想知道为什么会发生这种情况以及如何解决。这是我的代码:

public static InputStream doPOST(String input, String inputMimeType, String url, Map<String, String> httpHeaders, String expectedMimeType) throws MalformedURLException, IOException {

URL u = new URL(url);
URLConnection c = u.openConnection();
InputStream in = null;
String mediaType = null;
if (c instanceof HttpURLConnection) {

//c.setConnectTimeout(1000000);
//c.setReadTimeout(1000000);

HttpURLConnection h = (HttpURLConnection)c;
h.setRequestMethod("POST");
//h.setChunkedStreamingMode(-1);
setAccept(h, expectedMimeType);
h.setRequestProperty("Content-Type", inputMimeType);

for(String key: httpHeaders.keySet()) {
h.setRequestProperty(key, httpHeaders.get(key));

if (logger.isDebugEnabled()) {
logger.debug("Request property key : " + key + " / value : " + httpHeaders.get(key));
}

}

h.setDoOutput(true);
h.connect();

OutputStream out = h.getOutputStream();

out.write(input.getBytes());

out.close();

mediaType = h.getContentType();

logger.debug(" ------------------ sleep ------------------ START");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
logger.debug(" ------------------ sleep ------------------ END");

if (h.getResponseCode() < 400) {
in = h.getInputStream();
} else {
in = h.getErrorStream();
}
}
return in;

}

稍后我执行以下操作来读取输入流

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
while (is.available() > 0) {
bos.write(is.read());
}
is.close();

//is.read(bytes);
if (logger.isDebugEnabled()) {
logger.debug(" Response lenght is : " + is.available());
//logger.debug("RAW response is " + new String(bytes));
logger.debug("RAW response is " + new String(bos.toByteArray()));
}

它生成以下 HTTP header

POST /emailauthentication/ HTTP/1.1
Accept: application/xml
Content-Type: application/xml
Authorization: OAuth oauth_consumer_key="b465472b-d872-42b9-030e-4e74b9b60e39",oauth_nonce="YnDb5eepuLm%2Fbs",oauth_signature="dbN%2FWeWs2G00mk%2BX6uIi3thJxlM%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1276524919", oauth_token="", oauth_version="1.0"
User-Agent: Java/1.6.0_20
Host: test:6580
Connection: keep-alive
Content-Length: 1107

在其他帖子中,建议使用

关闭 keep-alive
http.keepAlive=false

系统属性,我试过了,标题变成了

POST /emailauthentication/ HTTP/1.1
Accept: application/xml
Content-Type: application/xml
Authorization: OAuth oauth_consumer_key="b465472b-d872-42b9-030e-4e74b9b60e39", oauth_nonce="Eaiezrj6X4Ttt0", oauth_signature="ND9fAdZMqbYPR2j%2FXUCZmI90rSI%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1276526608", oauth_token="", oauth_version="1.0"
User-Agent: Java/1.6.0_20
Host: test:6580
Connection: close
Content-Length: 1107

连接 header 是“关闭”,但我仍然无法阅读整个响应。知道我做错了什么吗?

最佳答案

我认为你的问题出在这一行:

while (is.available() > 0) {

根据 javadoc,available 不会阻塞并等待所有数据可用,因此您可能会收到第一个数据包,然后它会返回 false。从 InputStream 读取的正确方法是这样的:

int len;
byte[] buffer = new byte[4096];
while (-1 != (len = in.read(buffer))) {
bos.write(buffer, 0, len);
}

当输入流中没有任何内容或连接关闭时,Read 将返回 -1,同时它会阻塞并等待网络。读取数组的性能也比使用单个字节高得多。

关于java - HttpURLConnection 不读取整个响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3038176/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com