彻底掌握网络通信(十)AsyncHttpClient如何发送JSON解析JSON,以及一些其他用法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yi_master/article/details/80650014

网络通信系列文章序

彻底掌握网络通信(一)Http协议基础知识
彻底掌握网络通信(二)Apache的HttpClient基础知识
彻底掌握网络通信(三)Android源码中HttpClient的在不同版本的使用
彻底掌握网络通信(四)Android源码中HttpClient的发送框架解析
彻底掌握网络通信(五)DefaultRequestDirector解析
彻底掌握网络通信(六)HttpRequestRetryHandler解析
彻底掌握网络通信(七)ConnectionReuseStrategy,ConnectionKeepAliveStrategy解析
彻底掌握网络通信(八)AsyncHttpClient源码解读
彻底掌握网络通信(九)AsyncHttpClient为什么无法用Fiddler来抓包
彻底掌握网络通信(十)AsyncHttpClient如何发送JSON解析JSON,以及一些其他用法


AsyncHttpClient的常用方法可以做到entity的添加,header的添加,json的解析,这里简单介绍下AsyncHttpClient的其他方法

1.1: 发送带Entity的http请求

    private void sendPostWithEntity(){
        AsyncHttpClient client = new AsyncHttpClient();
        client.setProxy("172.29.14.249",8888);
        String postBody = "this is post body";
        ByteArrayEntity entity = null;
        try {
            entity = new ByteArrayEntity(postBody.getBytes("UTF-8"));
            entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        client.post(this,"http://112.4.3.136:8080/portalone/homesdk/NetTVUniLogin",entity,"application/json",new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int i, cz.msebera.android.httpclient.Header[] headers, byte[] bytes) {
                Log.d("hwj", "**AsyncHttpClientActivity onSuccess**");
            }

            @Override
            public void onFailure(int i, cz.msebera.android.httpclient.Header[] headers, byte[] bytes, Throwable throwable) {
                Log.d("hwj", "**AsyncHttpClientActivity onFailure**");
            }
        });
    }

第4行,我们在发送httppost请求的时候,添加了一个“this is post body”的entity,我们抓下包看下,entity是否添加了
这里写图片描述
如图所示,entity已经正确添加

1.2: 发送一个添加header的http请求

    private void sendPostWithHeader(){
        AsyncHttpClient client = new AsyncHttpClient();
        client.setProxy("172.29.14.249",8888);
        client.addHeader("name","hwj");
        client.post("http://112.4.3.136:8080/portalone/homesdk/NetTVUniLogin", new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int i, cz.msebera.android.httpclient.Header[] headers, byte[] bytes) {
                Log.d("hwj", "**AsyncHttpClientActivity onSuccess**");
            }

            @Override
            public void onFailure(int i, cz.msebera.android.httpclient.Header[] headers, byte[] bytes, Throwable throwable) {
                Log.d("hwj", "**AsyncHttpClientActivity onFailure**");
            }
        });
    }

抓包显示如下
这里写图片描述

1.3:如何发送JSON的消息体
将json放到消息体中,我们可以采用StringEntity的方式按照1.1的代码进行,也可以按照如下方法

    private void sendPostWithJson(){
        RequestParams params = new RequestParams();
        params.setUseJsonStreamer(true);
        JSONObject body;
        if ((body = getBodyTextAsJSON()) != null) {
            try {
                Iterator keys = body.keys();
                while (keys.hasNext()) {
                    String key = (String) keys.next();
                    Log.d("hwj", "  " + key + ": " + body.get(key));
                    params.put(key, body.get(key).toString());
                }
            } catch (JSONException e) {
                Log.w("hwj", "Unable to retrieve a JSON value", e);
            }
        }
        AsyncHttpClient client = new AsyncHttpClient();
        client.setProxy("172.29.14.249",8888);
        client.post(this, "http://112.4.3.136:8080/portalone/homesdk/NetTVUniLogin", null, params,
                RequestParams.APPLICATION_JSON,new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int i, cz.msebera.android.httpclient.Header[] headers, byte[] bytes) {
                Log.d("hwj", "**AsyncHttpClientActivity onSuccess**");
            }

            @Override
            public void onFailure(int i, cz.msebera.android.httpclient.Header[] headers, byte[] bytes, Throwable throwable) {
                Log.d("hwj", "**AsyncHttpClientActivity onFailure**");
            }
        });
    }

    protected JSONObject getBodyTextAsJSON() {
        String bodyText = "{\n" +
                "\"employees\": [\n" +
                "{ \"firstName\":\"Bill\" , \"lastName\":\"Gates\" },\n" +
                "{ \"firstName\":\"George\" , \"lastName\":\"Bush\" },\n" +
                "{ \"firstName\":\"Thomas\" , \"lastName\":\"Carter\" }\n" +
                "]\n" +
                "}";
        if (bodyText != null && !TextUtils.isEmpty(bodyText)) {
            try {
                return new JSONObject(bodyText);
            } catch (JSONException e) {
                Log.e("hwj", "User's data is not a valid JSON object", e);
            }
        }
        return null;
    }

其实代码很简单,参考第19行,其实就是调用重载的post方法, 将params放到entity里面罢了

更多的sample这边就不一一列举了,可以参考如下地址
asynchttpclient样例

猜你喜欢

转载自blog.csdn.net/yi_master/article/details/80650014
今日推荐