gpt4 book ai didi

java - HttpURLConnection.getResponseCode() 在第二次调用时返回 -1

转载 作者:IT老高 更新时间:2023-10-28 21:08:24 26 4
gpt4 key购买 nike

当我使用的库 (signpost 1.1-SNAPSHOT) 与远程服务器建立两个连续连接时,我似乎在 Android 1.5 上遇到了一个特殊问题。第二个连接总是以 -1

HttpURLConnection.getResponseCode() 失败

这是一个暴露问题的测试用例:

// BROKEN
public void testDefaultOAuthConsumerAndroidBug() throws Exception {
for (int i = 0; i < 2; ++i) {
final HttpURLConnection c = (HttpURLConnection) new URL("https://api.tripit.com/oauth/request_token").openConnection();
final DefaultOAuthConsumer consumer = new DefaultOAuthConsumer(api_key, api_secret, SignatureMethod.HMAC_SHA1);
consumer.sign(c); // This line...
final InputStream is = c.getInputStream();
while( is.read() >= 0 ) ; // ... in combination with this line causes responseCode -1 for i==1 when using api.tripit.com but not mail.google.com
assertTrue(c.getResponseCode() > 0);
}
}

基本上,如果我签署请求然后使用整个输入流,下一个请求将失败,结果代码为 -1。如果我只从输入流中读取一个字符,似乎不会发生故障。

请注意,任何 url 都不会发生这种情况 - 只是特定的 url,例如上面的那个。

另外,如果我改用 HttpClient 而不是 HttpURLConnection,一切正常:

// WORKS
public void testCommonsHttpOAuthConsumerAndroidBug() throws Exception {
for (int i = 0; i < 2; ++i) {
final HttpGet c = new HttpGet("https://api.tripit.com/oauth/request_token");
final CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(api_key, api_secret, SignatureMethod.HMAC_SHA1);
consumer.sign(c);
final HttpResponse response = new DefaultHttpClient().execute(c);
final InputStream is = response.getEntity().getContent();
while( is.read() >= 0 ) ;
assertTrue( response.getStatusLine().getStatusCode() == 200);
}
}

我找到了references在其他地方似乎是类似的问题,但到目前为止还没有解决方案。如果它们确实是同一个问题,那么问题可能不在于路标,因为其他引用文献没有提及它。

有什么想法吗?

最佳答案

尝试设置此属性,看看是否有帮助,

http.keepAlive=false

当 UrlConnection 不理解服务器响应并且客户端/服务器不同步时,我看到了类似的问题。

如果这解决了您的问题,您必须获取 HTTP 跟踪以准确了解响应的特殊之处。

编辑:这个变化只是证实了我的怀疑。它不能解决你的问题。它只是隐藏了症状。

如果第一个请求的响应是 200,我们需要跟踪。我通常使用 Ethereal/Wireshark 来获取 TCP 跟踪。

如果您的第一个响应不是 200,我确实在您的代码中看到了问题。使用 OAuth 时,错误响应 (401) 实际上会返回数据,其中包括 ProblemAdvice、Signature Base String 等以帮助您调试。您需要从错误流中读取所有内容。否则,它将混淆下一个连接,这就是 -1 的原因。以下示例向您展示了如何正确处理错误,

public static String get(String url) throws IOException {

ByteArrayOutputStream os = new ByteArrayOutputStream();
URLConnection conn=null;
byte[] buf = new byte[4096];

try {
URL a = new URL(url);
conn = a.openConnection();
InputStream is = conn.getInputStream();
int ret = 0;
while ((ret = is.read(buf)) > 0) {
os.write(buf, 0, ret);
}
// close the inputstream
is.close();
return new String(os.toByteArray());
} catch (IOException e) {
try {
int respCode = ((HttpURLConnection)conn).getResponseCode();
InputStream es = ((HttpURLConnection)conn).getErrorStream();
int ret = 0;
// read the response body
while ((ret = es.read(buf)) > 0) {
os.write(buf, 0, ret);
}
// close the errorstream
es.close();
return "Error response " + respCode + ": " +
new String(os.toByteArray());
} catch(IOException ex) {
throw ex;
}
}
}

关于java - HttpURLConnection.getResponseCode() 在第二次调用时返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1440957/

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