我正在尝试将用户注册到我的Web服务器。如果我向服务器发送有效的详细信息,那么我得到201代码作为响应,代表“已创建”。但是,当我向服务器发送错误的凭据,即与之前相同的用户名时,我得到400 FileNotFoundException。我需要解释错误细节不仅400代码。因为如果我从命令行使用curl发送错误的详细信息,那么我也会收到错误详细信息,例如此用户名已经存在。 这是我从服务器读取响应的代码。实际上我已经尝试了两种不同的方法,但它们最终都出现了相同的错误,即400(错误请求)。
public static String readResponse(HttpURLConnection connection)
throws IOException, JSONException {
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
StringBuilder response = new StringBuilder();
while((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
return response.toString();
}
public static String readResponseFromServer(HttpURLConnection connection) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader
(connection.getInputStream()));
String line = "";
StringBuilder stringBuilder = new StringBuilder();
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
return stringBuilder.toString();
}
在上面的代码中,有两种方法可以从服务器读取响应。
以下是我使用这些方法从服务器读取响应的方法
System.out.println("Server Response" + WebServiceHelpers.readResponseFromServer(urlConnection));
我也使用上面代码中的第二种方法 readResponse()。
以下是curl命令的屏幕截图,其中我向服务器发送错误的详细信息并获取错误详细信息。
我也尝试过使用HTTPIE,我也得到与使用curl命令相同的响应,即具有该用户名的用户已经存在。
我的Java代码中也需要这些错误详细信息。我搜索了互联网,但没有找到解决方案。 有什么建议吗?
答案 0 :(得分:0)
试试这个
public static String readResponse(HttpURLConnection connection)
throws IOException, JSONException {
int respCode = connection.getResponseCode();
InputStream is = null;
if (isErrorCode(respCode)) {
is = connection.getErrorStream();
} else if (connection.getErrorStream() != null) {
is = connection.getInputStream();
}
//FIXME: InputStreamReader must be constructed with right charset
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
StringBuilder response = new StringBuilder();
while((line = rd.readLine()) != null) {
response.append(line);
}
return response.toString();
}
编写isErrorCode方法。它应该将响应代码400解释为错误和其他代码。另请注意fixme评论。当您构建没有字符集的InputStreamReader时,它使用默认字符集(如果您不提供 file.encoding 属性,则为UTF-8)但正确的方法是从Content-Type响应头和进程响应中获取字符集身体与编码。从响应中提取字符集的方法可能如下所示
private String getCharset(HttpURLConnection con) {
String charset = "";
String contentType = con.getContentType();
if (contentType != null) {
String[] values = contentType.split(";");
for (String value : values) {
String trimValue = value.trim();
if (trimValue.toLowerCase().startsWith("charset=")) {
charset = trimValue.substring("charset=".length());
}
}
}
if ("".equals(charset)) {
charset = "UTF-8";
}
return charset;
}