OKHttp的基本使用

OKHttp网络请求详解
本文介绍了Android中OKHttp网络库的高效使用方法,包括GET、POST请求及文件上传的示例代码,还展示了如何利用OKHttp请求图片并加载到广告轮播组件中。

1)Android中网络请求的变化

HttpURLConnection -> HTTPClient -> Volley -> OKHttp

2)OKHttp是什么?

HttpURLConnection 和 HTTPClient 虽然都支持HTTPS、文件上传下载、配置超时、IPV6、连接池。但使用OKHttp可更高效的使用HTTP协议,使应用运行的更快,更节省流量。

OKHttp是一个高效的HTTP库,它的特点为:

-> 支持SPDY。共享同一个Socket来处理同一个服务器的所有请求

-> 可通过连接池减少请求延时

-> 支持GZIP来减少数据流量

-> 缓存相应数据来减少重复的网络请求

-> 可以解决常见的网络连接问题

-> 处理代理服务器问题和SSL握手问题

3)基本使用

-> GET请求

//创建okHttpClient对象 

OkHttpClient mOkHttpClient = new OkHttpClient(); 

//创建一个Request 

final Request request = new Request.Builder() .url("https://github.com/hongyangAndroid")

 .build(); 

//new call 

Call call = mOkHttpClient.newCall(request); 

//请求加入调度 

call.enqueue(new Callback() { 

@Override 

public void onFailure(Request request, IOException e) {

 } 

@Override 

public void onResponse(final Response response) throws IOException { 

//String htmlStr = response.body().string(); 

});

-> POST请求

Request request = buildMultipartFormRequest( url, new File[]{file}, new String[]{fileKey}, null); 

FormEncodingBuilder builder = new FormEncodingBuilder(); builder.add("username","张鸿洋"); 

Request request = new Request.Builder()

 .url(url) 

.post(builder.build())

 .build(); 

mOkHttpClient.newCall(request).enqueue(new Callback(){});

-> 基于Http的文件上传

File file = new File(Environment.getExternalStorageDirectory(), "balabala.mp4"); 

RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file); 

RequestBody requestBody = new MultipartBuilder() 

.type(MultipartBuilder.FORM)

 .addPart(Headers.of( "Content-Disposition", "form-data; name=\"username\"")

, RequestBody.create(null, "张鸿洋")) 

.addPart(Headers.of( "Content-Disposition", "form-data; name=\"mFile\";

 filename=\"wjd.mp4\""), fileBody)

 .build(); 

Request request = new Request.Builder() 

.url("http://192.168.1.103:8080/okHttpServer/fileUpload") 

.post(requestBody) 

.build(); 

Call call = mOkHttpClient.newCall(request); call.enqueue(new Callback() { //... });

 

onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调用response.body().byteStream()

看到这,你可能会奇怪,竟然还能拿到返回的inputStream,看到这个最起码能意识到一点,这里支持大文件下载,有inputStream我们就可以通过IO的方式写文件。不过也说明一个问题,这个onResponse执行的线程并不是UI线程。的确是的,如果你希望操作控件,还是需要使用handler等,

4)利用OKHttp来请求图片,并将请求到的图片加载到广告轮播组件中,实现步骤为:

①添加依赖

compile 'com.squareup.okhttp:okhttp:2.5.0'
compile 'com.squareup.okio:okio:1.5.0'

②建立请求

String url ="http://112.124.22.238:8081/course_api/banner/query?type=1";
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
        .url(url)
        .build();

③将请求入队

client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Request requestIOException e) {

                }
                @Override
                public void onResponse(Response response) throws IOException {
                    if(response.isSuccessful()){
                        String json = response.body().string();
                        try{
                            JSONArray array = new JSONArray(json);
                            for(int i = 0i<array.length()i++){
                                JSONObject jsonObject = array.getJSONObject(i);
                                Banner banner = new Banner();
                                banner.setName(jsonObject.getString("name"));
                                banner.setImgUrl(jsonObject.getString("imgUrl"));
                                banner.setDescription(jsonObject.getString("description"));
                                banners.add(banner);
                            }
                        }catch (Exception e){
                            e.printStackTrace();
                        }

                        //进行相应的操作,但这里是异步的
                        initSlider();
                    }
                }
            });

 

