开发者

URLConnection sometimes returns empty string response?

I'm making an http GET request. It works in about 70% of my attempts. For some reason, I sometimes get no response string from a successful connection. I just setup a button in my app which keeps firing the code below. One call might fail to reply with a string, the next call works fine:

private onButtonClick() {
    try {
        doit();
    } catch (Exception ex) {
        ...
    }
}   

public void doit() throws Exception {
    URL url = new URL("http://www.ex开发者_JS百科ample.com/service");

    HttpURLConnection connection = (HttpURLConnection)url.openConnection();
    connection.setDoInput(true);
    connection.setUseCaches(false); 
    connection.setAllowUserInteraction(false); 
    connection.setReadTimeout(30 * 1000);
    connection.setRequestProperty("Connection", "Keep-Alive"); 
    connection.setRequestProperty("Authorization", 
        "Basic " +  Base64.encode("username" + ":" + "password"));

    BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));

    String line = "";
    StringBuilder sb = new StringBuilder();
    while ((line = in.readLine()) != null) {
        sb.append(line);
    }
    in.close();

    connection.disconnect();

    // Every so often this prints an empty string!
    System.out.println(sb.toString());
}

am I doing something wrong here? It seems like maybe I'm not closing the connection properly from the last call somehow and the response gets mangled or something? I am also calling doit() from multiple threads simultaneously, but I thought the contents of the method are thread-safe, same behavior though,

Thanks

Thanks


That method looks fine. It's reentrant, so calls shouldn't interfere with each other. It's probably a server issue, either deliberate throttling or just a bug.

EDIT: You can check the status code with getResponseCode.


For checking ResponseCode:

        BufferedReader responseStream;
        if (((HttpURLConnection) connection).getResponseCode() == 200) {
            responseStream = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
        } else {
            responseStream = new BufferedReader(new InputStreamReader(((HttpURLConnection) connection).getErrorStream(), "UTF-8"));
        }

For empty content resposneCode is 204. So if u can get empty body just add one more "if" with 204 code.


We also came across with the similar scenario, I came across the following solution for this issue: - Setting up a user agent string on URLConnection object.

URLConnection conn = url.openConnection();
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)");

more details

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