[英]HttpUrlConnection: Get response body from non 200OK
当我的服务器没有返回 200OK 时,我试图从 HttpUrlConnection 对象获取响应正文。 就我而言,我得到了 302 重定向,因此使用getInputStream()
不起作用。 我尝试使用getErrorStream()
但由于某种原因这给了我一个空对象。 当我期待实际响应时,为什么会为getErrorStream()
获取空对象?
public static void main(String[] args) {
String url = "http://www.google.com/";
String proxy = "proxy.myproxy.com";
String port = "8080";
try {
URL server = new URL(url);
Properties systemProperties = System.getProperties();
systemProperties.setProperty("http.proxyHost",proxy);
systemProperties.setProperty("http.proxyPort",port);
HttpURLConnection connection = (HttpURLConnection)server.openConnection();
connection.connect();
System.out.println("Response code:" + connection.getResponseCode());
System.out.println("Response message:" + connection.getResponseMessage());
InputStream test = connection.getErrorStream();
String result = new BufferedReader(new InputStreamReader(test)).lines().collect(Collectors.joining("\n"));
} catch (Exception e) {
System.out.println(e);
System.out.println("error");
}
}
在我的代码中,我看到的输出是:
Response code:302
Response message:Object Moved
java.lang.NullPointerException
error
具体来说,错误发生在我的 try 子句的最后一行,因为它是我的getErrorStream()
返回一个 null 对象,因此我得到一个 nullPointerException。 有没有人熟悉这个? 谢谢
因为302
不被视为错误HTTP 响应代码。
由于响应不是以4
或5
开头,因此不会被视为错误响应。
另请查看HttpURLConnection::getErrorStream
的文档:
如果连接失败但服务器仍然发送了有用的数据,则返回错误流。 典型的例子是当 HTTP 服务器以 404 响应时,这将导致在连接中抛出 FileNotFoundException,但服务器发送了一个 HTML 帮助页面,其中包含有关如何操作的建议。
也可以随意深入研究源代码以获取更多信息以及一切清楚的地方:
@Override
public InputStream getErrorStream() {
if (connected && responseCode >= 400) {
// Client Error 4xx and Server Error 5xx
if (errorStream != null) {
return errorStream;
} else if (inputStream != null) {
return inputStream;
}
}
return null;
}
遗憾的是,这些信息并未包含在文档中。
package com.ketal.pos.sevice;
import com.utsco.model.User;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
/**
*
* @author Jose Luis Uyuni
*/
public class GenericService {
private static final long serialVersionUID = 0L;
public static final String HTTPS = "https";
public static final String HTTP = "http";
public String port;
public static String protocolo = HTTP + "://";
public String dominio;
private String urlBase = protocolo;
public String urlService;
public Integer response;
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
public String getDominio() {
return dominio;
}enter code here
public void setDominio(String dominio) {
this.dominio = dominio;
}
public String getUrlBase() {
return urlBase;
}
public String getUrlService() {
return urlService;
}
public void setUrlService(String urlService) {
this.urlService = urlService;
}
public String getStringResponse(User u, String method, String query, String body) throws MalformedURLException, IOException, Exception {
String response = null;
this.urlBase = protocolo + dominio + urlService + query;
URL url = new URL(urlBase);
HttpURLConnection conn;
if (protocolo.contains(HTTPS)) {
conn = (HttpsURLConnection) url.openConnection();
} else {
conn = (HttpURLConnection) url.openConnection();
}
conn.setRequestMethod(method);
conn.setRequestProperty("Accept", "application/json");
conn.setRequestProperty("content-type", "application/json; charset=UTF-8");
if (u != null) {
conn.setRequestProperty("Authorization", "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(("ketal.org" + ":" + "124578").getBytes()));
}
if (!method.equalsIgnoreCase("GET")) {
conn.setDoOutput(true);
conn.setRequestProperty("Content-Length", Integer.toString(body.length()));
conn.setRequestProperty("body", body);
}
response = "";
if (conn.getResponseCode() != 200) {
if (conn.getErrorStream() != null) {
response = getResponse(conn.getErrorStream());
}
if (response.equals("")) {
response = "{\"message\": \"error\" , \"state\": \"error\", \"nroErr\" ;\"" + "0" + "\" }]";
}
} else {
response = getResponse(conn.getInputStream());
}
conn.disconnect();
return response;
}
public String getResponse(InputStream i) throws IOException {
String res = "";
InputStreamReader in = new InputStreamReader(i);
BufferedReader br = new BufferedReader(in);
String output;
while ((output = br.readLine()) != null) {
res += (output);
}
return res;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.