<think>好的,用户想了解OkHttp3的基本使用方法。我需要先回忆一下OkHttp3的主要功能和常见用途。OkHttp是一个广泛使用的HTTP客户端库,适用于Android和Java应用程序,用于处理网络请求。用户可能是个刚入门的开发者,需要快速上手,所以回答要简明扼要,步骤清晰。 首先,我应该介绍如何引入OkHttp3的依赖,比如在Gradle中添加依赖项。然后,可能需要分几个部分,比如同步请求、异步请求、POST请求、拦截器等常见用法。用户可能关心的是基本使用,不需要太深入的高级功能,但适当提一下拦截器可以展示其扩展性。 需要注意OkHttp3的基本请求流程:创建OkHttpClient实例,构建Request对象,调用newCall方法执行请求,处理响应。同步和异步的区别需要明确说明,同步请求需要在子线程执行,而异步请求通过回调处理结果。 POST请求部分,用户可能需要知道如何提交表单数据和JSON数据,这里要给出具体的示例代码,比如使用FormBody和RequestBody。此外,文件上传作为POST的一个常见场景,也应该包含进去,但要注意代码的正确性,比如正确的MIME类型和MultipartBody的构建。 拦截器部分可以简要说明其用途,比如添加日志或修改请求头,给出一个日志拦截器的例子,这样用户能直观了解如何自定义拦截器。 最后,可能还需要提醒一些注意事项,比如网络权限的添加,在Android中需要在Manifest文件里声明INTERNET权限。此外,提到响应处理时的异常捕获,比如IOException,确保应用的健壮性。 需要检查代码示例是否正确,比如同步请求的execute()方法会阻塞线程,必须放在子线程中执行,而异步请求的enqueue方法会自动在后台线程执行回调。POST请求的MediaType是否正确,特别是JSON的application/json类型是否正确使用。 可能用户在实际使用中会遇到问题,比如依赖无法下载,需要确认是否使用了正确的仓库,或者版本号是否最新。但用户的问题主要是基本使用,所以这些细节可能暂时不需要深入,除非用户后续追问。 总之,结构要清晰,分点说明,代码示例正确且关键部分有注释,注意事项也要提到,帮助用户避免常见错误。确保回答简洁,但覆盖主要的使用场景,让用户能快速上手OkHttp3的基本操作。</think>以下为OkHttp3的基本使用方法和核心步骤: ----- ### 一、添加依赖 ```gradle // Gradle配置 implementation 'com.squareup.okhttp3:okhttp:4.9.3' // 使用最新版本 ``` ----- ### 二、GET请求 #### 同步请求 ```java OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://api.example.com/data") .build(); try (Response response = client.newCall(request).execute()) { if (response.isSuccessful()) { String result = response.body().string(); System.out.println(result); } } catch (IOException e) { e.printStackTrace(); } // 注意:同步请求需在子线程执行 ``` #### 异步请求 ```java client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { String result = response.body().string(); System.out.println(result); } } }); ``` ----- ### 三、POST请求 #### 表单提交 ```java RequestBody formBody = new FormBody.Builder() .add("username", "admin") .add("password", "123456") .build(); Request request = new Request.Builder() .url("https://api.example.com/login") .post(formBody) .build(); ``` #### JSON提交 ```java MediaType JSON = MediaType.parse("application/json; charset=utf-8"); String json = "{\"name\":\"Alice\",\"age\":25}"; RequestBody body = RequestBody.create(json, JSON); Request request = new Request.Builder() .url("https://api.example.com/users") .post(body) .build(); ``` ----- ### 四、文件上传 ```java File file = new File("/sdcard/image.jpg"); RequestBody fileBody = RequestBody.create(file, MediaType.parse("image/jpeg")); RequestBody multipartBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", "avatar.jpg", fileBody) .addFormDataPart("description", "用户头像") .build(); Request request = new Request.Builder() .url("https://api.example.com/upload") .post(multipartBody) .build(); ``` ----- ### 五、拦截器使用 ```java // 添加日志拦截器 OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) .build(); // 自定义拦截器(示例:添加公共请求头) .addInterceptor(chain -> { Request original = chain.request(); Request newRequest = original.newBuilder() .header("Authorization", "Bearer token123") .build(); return chain.proceed(newRequest); }) ``` ----- ### 注意事项 1. Android应用需添加网络权限: ```xml <uses-permission android:name="android.permission.INTERNET"/> ``` 2. 响应体处理完成后必须关闭: ```java try (ResponseBody body = response.body()) { String result = body.string(); } ``` 3. 文件上传时注意处理大文件的分块传输 以上为OkHttp3的常用操作,实际开发中可根据需求组合使用这些功能模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值