okhttp的get、post请求

okhttp网络请求框架

  这里粗粗介绍一下okhttp:比较完备的网络请求框架。

1、get请求

get请求分同步请求和异步请求两种方式:

get同步请求:

先上代码,这是我的程序代码:

//同步get请求
private void getSync() throws Exception 
    {
        new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                try
                {
                    request=new Request.Builder()  //请求对象,设置的参数详细要看源码解释
                            .url(BASE_URL)    //这里的url参数值是自己访问的api
                            .build();         
                    Response response = null;   //建立一个响应对象,一开始置为null
                    Call call = client.newCall(request); //开始申请,发送网络请求。
                    response = call.execute();
                    if (response.isSuccessful()) {

                        Log.d("kwwl", "response.code()==" + response.code());
                        Log.d("kwwl", "response.message()==" + response.message());
                        Log.d("kwwl", "res==" + response.body().string());
//                        text.setText("同步请求成功");
                        //此时的代码执行在子线程,修改UI的操作请使用handler跳转到UI线程。
                    }
                    else
                    {
                        text.setText("同步请求失败");
                        Log.d("Fail","get请求失败");
                    }
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }

            }
        }).start();
    }

  url参数值:详细的书写要看api申请的api书写规定,如我的url规定是:http+key,两者都是在申请api之后会有的数据。

  注意到Call对象是用client.newCall(request)来初始化,也就是说已经发送网络请求了,client就是客户端okhttpClient对象,将请求的结果返回给call,因此call有了响应成功或失败的结果。

  而call.execute()返回的就是response的情况,也就是response类对象,所以接下来就用response.isSuccessful来判断是否请求成功,以决定接下来的动作。

get异步请求:
//异步请求
    public void getAsync() throws Exception
    {

        request=new Request.Builder()
                .url(BASE_URL)
                .build();              
        Call call=client.newCall(request);
        call.enqueue(new Callback() {     //与同步的不同点:Callback
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d("TAG",BASE_URL);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                if(response.isSuccessful()){
                    final String result=response.body().string();
                    runOnUiThread(new Runnable() {  //回到UI主线程
                        @Override
                        public void run() {
                            text.setText(result);
                        }
                    });

                }

            }
        });
    }

异步请求和同步请求的代码差不多,关键在于异步请求多了利用Callback类来进行更细致的网络请求分析:
  onFail和onResponse方法:
  在我的理解中,这两者在网络请求的过程中起到的作用是:判断能否把请求发出去,比如,这个网络不接受get请求,那么你用get请求当然就不会成功了,这也是请求失败的一种,但是get异步请求把请求失败(广义)分成两种,能发送与不能发送,能发送成功在来分成能请求成功和因为其他原因的请求失败(狭义);

重点内容:注意到异步请求中有一个方法runOnUiThread(),返回主线程,为什么要返回主线程呢,因为虽然没有像同步请求那样明着写代码说另开一个子线程,但是这里在发送请求时,已经自己开启了一个子线程,所以现在要回到textView文本框中输入,就应该回调主线程。如果没有这个方法,直接setText的话,就会报错啦。
okhttp的get、post请求_第1张图片

2、post请求:

post请求也分两种,嘻嘻,我也只学了异步请求,跟get的异步很相似

post异步请求:
//post 请求
    private void postAsync() throws Exception
    {
        final String url = " http://apis.haoservice.com/lifeservice/Joke/ContentList?pagesize=10&page=1&key=8b3264c50ab346f39d1b4eac0dd5bc1c";    //我自己请求的api
        RequestBody formBody = new FormBody.Builder()   //创建表单请求体,具体的参数设置也要去看源码才更清楚
                                .add("username","17wwshe")      //自己设的,不要盗用我的名儿!
                                .build();
        request = new Request.Builder()//创建Request 对象。
                .url(url)
                .post(formBody)//传递请求体   //与get的区别在这里
                .build();
        client.newCall(request).enqueue(new Callback()
        {
            @Override
            public void onFailure(Call call, IOException e)
            {
                Log.d("TAG  post失败",url);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException
            {
                if(response.isSuccessful())
                {
                    final  String content=response.body().string();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Log.e("TAG post成功",content);
                            text.setText(content);
                        }
                    });

                }
                else
                {
                    Log.d("PostFail ",url);
                }
            }
        });

    }
//成功!!

okhttp的get、post请求_第2张图片

这里面的变量有点多,要仔细看才知道哪里是哪里。

你可能感兴趣的:(okhttp的get、post请求)