如何从REST API

时间:2016-04-29 10:38:56

标签: java android http curl httpresponse

我正在尝试将用户注册到我的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命令的屏幕截图,其中我向服务器发送错误的详细信息并获取错误详细信息。

Server Response using curl

我也尝试过使用HTTPIE,我也得到与使用curl命令相同的响应,即具有该用户名的用户已经存在。

我的Java代码中也需要这些错误详细信息。我搜索了互联网,但没有找到解决方案。 有什么建议吗?

1 个答案:

答案 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;
}