Android——OkHttp

介绍

  OkHttp是开源网络请求框架

  其中,OkHttpClient,Call ,Request,Response四个主要对象

  

implementation 'com.squareup.okhttp3:okhttp:4.4.0'

 

方法

  ( Request )

    1. Request  Request.Builder.url( String url ).build() 

      参数:

        String url:请求地址

      返回值:Request

      返回值意义:获取封装的Request对象

      作用:封装URL的Request对象

  

  ( OkHttpClient )

  用来生成请求的调用Call 

      Call newCall( Request request )

      参数: 

        Request request:请求对象

      返回值:Call

      返回值意义:生成封装Call的

      作用:生成Call对象

  

  ( Call )

  同步方法:用来执行请求获取响应

  Response execute()

    参数:无

    返回值:Response  

    返回值意义:响应对象Response  

    作用:获取响应对象Response

  

  异步方法:用来执行请求获取响应,不需要new线程,enqueue内部自动生成线程!

  Response enqueue(Callback callback );

    参数:CallBack callback

    返回值:无

    返回值意义:无

    作用:异步请求

 

  ( Response )

  HttpResonse对象,用来获取响应体

    String response.body().string()

    这个是Kotln代码,不深入。

 

  (RequestBody)

  RequestBody对象,用于post请求时上传请求体

  RequestBody.create( byte[] ),现在不直接使用。在包含字节流的时候再用

 

  (FormBody)

  FormBody用于设置Contentpye,发送post请求。内置表单contentype

  FormBody formbody = new FormBody.Builder().add(String name,String value).build();

  即可

 

使用

  两Build夹一U ,构造得请求,相似有中介

Thread tht = new Thread(new Runnable() {
            @Override
            public void run() {
                Request request = new Request.Builder().url("http://106.xx.xx.xx:8080/CoolWeather/china").build();
                OkHttpClient okHttpClient = new OkHttpClient();
                Call call = okHttpClient.newCall(request);
                String string = null;
                try {
                    Response response = call.execute();
                    response.b
                    string = response.body().string();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                String finalString = string;
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Log.i("MA", "run: ");
                        txt.setText(finalString);
                    }
                });
            }
        });
        tht.start();

 

post使用

 btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                FormBody formBody = new FormBody.Builder().add("a","123").add("b","321").build();
                Request request = new Request.Builder().url("http://106.55.50.79:8080/api/cartoon/demo2").post(formBody).build();
                Call call = okHttpClient.newCall(request);
                call.enqueue(new Callback() {
                    @Override
                    public void onFailure(@NonNull Call call, @NonNull IOException e) {

                    }

                    @Override
                    public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                        Log.i(TAG, "onResponse: "+response.body().string());
                    }
                });

            }
        });

 

三Cookie

  Session:跨网页存储用户信息的技术

    服务端:使用Cookie传输JSESSIONID作为SESSION的标志    

 Cookie cookie = new Cookie("JSESSIONID",session.getId());
 response.addCookie(cookie);

 

    服务端Session的响应头:“Set-Cookie”

  客户端:通过response的Set-Cookie头信息获取JSESSIONID,保存改JSESSIONID到本地,发送改JSESSIONID作为该用户的凭证

JSESSIONID = response.header("Set-Cookie");

 

      发送请求时:

//使用addHeader("cookie",JSESSIONID)向请求添加cookie字段
Request request = new Request.Builder().url("http://106.55.50.79:8080/taobao/MyServlet")
                        .addHeader("cookie",JSESSIONID)
                        .build();

//每一次都应该添加cookie字段

 

 

        Map<String ,List<Cookie>> map = new HashMap<>();
        btn3 = findViewById(R.id.btn3);
        btn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FormBody formBody = new FormBody.Builder().add("a","123123").add("b","321321").build();
                Request request = new Request.Builder().url("http://106.55.50.79:8080/api/cartoon/demo3").post(formBody).build();
                OkHttpClient okHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() {
                    @Override
                    public void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List<Cookie> list) {
                        map.put(httpUrl.host(),list);
                        Log.i(TAG, "saveFromResponse: "+list.toString());
                    }

                    @NonNull
                    @Override
                    public List<Cookie> loadForRequest(@NonNull HttpUrl httpUrl) {
                        List<Cookie> cookies = map.get(httpUrl.host());
                        Log.i(TAG, "loadForRequest: cookie: "+cookies);
                        return cookies!=null ? cookies:new ArrayList<Cookie>(); // 第一次没有cookie处理

                    }
                }).build();
                Call call = okHttpClient.newCall(request);
                call.enqueue(new Callback() {
                    @Override
                    public void onFailure(@NonNull Call call, @NonNull IOException e) {

                    }

                    @Override
                    public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                        Log.i(TAG, "onResponse: "+response.body().string());
                    }
                });
            }
        });

 

  

 

  

posted @ 2021-08-14 16:29  remix_alone  阅读(103)  评论(0)    收藏  举报