EOFException and FileNotFoundException in HttpURLConnection getInputStream()

我的梦境 提交于 2019-12-11 08:57:17

问题


When trying to connect to http://ws.audioscrobbler.com/2.0/ with post data using HttpURLConnection, I get (randomly)

EOFException

or

FileNotFoundException: http://ws.audioscrobbler.com/2.0/

on my Nexus 4 running Android 4.2.2.

Anybody can help?

EDIT

I upgraded to 4.3: same issue.

public InputStream getData(String url_str, List<NameValuePair> postData) {

    Map<String, Object> response = new HashMap<String, Object>();

    InputStream is = null;
    HttpURLConnection conn = null;

    try {

        URL url = new URL(url_str);

        conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(CONNECTION_TIMEOUT);
        conn.setConnectTimeout(READ_TIMEOUT);
        conn.setRequestMethod("POST");
        conn.setDoInput(true);                      

        if(postData != null){

            conn.setDoOutput(true);

            OutputStream os = conn.getOutputStream();
            BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os, "UTF-8"));
            writer.write(getQuery(postData));
            writer.close();
            os.close();
        }


        // Starts the query

        conn.connect();


        // Get and return response

        is = conn.getInputStream();             

        return is;

    } catch (IOException e) {

        // ...

    } finally {

        if(conn != null){
            conn.disconnect();
        }

        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } 
    }
}


private String getQuery(List<NameValuePair> params) throws UnsupportedEncodingException
{
    StringBuilder result = new StringBuilder();
    boolean first = true;

    for (NameValuePair pair : params)
    {
        if (first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
    }

    return result.toString();
}

回答1:


I checked conn.getResponseCode() and get a 403. The exception might be due to that.




回答2:


okay try this it might help

public void httppost()
{

    URL="Your URL";

    InputStream is = null;

    //Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();

        namevaluepair.add(new BasicNameValuePair("name1",value1));
        namevaluepair.add(new BasicNameValuePair("name2",value2));


        String enc_url = urlEncode(URL);
        HttpPost httpPost = new HttpPost(enc_url );

         httpPost.setEntity(new UrlEncodedFormEntity(namevaluepair));

         HttpResponse httpResponse = httpClient.execute(httpPost);
         HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();            

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        is.close();
        String response = sb.toString();

    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

}



回答3:


You need to specify content-length.

 if(postData != null){
                byte[] requestContent = getQuery(postData);
                conn.setDoOutput(true);
// Specify content type
                conn.setRequestProperty("Content-Type", mRequestContentType);
                conn.setRequestProperty("Content-Length",
                    Integer.toString(requestContent.length));
                conn.setFixedLengthStreamingMode(requestContent.length);
                OutputStream os = conn.getOutputStream();
                BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os, "UTF-8"));
                writer.write(requestContent);
                writer.close();
                os.close();
            }



回答4:


For Android version prior to 4.4, I think you need to add:

conn.setRequestProperty("connection", "close");

EOFException is known bug that was originally reported here: https://github.com/google/google-http-java-client/issues/213



来源:https://stackoverflow.com/questions/17967731/eofexception-and-filenotfoundexception-in-httpurlconnection-getinputstream

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!