Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

okhttp new JsonObject from Response

I am trying to use OKHttp and https://github.com/hongyangAndroid/okhttp-utils to implement Login function, but I don't know how to create new a JsonObject use Response in the Callback.

  OkHttpUtils.post()
            .url(url)
            .addParams("phone", "18681873411")
            .addParams("password", "18681873411")
            .build()
            .execute(new Callback() {
                @Override
                public Object parseNetworkResponse(Response response) throws Exception {
                    Log.i("ws","---->>parseNetworkResponse" + response.body().string());


                    JSONObject jsonObj = null;
                    try {
                        jsonObj = new JSONObject(response.body().string());
                    } catch (JSONException e) {
                        Log.i("ws","---->>JSONException");
                        e.printStackTrace();
                    } catch (IOException e) {
                        Log.i("ws","---->>IOException");
                        e.printStackTrace();
                    }
                    Log.i("ws","---->>111 :" );
                    String opCode = jsonObj.getString("OpCode");
                    String message = jsonObj.getString("Message");
                    Log.i("ws","---->>111 opCode:" + opCode);
                    Log.i("ws","---->>111 Message:" + message);
                    JSONObject result = new JSONObject();
                    result.put("qrcode",opCode);
                    result.put("message", message);
                    return result;

                }

                @Override
                public void onError(Call call, Exception e) {
                    Log.i("ws","---->>onError" + e);
                }

                @Override
                public void onResponse(Object response) {
                    Log.i("ws","---->>onResponse" + response.toString());
                }
            });

and the error information:

parseNetworkResponse{"OpCode":0,"Message":"登陆成功","Other":{"id":1,"name":null,"phone":"18681873411","QQuid":null,"weixinuid":null,"gender":null,"age":null,"credits":null,"address":null,"signature":null,"imageurl":null,"password":"18681873411","created_at":"2016-05-19T17:05:02.000Z","updated_at":"2016-05-19T17:05:02.000Z"}}
05-20 11:29:01.953 13496-13621/com.smartspace.magicmirror I/ws: ---->>IOException
05-20 11:29:01.954 13496-13621/com.smartspace.magicmirror I/ws: ---->>111 :
05-20 11:29:01.955 13496-13496/com.smartspace.magicmirror I/ws: ---->>onErrorjava.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.json.JSONObject.getString(java.lang.String)' on a null object reference
like image 504
Shuai Wang Avatar asked May 20 '16 03:05

Shuai Wang


People also ask

How do I get data from OkHttp response?

For this, we can access the body via the body() method of the Response object. The ResponseBody class has several options for extracting this data: byteStream(): exposes the raw bytes of the body as an InputStream; we can use this for all formats, but usually it is used for binaries and files.

How do I use OkHttp on Android?

OkHttp Query Parameters Example Builder urlBuilder = HttpUrl. parse("https://httpbin.org/get).newBuilder(); urlBuilder. addQueryParameter("website", "www.journaldev.com"); urlBuilder. addQueryParameter("tutorials", "android"); String url = urlBuilder.


1 Answers

Since the call response.body().string() will read the content from the return stream then close it, so the second time you call it. It will return nothing :\

Better way:

if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); 
    String responseData = response.body().string();
    Log.e(TAG, "onResponse: " + responseData);
    try {
        JSONObject jsonObject = new JSONObject(responseData);
        // Do something here 
        } catch (JSONException e) {
...}
like image 89
toantran Avatar answered Oct 19 '22 12:10

toantran