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

标签 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 代码(或任何其他响应代码),如何才能返回服务器响应?

最佳答案

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

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。

关于java - 即使使用错误的 http 代码 403、404 等,也可以使用 HttpUrlConnection 检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36102347/

相关文章:

使用从 URLConnection 读取的值的 Java If 语句不起作用

java - Guava 输入/输出供应商和 URLConnection

java - 如何使用 URLConnection 上传二进制文件

java - 如何在我的自定义日期和时间中设置通知

java - 如何在heroku java示例应用程序中将java对象作为json返回

java - .zip 方法中的 Observable 数量是否有限制?

java - 请求/响应对的持久 HTTPUrlConnections 数量

android - HttpURLConnection:java.lang.IllegalStateException:已经连接

java - 将参数从 java 类传递到 servlet

java - 似乎无法在 Java 中读取 .txt