OkHttp的使用

OkHttp的简介

OKhttp是一个处理网络请求的开源项目,是安卓端最火热的轻量级网络框架。

  • 支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接
  • 连接池减少请求延时
  • 透明的GZIP压缩减少响应数据的大小
  • 缓存响应内容,避免一些完全重复的请求
  • OkHttp支持任何Android 2.3以上平台,并且需要JDK 1.7以上。

OkHttp的使用

  1. 安装依赖:implementation "com.squareup.okhttp3:okhttp:4.9.0"
  2. 在AndroidManifest文件中加上网络权限,和application同级:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

  1. 同步、异步请求
public void getSync(){
	//新建一个OkHttpClient对象
	OkHttpClient client = new OkHttpClient();
	//创建一个request对象
	Request request = new Request.Builder()
	.get() //默认get
	.url(url)
	.build();
	//准备call请求对象
	Call call = client.newCall(request);
	
	//发起同步请求
	try{
		Response response = call.execute();
		System.out.println(response.body().string());
	}catch(IOException e){
	e.printStackTrace();
	}
}


public void getAsync(){

	//新建一个OkHttpClient对象
	OkHttpClient client = new OkHttpClient();
	//创建一个request对象
	Request request = new Request.Builder().url(url).build();
	//准备call请求对象
	Call call = client.newCall(request);
	 //发起异步请求
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                if(response.isSuccessful())//返回码200-299
                {
                    System.out.println(response.body().string());
                }
            }
        });
}



public void postSync(){

        OkHttpClient client = new OkHttpClient();

        FormBody formBody = new FormBody.Builder().add("name","julian").add("age","25").build();
        Request request = new Request.Builder()
                .url("https://www.httpbin.com/")
                .post(formBody)
                .build();

        //准备call请求对象
        Call call = client.newCall(request);

        //发起同步请求
        try{
            Response response = call.execute();
            System.out.println(response.body().string());
        }catch(IOException e){
            e.printStackTrace();
        }
    }




   public void postAsync(){

        OkHttpClient client = new OkHttpClient();

        FormBody formBody = new FormBody.Builder().add("name","julian").add("age","25").build();
        Request request = new Request.Builder()
                .url("https://www.httpbin.com/")
                .post(formBody)
                .build();

        //准备call请求对象
        Call call = client.newCall(request);
        
        //发起异步请求
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                if(response.isSuccessful())//返回码200-299
                {
                    System.out.println(response.body().string());
                }
            }
        });
    }


Post请求的数据格式

在这里插入图片描述

OkHttp 自定义配置

拦截器

使用场景,我们在发送请求之前或者之后做一些处理需要用到拦截器。

 public void OkHttpClentTest(){

        OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
            @NotNull
            @Override
            public Response intercept(@NotNull Chain chain) throws IOException {

                //前置处理,比如给每次请求头中加上系统和版本号
                Request request = chain.request().newBuilder()
                        .addHeader("os","android")
                        .addHeader("version","1.0")
                        .build();

                Response response = chain.proceed(request);

                //后置处理

                return response;
            }
        }).build();

        FormBody formBody = new FormBody.Builder().add("name","julian").add("age","25").build();
        Request request = new Request.Builder()
                .url("https://www.httpbin.org/post")
                .post(formBody)
                .build();

        //准备call请求对象
        Call call = okHttpClient.newCall(request);

        //发起同步请求
        try{
            Response response = call.execute();
            System.out.println(response.body().string());
        }catch(IOException e){
            e.printStackTrace();
        }
    }

缓存

缓存,当发起相同的请求,直接从缓存中获取,避免重复的网络请求

OkHttp配置缓存:

        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .cache(new Cache(new File("/user/julian/path_of_cache_file"), 1024*1024))// 缓存文件位置、大小(1M)
                .build();

cookie

先登录,获取cookie保存在内存中map,再带上cookie请求文章列表

public class CookieTest {

    Map<String, List<Cookie>> cookies = new HashMap<>();

    @Test
    public void cookieTest(){
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .cookieJar(new CookieJar() {
                    @Override
                    public void saveFromResponse(@NotNull HttpUrl httpUrl, @NotNull List<Cookie> list) {
                        cookies.put(httpUrl.host(), list);
                    }

                    @NotNull
                    @Override
                    public List<Cookie> loadForRequest(@NotNull HttpUrl httpUrl) {
                        List<Cookie> cookie = CookieTest.this.cookies.get(httpUrl.host());
                        return cookie == null ? new ArrayList<Cookie>() : cookie;
                    }
                })
                .build();


        FormBody formBody = new FormBody.Builder()
                .add("username","用户名")
                .add("password","密码").build();

        
        Request request = new Request.Builder()
                .url("https://www.wanandroid.com/user/login")
                .post(formBody)
                .build();

        //准备call请求对象
        Call call = okHttpClient.newCall(request);

        //发起同步请求
        try{
            Response response = call.execute();
            System.out.println(response.body().string());
        }catch(IOException e){
            e.printStackTrace();
        }

        
        
        
        //okHttpClient从map中拿到cookie,需要使用cookie,请求文章列表

        Request request1 = new Request.Builder()
                .url("https://www.wanandroid.com/lg/collect/list/0/json")
                .get()
                .build();

        //准备call请求对象
        Call call1 = okHttpClient.newCall(request1);

        //发起同步请求
        try{
            Response response1 = call1.execute();
            System.out.println(response1.body().string());
        }catch(IOException e){
            e.printStackTrace();
        }


    }
}    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OkHttp是一个处理网络请求的开源项目,是Android使用最广泛的网络框架。它适用于Android 5.0(API级别21)和Java 8。使用OkHttp发送HTTP请求的过程如下: 1. 域名解析(DNS):将域名解析为IP地址。 2. 建立TCP连接:通过三次握手建立TCP连接。 3. 发起HTTP请求:建立TCP连接后,使用Socket输出流将HTTP报文写出。 4. 等待响应:等待服务器响应。 5. 解析响应:解析服务器返回的HTTP响应。 6. 处理响应数据:根据需要处理响应数据,比如解析JSON或下载文件。 在使用OkHttp时,首先需要创建一个Request对象,可以使用Request.Builder()来构建。然后通过Request对象获得一个Call对象,可以使用client.newCall(request)来创建。接下来,可以使用call.execute()进行同步调用或者call.enqueue()进行异步调用。最后,可以通过Response对象获取响应数据。 总之,使用OkHttp很简单,它的请求/响应API使用了流畅的构建器设计和不可变性设计,支持同步阻塞调用和带有回调的异步调用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [androidOkHttp使用](https://blog.csdn.net/hanjiexuan/article/details/115894233)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [android okhttp的基础使用【入门推荐】](https://download.csdn.net/download/weixin_38516386/12788438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值