Android 网络请求(二)OKHttp网络通信

打印 上一主题 下一主题

主题 889|帖子 889|积分 2667

学习笔记
OkHttp 是一个非常强大且流行的 HTTP 客户端库,广泛用于 Android 开辟中进行网络请求。与 HttpURLConnection 相比,OkHttp 提供了更简单、更高效的 API,特殊是在处理复杂的 HTTP 请求时。
如何使用 OkHttp 进行网络请求
以下是使用 OkHttp 发送一个简单的 GET 请求POST 请求 的示例。
1. 在 build.gradle 中添加 OkHttp 依赖,以及网络权限

起首,你必要在项目标 build.gradle 文件中添加 OkHttp 的依赖。
  1. dependencies {
  2.     implementation 'com.squareup.okhttp3:okhttp:4.9.3'
  3. }
复制代码
确保在 Gradle 同步后,可以或许乐成引入 OkHttp 库。
添加网络权限
  1. <uses-permission android:name="android.permission.INTERNET"/>
复制代码
 
  1. <application
  2.         ...
  3.         android:usesCleartextTraffic="true"
  4.         .....
  5.     </application>
复制代码
2. 使用 OkHttp 发送 GET 请求

下面的示例展示了如何使用 OkHttp 发送一个 GET 请求并获取返回数据。
  1. import okhttp3.OkHttpClient;
  2. import okhttp3.Request;
  3. import okhttp3.Response;
  4. import java.io.IOException;
  5. public class OkHttpExample {
  6.     public String getDataFromServer() {
  7.         OkHttpClient client = new OkHttpClient(); // 创建 OkHttpClient 实例
  8.         
  9.         // 创建一个 GET 请求对象
  10.         Request request = new Request.Builder()
  11.                 .url("https://jsonplaceholder.typicode.com/posts") // 设置目标 URL
  12.                 .build();
  13.         
  14.         // 用于保存响应内容
  15.         String result = "";
  16.         
  17.         try {
  18.             // 执行请求,返回一个 Response 对象
  19.             Response response = client.newCall(request).execute();
  20.             
  21.             // 检查响应是否成功
  22.             if (response.isSuccessful()) {
  23.                 // 获取响应的内容(如 JSON)
  24.                 result = response.body().string(); // 读取响应体的内容
  25.             } else {
  26.                 result = "Request failed with code: " + response.code(); // 请求失败
  27.             }
  28.         } catch (IOException e) {
  29.             e.printStackTrace();
  30.             result = "Error: " + e.getMessage(); // 捕获异常并返回错误信息
  31.         }
  32.         
  33.         return result; // 返回请求结果
  34.     }
  35. }
复制代码
代码解释:



  • OkHttpClient client = new OkHttpClient();:创建一个 OkHttpClient 实例,这个实例用于执行网络请求。
  • Request request = new Request.Builder().url(...).build();:构建请求对象,通过 Request.Builder 设置 URL 和其他请求参数。
  • Response response = client.newCall(request).execute();:使用 newCall(request).execute() 执行请求并获取响应。
  • response.body().string():获取响应体的内容,通常是 JSON 格式的字符串。
  • response.code():获取响应的 HTTP 状态码,用于判断请求是否乐成。
3. 使用 OkHttp 发送 POST 请求

下面是如何使用 OkHttp 发送 POST 请求,并传递一些请求体(例如 JSON 数据)。
  1. import okhttp3.MediaType;
  2. import okhttp3.OkHttpClient;
  3. import okhttp3.Request;
  4. import okhttp3.RequestBody;
  5. import okhttp3.Response;
  6. public class OkHttpExample {
  7.     public String postDataToServer() {
  8.         OkHttpClient client = new OkHttpClient(); // 创建 OkHttpClient 实例
  9.         // 创建请求的 JSON 数据体
  10.         String json = "{"title":"foo", "body":"bar", "userId":1}";
  11.         // 设置请求体类型为 JSON
  12.         MediaType JSON = MediaType.get("application/json; charset=utf-8");
  13.         
  14.         // 创建一个 POST 请求对象,包含请求体
  15.         RequestBody body = RequestBody.create(json, JSON);
  16.         Request request = new Request.Builder()
  17.                 .url("https://jsonplaceholder.typicode.com/posts") // 设置目标 URL
  18.                 .post(body) // 设置 POST 请求体
  19.                 .build();
  20.         
  21.         // 用于保存响应内容
  22.         String result = "";
  23.         
  24.         try {
  25.             // 执行请求并获取响应
  26.             Response response = client.newCall(request).execute();
  27.             
  28.             // 检查响应是否成功
  29.             if (response.isSuccessful()) {
  30.                 result = response.body().string(); // 获取响应体的内容
  31.             } else {
  32.                 result = "Request failed with code: " + response.code(); // 请求失败
  33.             }
  34.         } catch (IOException e) {
  35.             e.printStackTrace();
  36.             result = "Error: " + e.getMessage(); // 捕获异常并返回错误信息
  37.         }
  38.         
  39.         return result; // 返回请求结果
  40.     }
  41. }
