即使使用错误的http代码403. 404等,也可以使用HttpUrlConnection检索数据

时间:2016-03-19 13:28:35

标签: java httpurlconnection urlconnection

我有以下方法可以正常工作,但是当服务器返回403代码时会抛出异常,导致该方法永远不会返回服务器响应。

public String ping(String lat, String lon)
{
    StringBuffer response = null;
    try
    {
        String url = "https://api.mysite.com";
        URL urlObj = new URL(url);
        HttpsURLConnection con = null;
        if (useProxy)
        {
            con = (HttpsURLConnection) urlObj.openConnection(proxy);
        }
        else
        {
            con = (HttpsURLConnection) urlObj.openConnection();
        }

        // add reuqest header
        con.setRequestMethod("POST");
        con.setRequestProperty("User-Agent", USER_AGENT);
        con.setRequestProperty("Content-Type", "application/json; charset=utf-8");
        con.setRequestProperty("Host", urlObj.getHost());
        con.setRequestProperty("Connection", "Keep-Alive");
        // con.setRequestProperty("Accept-Encoding", "gzip");

        String urlParameters = "{\"lat\":" + lat + ",\"lon\":" + lon + "}";

        // Send post request
        con.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(con.getOutputStream());
        wr.writeBytes(urlParameters);
        wr.flush();
        wr.close();

        int responseCode = con.getResponseCode();
        // System.out.println("\nSending 'POST' request to URL : " + url);
        // System.out.println("Post parameters : " + urlParameters);
        // System.out.println("Response Code : " + responseCode);

        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String inputLine;
        response = new StringBuffer();

        while ((inputLine = in.readLine()) != null)
        {
            response.append(inputLine);
        }
        in.close();

        // print result
        // System.out.println(response.toString());
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    return response.toString();
}

无论服务器返回什么内容,即使服务器以403代码(或任何其他响应代码)响应,我怎样才能返回服务器响应?

1 个答案:

答案 0 :(得分:1)

您只需添加if块即可使代码更加健壮,如下所示:

public String ping(String lat, String lon)
{
    StringBuffer response = null;
    try
    {
        String url = "https://api.mysite.com";
        URL urlObj = new URL(url);
        HttpsURLConnection con = null;
        if (useProxy)
        {
            con = (HttpsURLConnection) urlObj.openConnection(proxy);
        }
        else
        {
            con = (HttpsURLConnection) urlObj.openConnection();
        }

        // add reuqest header
        con.setRequestMethod("POST");
        con.setRequestProperty("User-Agent", USER_AGENT);
        con.setRequestProperty("Content-Type", "application/json; charset=utf-8");
        con.setRequestProperty("Host", urlObj.getHost());
        con.setRequestProperty("Connection", "Keep-Alive");
        // con.setRequestProperty("Accept-Encoding", "gzip");

        String urlParameters = "{\"lat\":" + lat + ",\"lon\":" + lon + "}";

        // Send post request
        con.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(con.getOutputStream());
        wr.writeBytes(urlParameters);
        wr.flush();
        wr.close();

        int responseCode = con.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK) {
            response = readResponse(con.getInputStream());

        } else {
           response = readResponse(con.getErrorStream());
        }      

        // print result
        System.out.println(response.toString());
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    return response.toString();
}

private StringBuffer readResponse(InputStream in) {
   BufferedReader in = new BufferedReader(new InputStreamReader(in));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null)
        {
            response.append(inputLine);
        }
        in.close();

    return response;

}

HTH。