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()); } }); } });