复制代码

代码解释:



  • String json = "{\"title\":\"foo\", \"body\":\"bar\", \"userId\":1}";:这里创建了一个 JSON 字符串,表示要发送的请求体。
  • MediaType JSON = MediaType.get("application/json; charset=utf-8");:指定请求体的类型为 application/json,告诉服务器发送的是 JSON 格式的数据。
  • RequestBody body = RequestBody.create(json, JSON);:将 JSON 字符串转换为 RequestBody 对象,这个对象会作为请求体发送给服务器。
  • request.post(body):将请求体添加到请求对象中,指定该请求是一个 POST 请求。
4. 异步请求

在 Android 中,网络请求必要在背景线程中进行,避免阻塞主线程。如果你不盼望使用同步请求,可以使用 OkHttp 的 异步请求,通过 enqueue() 方法进行请求。

  1. import okhttp3.Call;
  2. import okhttp3.Callback;
  3. import okhttp3.OkHttpClient;
  4. import okhttp3.Request;
  5. import okhttp3.Response;
  6. import java.io.IOException;
  7. public class OkHttpExample {
  8.     public void getDataFromServerAsync() {
  9.         OkHttpClient client = new OkHttpClient(); // 创建 OkHttpClient 实例
  10.         
  11.         // 创建 GET 请求对象
  12.         Request request = new Request.Builder()
  13.                 .url("https://jsonplaceholder.typicode.com/posts")
  14.                 .build();
  15.         
  16.         // 异步请求
  17.         client.newCall(request).enqueue(new Callback() {
  18.             @Override
  19.             public void onFailure(Call call, IOException e) {
  20.                 // 请求失败时的处理
  21.                 e.printStackTrace();
  22.             }
  23.             @Override
  24.             public void onResponse(Call call, Response response) throws IOException {
  25.                 if (response.isSuccessful()) {
  26.                     // 请求成功时,处理响应数据
  27.                     String result = response.body().string();
  28.                     // 在此处处理返回的结果,更新 UI(需要在主线程中进行)
  29.                 } else {
  30.                     // 请求失败时,处理失败的情况
  31.                     System.out.println("Request failed with code: " + response.code());
  32.                 }
  33.             }
  34.         });
  35.     }
  36. }
复制代码

异步请求的关键点:


  • client.newCall(request).enqueue(new Callback() {...}):异步请求的方法。
  • onFailure():请求失败时的回调方法。
  • onResponse():请求乐成时的回调方法,响应数据会传递到此。
   注意: 由于 onResponse() 方法是在背景线程中执行的,任何 UI 更新操作必要通过 runOnUiThread() 或其他线程间通信机制来确保在主线程中执行。
  5. 处理请求头

如果你必要在请求中设置请求头(例如设置身份验证的 Token),可以通过 Request.Builder 设置请求头。
  1. Request request = new Request.Builder()
  2.         .url("https://jsonplaceholder.typicode.com/posts")
  3.         .header("Authorization", "Bearer your_token_here")  // 设置请求头
  4.         .build();
复制代码
6. 连接池与缓存

OkHttp 默认提供了连接池和缓存机制,可以有效地提高网络请求的效率。你可以通过自界说 OkHttpClient 来配置连接池、缓存和其他高级功能。
示例:配置缓存
  1. import okhttp3.Cache;
  2. import okhttp3.OkHttpClient;
  3. import java.io.File;
  4. File cacheDir = new File(getCacheDir(), "http_cache");
  5. Cache cache = new Cache(cacheDir, 10 * 1024 * 1024); // 10MB 的缓存
  6. OkHttpClient client = new OkHttpClient.Builder()
  7.         .cache(cache)
  8.         .build();
复制代码
总结


  • 同步请求:使用 client.newCall(request).execute(),可以直接获取响应内容,但它会阻塞当前线程,不适合在 UI 线程中执行。
  • 异步请求:使用 client.newCall(request).enqueue(callback),通过回调来处理响应数据,适合在 UI 线程中执行,避免阻塞 UI。
  • POST 请求:可以通过 RequestBody 创建请求体,并通过 request.post(body) 来发送。
  • 请求头:可以通过 Request.Builder().header() 设置自界说请求头。
OkHttp 是一个功能强大且易于使用的 HTTP 客户端,适用于大多数 Android 项目标网络请求。对于复杂的请求场景,保举使用 OkHttp。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

吴旭华

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表