Android HttpUrlConnection Post 方法 - Json - Laravel API 对错误的响应

Posted

技术标签:

【中文标题】Android HttpUrlConnection Post 方法 - Json - Laravel API 对错误的响应【英文标题】:Android HttpUrlConnection Post Method - Json - Laravel API response on Error 【发布时间】:2015-10-16 20:13:08 【问题描述】:

我在 laravel 中写了一个 API,用于接受 POST 请求接收参数并保存在 DB 中。

成功时,它会返回一个 json,返回订单 ID(Http 响应代码 200)


    "data": 
        "order_id": 21
    

在将数据保存到 DB 之前,我会验证数据,如果有 错误,它会返回错误消息 json(Http 响应代码 400)


    "error": 
        "code": "GEN-WRONG-ARGS",
        "http_code": 400,
        "message": 
            "cust_id": [
                "The cust id may not be greater than 9999999999."
            ]
        
    

在浏览器中运行良好

android 通话中,如果一切正常,例如http 响应代码 200 我得到了 json。

但是当返回错误 json 时,我从未收到错误 json,getInputStream() 返回 null。

private InputStream downloadUrl(String urlString) throws IOException 
    // BEGIN_INCLUDE(get_inputstream)
    URL url = new URL(urlString);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setReadTimeout(10000 /* milliseconds */);
    conn.setConnectTimeout(15000 /* milliseconds */);
    conn.setRequestMethod("GET");
    conn.setDoInput(true);
    // Start the query
    conn.connect();
    InputStream stream = conn.getInputStream();
    return stream;
    // END_INCLUDE(get_inputstream)

    如果出现错误,如何将响应代码更改为 200 并在 Laravel 中发送,然后获取错误 json。 或在 Android 中即使有响应代码如 400 或 404,我也能收到 http 正文,就像浏览器一样

1 是一种解决方法,2 是正确的方法。

谢谢,

K

【问题讨论】:

有人可以帮忙吗? 【参考方案1】:

经过数小时的努力,我找到了解决方案。 getErrorStream() 是解决此问题的方法。如果响应代码> = 400,我将代码更改如下以获得错误响应。

private InputStream downloadUrl(String urlString) throws IOException 
// BEGIN_INCLUDE(get_inputstream)
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Start the query
conn.connect();
InputStream stream  = null;
    try 
        //Get Response
        stream = conn.getInputStream();
     catch (Exception e) 
        try 
            int responseCode = conn.getResponseCode();
            if (responseCode >= 400 && responseCode < 500)
                stream = conn.getErrorStream();
            else throw e;
         catch (Exception es) 
            throw es;
        
    
return stream;
// END_INCLUDE(get_inputstream)

希望这会为某人节省大量时间

谢谢, 克

【讨论】:

以上是关于Android HttpUrlConnection Post 方法 - Json - Laravel API 对错误的响应的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Android 的 HttpUrlConnection 不支持 HTTP/2?

Android中的HttpURLConnection有线记录

[Android基础]Android中使用HttpURLConnection

Android HttpUrlConnection 无法正常工作

HttpUrlConnection.getInputStream 在 Android 中返回空流

android中的HttpUrlConnection的使用之二