Android okhttp JSON数据并解析(一)

Json是什么?

答:JavaScript Object Natation, 一种轻量级的数据交换格式, 与XML一样, 广泛被采用的客户端和服务端交互的解决方案!具有良好的可读和便于快速编写的特性。

 前言:我想用阿凡达家的api,做一个农业资讯界面,这里我也是第一次尝试。先尝试解析JSON。

Json与XML的比较

  • JSON和XML的数据可读性基本相同;
  • JSON和XML同样拥有丰富的解析手段
  • JSON相对于XML来讲,数据的体积小
  • JSON与JavaScript的交互更加方便
  • JSON对数据的描述性比XML较差
  • JSON的速度要远远快于XML

HttpURLConnection从网上获取Json数据并解析

1、HttpURLConnection请求数据的步骤

(1)构造一个URL接口地址:

URL url = new URL(“httpurl”);

(2)用URL来创建一个连接:

HttpURLConnection conn = (HttpURLConnection)url.openConnection();

(3)设置请求方式(get/put):

conn.setRequestMethod(“GET”)

(4)设置需要的头设定:

conn.setRequestProperty(“apikey”,”你自己的apikey”)

(5)连接:

conn.connect()

Android开发中网络编程是必不可少的,不接入互联网的APP就没有盈利可言。下面请看Android中网络请求的进化图:

Android为我们提供了两种HTTP交互的方式: HttpURLConnection 和 Apache HTTP Client,虽然两者都支持HTTPS,流的上传和下载,配置超时,IPv6和连接池,已足够满足我们各种HTTP请求的需求。但更高效的使用HTTP可以让您的应用运行更快、更节省流量。而OkHttp库就是为此而生。

首先,给出OKHttp的项目地址:http://square.github.io/okhttp/

OkHttp是一个高效的HTTP库:

1.支持 SPDY ,共享同一个Socket来处理同一个服务器的所有请求

2.如果SPDY不可用,则通过连接池来减少请求延时

3.无缝的支持GZIP来减少数据流量

4. 缓存响应数据来减少重复的网络请求

  • 一般的get请求
  • 一般的post请求
  • 基于Http的文件上传
  • 文件下载
  • 加载图片
  • 支持请求回调,直接返回对象、对象集合
  • 支持session的保持

OKHttp在使用之前,首先要了解下面几个比较核心的类以及它的功能。

  1. OkHttpClient 客户端对象
  2. Request是OkHttp中访问的请求,Post请求中需要包含RequestBody
  3. Builder是辅助类,用于生产对象
  4. Response即OkHttp中的响应,响应中可以得到返回是否成功,返回数据
  5. MediaType  数据类型,用来表明是JSON等一系列格式
  6. RequestBody 请求数据,在Post请求中用到
  7. client.newCall(request).execute()是同步的请求方法
  8. client.newCall(request).enqueue(Callback callBack)是异步的请求方法,但是Callback里面的代码是执行在子线程的,因此不能更新UI。

OKHttp的基本使用步骤(以POST方式从服务器取JSON数据为例)

  1. 创建OkHttpClient对象,官方文档要求我们最好使用单例模式,在后文对OKHttp进行封装的时候会提到。
  2. 如果是post请求的话,需要通过FormEncodingBuilder创建RequestBody对象,指定需要post传进去的参数。get请求则不用。
  3. 创建Request对象,这个对象是请求对象,需要指定URL。post请求的时候需要指定RequestBody对象,get请求则不用。
  4. 调用OkHttpClient的newCall方法,把Request对象传进去,然后执行execute或者enqueue方法,两者的区别在上文已提到。在CallBack中的onResponse方法就可以做你需要做的事。onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调用response.body().byteStream()看到这,你可能会奇怪,竟然还能拿到返回的inputStream,看到这个最起码能意识到一点,这里支持大文件下载,有inputStream我们就可以通过IO的方式写文件。不过也说明一个问题,这个onResponse执行的线程并不是UI线程。的确是的,如果你希望操作控件,还是需要使用handler等。
    implementation("com.squareup.okhttp3:okhttp:4.2.0")
    testImplementation("com.squareup.okhttp3:mockwebserver:4.2.0")

网络权限:

<uses-permission android:name="android.permission.INTERNET"/>

做测试前 一定要确定自己的模拟器是否连上网啊!!!

简单应用:安卓通过OkHttp获取json数据

    private void sendRequestWithOkHttp() {
        // 开启线程来发起网络请求
        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                BufferedReader reader = null;
                //connection.setRequestProperty("apikey","b77e0acf7e014ba39f7fc4acf62d4e6e");
                try {
                    OkHttpClient client = new OkHttpClient();
                    // post请求
                    RequestBody requestBody = new FormBody.Builder()
                            .add("type","1")
                            .build();
                    
                    Request request = new Request.Builder()
                            .url("https://www.baidu.com")
                            .post(requestBody)
                            .build();


                    Response response = client.newCall(request).execute();
                    String responseData = response.body().string();
                    showResponse(responseData);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (reader != null) {
                        try {
                            reader.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    
                    if (connection != null) {
                        connection.disconnect();
                    }
                }
            }
        }).start();
    }

    private void showResponse(final String response) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                responseText.setText(response);
            }
        });
    }

之后再尝试 调用api 接口,将数据进行封闭,之后在适配。

对于免费的api 很多,我本来想做个农业资讯的,结果,一直报错,我还以为自己自己报错了那,结果是下架了,但是还能申请,哭了,哭了 ,先找个能用的api,试着写一下。

Postman 

 

OkHttp3 发送异步请求(GET)

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button doGet;
    private TextView responseText;
    String url="请求url";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        doGet=(Button)findViewById(R.id.doGet);
        doGet.setOnClickListener(this);
        responseText=(TextView)findViewById(R.id.responseText);


    }
    @Override
    public void onClick(View view) {

        switch (view.getId()){
            case R.id.doGet:
                doGet(url);
                break;
        }
    }

    private void doGet(String url) {
        OkHttpClient client= new OkHttpClient.Builder().build();
        final Request request =new Request.Builder().url(url).get().build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                Log.i("onFailure",e.getMessage());
            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                String result = response.body().string();
                Log.i("result",result);
            }
        });
    }
}

发布了71 篇原创文章 · 获赞 19 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_39131246/article/details/90169484