OkHttp3找不到FormEncodingBuilder

本文介绍如何使用OkHttp3.x发送POST请求,并展示了使用FormBody替代FormEncodingBuilder的具体实现方式。通过示例代码,读者可以了解如何构建请求体、发起请求及获取响应。

okhttp3.FormBody instead of FormEncodingBuilder.(OkHttp3.x,FormEncodingBuilder已被FormBody取代)


OkHttpClient client = new OkHttpClient();
FormBody body = new FormBody.Builder()
     .add("your_param_1", "your_value_1")
     .add("your_param_2", "your_value_2")
     .build();
Request request = new Request.Builder()
     .url("http://my.wonderfull.url/to/post")
     .post(body)
     .build();
Response response = client.newCall(request).execute();


https://github.com/square/okhttp,OkHttp3.x与2.x不同之处见CHANGELOG.md


http://blog.youkuaiyun.com/xw1_xw/article/details/50724864

<think> 我们之前讨论的是使用 OkHttp 发送 POST 请求的方法,但现在用户遇到了问题:在编写代码时出现了 `okhttp3.*` 不到的情况。这通常是由于项目中没有正确引入 OkHttp 库导致的。因此,我们需要指导用户如何添加 OkHttp 依赖。 ### 解决 `okhttp3.*` 不到的问题 #### 步骤 1:添加 OkHttp 依赖 在你的项目中添加 OkHttp 库的依赖。根据你使用的构建工具(如 Maven 或 Gradle),添加方式如下: ##### Gradle (Android 或 Java 项目) 在 `build.gradle` 文件的 `dependencies` 部分添加: ```groovy dependencies { implementation &#39;com.squareup.okhttp3:okhttp:4.12.0&#39; // 使用最新稳定版本 } ``` ##### Maven 在 `pom.xml` 文件中添加: ```xml <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.12.0</version> <!-- 使用最新稳定版本 --> </dependency> ``` #### 步骤 2:同步项目 添加依赖后,同步你的项目(在 Android Studio 中点击 "Sync Now",或在 Maven 中运行 `mvn clean install`)。 #### 步骤 3:检查导入语句 在 Java 文件中,确保正确导入 OkHttp 类: ```java import okhttp3.*; ``` #### 步骤 4:处理网络权限(仅 Android 应用) 如果你的项目是 Android 应用,还需要在 `AndroidManifest.xml` 中添加网络权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` ### 完整示例代码(回顾) 以下是一个使用 OkHttp 发送 POST 请求的完整示例,括表单提交和 JSON 提交两种方式: ```java import okhttp3.*; import java.io.IOException; import java.net.URLEncoder; import java.util.Map; public class HttpPostClient { private static final MediaType JSON = MediaType.get("application/json; charset=utf-8"); // 使用单例 OkHttpClient 实例 private static final OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) // 设置连接超时 .readTimeout(30, TimeUnit.SECONDS) // 设置读取超时 .build(); // 发送表单数据 public static String postForm(String url, Map<String, String> params) throws IOException { FormBody.Builder formBuilder = new FormBody.Builder(); for (Map.Entry<String, String> entry : params.entrySet()) { formBuilder.addEncoded( URLEncoder.encode(entry.getKey(), "UTF-8"), URLEncoder.encode(entry.getValue(), "UTF-8") ); } Request request = new Request.Builder() .url(url) .post(formBuilder.build()) .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException("请求失败,状态码: " + response.code()); } return response.body().string(); } } // 发送 JSON 数据 public static String postJson(String url, String json) throws IOException { RequestBody body = RequestBody.create(json, JSON); Request request = new Request.Builder() .url(url) .post(body) .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException("请求失败,状态码: " + response.code()); } return response.body().string(); } } } ``` ### 常见问题排查 1. **依赖冲突**:如果项目中存在其他版本的 OkHttp,可能会导致冲突。使用 `./gradlew app:dependencies`(Gradle)检查依赖树。 2. **代理设置**:如果处于公司内网,可能需要配置代理: ```java OkHttpClient client = new OkHttpClient.Builder() .proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.example.com", 8080))) .build(); ``` 3. **Android 主线程限制**:在 Android 中,网络请求不能在主线程执行。请使用 `AsyncTask`、`Thread` 或协程。 ### 引用说明 OkHttp 是一个高效的 HTTP 客户端,适用于 Java 和 Android 应用[^1]。它支持同步和异步请求,并内置连接池、缓存和重试机制[^2]。 §§相关问题§§ 1. 如何配置 OkHttp 的缓存机制? 2. 在 Android 中如何安全地执行网络请求(避免主线程阻塞)? 3. 如何处理 HTTPS 请求和证书验证? </think> ### 解决 OkHttp3.* 不到的问题 当在项目中遇到 `okhttp3.*` 不到的错误时,通常是由于依赖配置问题导致的。以下是详细的解决步骤: #### 1. 添加 OkHttp 依赖 在项目的构建文件中添加最新版本的 OkHttp 依赖: ##### Gradle (Android/Java) ```groovy // build.gradle (Module level) dependencies { implementation &#39;com.squareup.okhttp3:okhttp:4.12.0&#39; // 最新稳定版 } ``` ##### Maven ```xml <!-- pom.xml --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.12.0</version> </dependency> ``` #### 2. 同步 Gradle/Maven 执行对应构建命令: - Android Studio: 点击 "Sync Now" - 命令行: `./gradlew build` 或 `mvn install` #### 3. 检查导入语句 确保代码中正确导入: ```java import okhttp3.*; ``` #### 4. 完整 POST 请求方法(修复版) ```java import okhttp3.*; import java.io.IOException; import java.util.Map; import java.util.concurrent.TimeUnit; public class HttpUtils { private static final OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .build(); /** * 发送表单格式的 POST 请求 * @param url 请求地址 * @param params 参数键值对 * @return 响应内容 */ public static String postForm(String url, Map<String, String> params) throws IOException { FormBody.Builder builder = new FormBody.Builder(); for (Map.Entry<String, String> entry : params.entrySet()) { builder.add(entry.getKey(), entry.getValue()); } Request request = new Request.Builder() .url(url) .post(builder.build()) .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException("HTTP 错误: " + response.code()); } return response.body().string(); } } } ``` #### 5. 常见问题排查 | 问题现象 | 解决方案 | |---------|---------| | `Unresolved reference: okhttp3` | 检查依赖版本和同步状态 | | 方法过时警告 | 更新到最新 OkHttp 版本 | | Android 网络权限缺失 | 在 AndroidManifest.xml 添加:<br>`<uses-permission android:name="android.permission.INTERNET" />` | | 代理环境问题 | 配置 OkHttp 代理:<br>`client.newBuilder().proxy(new Proxy(...))` | #### 6. 替代方案(如果仍无法解决) 如果持续遇到依赖问题,考虑使用 Java 原生 HttpURLConnection: ```java public static String postFormNative(String url, Map<String, String> params) throws IOException { URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); // 设置请求属性 con.setRequestMethod("POST"); con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // 构建参数字符串 StringBuilder postData = new StringBuilder(); for (Map.Entry<String, String> param : params.entrySet()) { if (postData.length() != 0) postData.append(&#39;&&#39;); postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); postData.append(&#39;=&#39;); postData.append(URLEncoder.encode(param.getValue(), "UTF-8")); } // 发送请求 con.setDoOutput(true); try (DataOutputStream wr = new DataOutputStream(con.getOutputStream())) { wr.writeBytes(postData.toString()); } // 获取响应 try (BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream()))) { String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } return response.toString(); } } ``` ### 关键要点 1. OkHttp 是 Square 公司开发的高效 HTTP 客户端,支持 HTTP/2 和连接池[^1] 2. 最新版本通过 Maven Central 分发,需确保仓库配置正确 3. Android 项目特别注意网络权限和主线程限制 4. 同步请求会阻塞当前线程,适合后台任务[^2] > **提示**:建议使用 OkHttp 而非原生实现,因其提供连接复用、透明 GZIP 压缩和响应缓存等高级特性,可提升网络性能 30% 以上[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值