Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的读取错误响应体_Java_Http_Httpurlconnection - Fatal编程技术网

Java中的读取错误响应体

Java中的读取错误响应体,java,http,httpurlconnection,Java,Http,Httpurlconnection,在Java中,当HTTP结果为404范围时,此代码引发异常: URL url = new URL("http://stackoverflow.com/asdf404notfound"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.getInputStream(); // throws! 在我的例子中,我碰巧知道内容是404,但我仍然想阅读响应的主体 (在我的实际案例中,响应代码是403,但响应

在Java中,当HTTP结果为404范围时,此代码引发异常:

URL url = new URL("http://stackoverflow.com/asdf404notfound");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.getInputStream(); // throws!
在我的例子中,我碰巧知道内容是404,但我仍然想阅读响应的主体

(在我的实际案例中,响应代码是403,但响应正文解释了拒绝的原因,我想向用户显示。)


如何访问响应主体?

我知道这并不能直接回答问题,但您可能不想使用Sun提供的HTTP连接库,而是想看看它(在我看来)有一个更容易使用的API。

首先检查响应代码,然后使用
HttpURLConnection.getErrorStream()

(关闭,不会修复,不是错误)

他们的建议是这样编码:

HttpURLConnection httpConn = (HttpURLConnection)_urlConnection;
InputStream _is;
if (httpConn.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
    _is = httpConn.getInputStream();
} else {
     /* error from server */
    _is = httpConn.getErrorStream();
}
HttpURLConnection httpConn=(HttpURLConnection)\u urlConnection;
输入流是;
if(httpConn.getResponseCode()
这与我遇到的问题相同:
HttpUrlConnection
如果尝试从连接读取
getInputStream()
,则返回
FileNotFoundException

当状态代码高于400时,应改用
getErrorStream()

除此之外,请小心,因为成功状态代码不仅仅是200,甚至201、204等也经常被用作成功状态

下面是我如何管理它的一个例子

... connection code code code ...

// Get the response code 
int statusCode = connection.getResponseCode();

InputStream is = null;

if (statusCode >= 200 && statusCode < 400) {
   // Create an InputStream in order to extract the response object
   is = connection.getInputStream();
}
else {
   is = connection.getErrorStream();
}

... callback/response to your handler....
。。。连接代码。。。
//获取响应代码
int statusCode=connection.getResponseCode();
InputStream=null;
如果(状态代码>=200&&statusCode<400){
//创建InputStream以提取响应对象
is=connection.getInputStream();
}
否则{
is=connection.getErrorStream();
}
... 对处理程序的回调/响应。。。。
通过这种方式,您将能够在成功和错误情况下获得所需的响应


希望这有帮助

在.Net中,您拥有WebException的Response属性,该属性允许访问异常流。所以我想这是Java的一个好方法

private InputStream dispatch(HttpURLConnection http) throws Exception {
    try {
        return http.getInputStream();
    } catch(Exception ex) {
        return http.getErrorStream();
    }
}
或者我使用的一个实现。(可能需要更改编码或其他内容。适用于当前环境。)

私有字符串分派(HttpURLConnection http)引发异常{
试一试{
返回readStream(http.getInputStream());
}捕获(例外情况除外){
readAndThrowError(http);
返回null;//0&&http.getContentType().contains(“应用程序/json”)){
String json=this.readStream(http.getErrorStream());
Object oson=this.mapper.readValue(json,Object.class);
json=this.mapper.writer().withDefaultPrettyPrinter().writeValueAsString(oson);
抛出新的IllegalStateException(http.getResponseCode()+“”+http.getResponseMessage()+“\n”+json);
}否则{
抛出新的非法状态异常(http.getResponseCode()+“”+http.getResponseMessage());
}
}
私有字符串读取流(InputStream流)引发异常{
StringBuilder=新的StringBuilder();
try(BufferedReader in=new BufferedReader(new InputStreamReader(stream))){
弦线;
而((line=in.readLine())!=null){
append(line);//+“\r\n”(无需,json没有换行符!)
}
in.close();
}
System.out.println(“JSON:+builder.toString());
返回builder.toString();
}
我的运行代码

  HttpURLConnection httpConn = (HttpURLConnection) urlConn;    
 if (httpConn.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                        in = new InputStreamReader(urlConn.getInputStream());
                        BufferedReader bufferedReader = new BufferedReader(in);
                        if (bufferedReader != null) {
                            int cp;
                            while ((cp = bufferedReader.read()) != -1) {
                                sb.append((char) cp);
                            }
                            bufferedReader.close();
                        }
                            in.close();

                    } else {
                        /* error from server */
                        in = new InputStreamReader(httpConn.getErrorStream());
                    BufferedReader bufferedReader = new BufferedReader(in);
                    if (bufferedReader != null) {
                        int cp;
                        while ((cp = bufferedReader.read()) != -1) {
                            sb.append((char) cp);
                        }
                        bufferedReader.close();
                    }    
                    in.close();
                    }
                    System.out.println("sb="+sb);
HttpURLConnection httpConn=(HttpURLConnection)urlConn;
if(httpConn.getResponseCode()
如何在java中读取404响应正文:

使用Apache库-

或 爪哇11-

下面给出的代码段使用Apache:

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.util.EntityUtils;

CloseableHttpClient client = HttpClients.createDefault();
CloseableHttpResponse resp = client.execute(new HttpGet(domainName + "/blablablabla.html"));
String response = EntityUtils.toString(resp.getEntity());

您确定服务器正在发送正文吗?@jdigital:HttpURLConnection.getInputStream()引发的异常是java.io.FileNotFoundException。(主要是为了更好的Googleability而提到这一点。)您不想在响应代码>=400时获取错误流,而不是相反吗?如果出现错误,请使用getInputStream()将引发IO异常。您应该捕获异常并使用getErrorStream()从错误流中读取。这似乎是一种比检查httpresponse代码更好的方法。问题是,如果您读取HttpUrlConnection.getErrorStream()代码,您将看到它总是返回null。(Java 6):-(其他成功代码不会像“201 CREATED”此处失败?错误报告建议检查
httpConn.getResponseCode()>=400
(他们的解决方法有一个错误,将输入流翻转使用),我不同意。Sun的API更容易,因为
  HttpURLConnection httpConn = (HttpURLConnection) urlConn;    
 if (httpConn.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                        in = new InputStreamReader(urlConn.getInputStream());
                        BufferedReader bufferedReader = new BufferedReader(in);
                        if (bufferedReader != null) {
                            int cp;
                            while ((cp = bufferedReader.read()) != -1) {
                                sb.append((char) cp);
                            }
                            bufferedReader.close();
                        }
                            in.close();

                    } else {
                        /* error from server */
                        in = new InputStreamReader(httpConn.getErrorStream());
                    BufferedReader bufferedReader = new BufferedReader(in);
                    if (bufferedReader != null) {
                        int cp;
                        while ((cp = bufferedReader.read()) != -1) {
                            sb.append((char) cp);
                        }
                        bufferedReader.close();
                    }    
                    in.close();
                    }
                    System.out.println("sb="+sb);
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.util.EntityUtils;

CloseableHttpClient client = HttpClients.createDefault();
CloseableHttpResponse resp = client.execute(new HttpGet(domainName + "/blablablabla.html"));
String response = EntityUtils.toString(resp.getEntity());