目录:

Java OkHttpClient 工具类

OkHttpClient

1. pom

```xml

com.squareup.okhttp3

okhttp

3.14.0

```

2. 代码例子

重构后的代码如下:

```java

import okhttp3.*;

import okhttp3.Request.Builder;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.HttpURLConnection;

import java.net.URL;

import java.net.URLEncoder;

import java.util.Iterator;

import java.util.Map;

import java.util.concurrent.TimeUnit;

import com.alibaba.fastjson.JSONObject;

public class HttpClient {

OkHttpClient okHttpClient;

public HttpClient() {

okHttpClient = new OkHttpClient.Builder()

.connectTimeout(10, TimeUnit.SECONDS)

.writeTimeout(10, TimeUnit.SECONDS)

.readTimeout(20, TimeUnit.SECONDS)

.build();

}

public void sendJson(String url, String json, Callback callback) {

RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), json);

Request request = new Request.Builder()

.url(url)

.post(requestBody)

.build();

//创建/Call Call call = okHttpClient.newCall(request);

//加入队列 异步操作 call.enqueue(callback);

}

private String attachHttpGetParams(String url, Map params) {

Iterator keys = params.keySet().iterator();

Iterator values = params.values().iterator();

StringBuffer stringBuffer = new StringBuffer();

stringBuffer.append("?");

for (int i = 0; i < params.size(); i++) {

String value = null;

try {

value = URLEncoder.encode(values.next(), "utf-8");

} catch (Exception e) {

e.printStackTrace();

}

stringBuffer.append(keys.next() + "=" + value);

if (i != params.size() - 1) {

stringBuffer.append("&");

}

}

return url + stringBuffer.toString();

}

public String get(String url, Map params) throws IOException {

Request request = new Request.Builder().url(attachHttpGetParams(url, params)).build();

return okHttpClient.newCall(request).execute().body().string();

}

public String post(String url, Map formValues) throws IOException {

FormBody.Builder builder = new FormBody.Builder();

formValues.forEach((k, v) -> builder.add(k, v));

Request request = new Request.Builder().url(url).post(builder.build()).build();

Call call = okHttpClient.newCall(request);

return call.execute().body().string();

}

public String postWithHeaderJson(String url, Map header, String json) throws IOException {

RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), json);

Builder builderHeader = new Request.Builder();

header.forEach((k, v) -> builderHeader.addHeader(k, v));

Request request = builderHeader.url(url).post(requestBody).build();

Call call = okHttpClient.newCall(request);

return call.execute().body().string();

}

public String postJson(String url, String content) throws IOException {

RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), content);

Request request = new Request.Builder().url(url).post(requestBody).build();

Call call = okHttpClient.newCall(request);

return call.execute().body().string();

}

public String getWithHeader(String url, Map header) throws IOException {

Builder builderHeader = new Request.Builder();

header.forEach((k, v) -> builderHeader.addHeader(k, v));

Request request = builderHeader.url(url).build();

return okHttpClient.newCall(request).execute().body().string();

}

public static String sendPost(String url, String param) throws Exception { //发送POST请求的方法不变。此处省略具体实现。

您可以使用OkHttpClient解析工具类来解析网络请求的响应。这个工具类包含了GET和POST请求方法,同时支持JSON、表单和多部分请求体,并且支持上传文件。

```java

public class HttpUtils {

public static String get(String urlString) {

OkHttpClient okHttpClient = new OkHttpClient.Builder()

.addInterceptor(new LoggingInterceptor()) //日志拦截器

.connectTimeout(10, TimeUnit.SECONDS) //连接超时

.readTimeout(10, TimeUnit.SECONDS) //读取超时

.writeTimeout(10, TimeUnit.SECONDS) //写入超时

.build();

Request request = new Request.Builder().url(urlString).get().build();

try {

Response response = okHttpClient.newCall(request).execute();

String result = response.body().string();

Log.i("dt", "请求结果:" + result);

return result;

} catch (IOException e) {

e.printStackTrace();

}

return "";

}

public static String postForm(String url, String[] name, String[] value) {

OkHttpClient okHttpClient = new OkHttpClient.Builder()

.addInterceptor(new LoggingInterceptor()) //日志拦截器

.connectTimeout(10, TimeUnit.SECONDS) //连接超时

.readTimeout(10, TimeUnit.SECONDS) //读取超时

.writeTimeout(10, TimeUnit.SECONDS) //写入超时

.build();

FormBody.Builder formBuild = new FormBody.Builder();

for (int i = 0; i < name.length; i++) {

formBuild.add(name[i], value[i]);

}

Request request = new Request.Builder().url(url).post(formBuild.build()).build();

try {

Response response = okHttpClient.newCall(request).execute();

String result = response.body().string();

Log.i("dt", result);

return result;

} catch (IOException e) {

e.printStackTrace();

}

return "";

}

public static String postFile(String url, String[] name, String[] value, String fileParamName, File file) {

OkHttpClient okHttpClient = new OkHttpClient.Builder()

.addInterceptor(new LoggingInterceptor()) //日志拦截器

.connectTimeout(10, TimeUnit.SECONDS) //连接超时

.readTimeout(10, TimeUnit.SECONDS) //读取超时

.writeTimeout(10, TimeUnit.SECONDS) //写入超时

.build();

MultipartBody.Builder requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM);

if (file != null) { // MediaType.parse() 里面是上传的文件类型。

RequestBody body = RequestBody.create(MediaType.parse("image/*"), file);

String filename = file.getName(); // 参数分别为: 文件参数名 ,文件名称 , RequestBody

requestBody.addFormDataPart(fileParamName, "jpg", body);

}

if (name != null) {

for (int i = 0; i < name.length; i++) {

requestBody.addFormDataPart(name[i], value[i]);

}

}

Request request = new Request.Builder().url(url).post(requestBody.build()).build();

try {

Response response = okHttpClient.newCall(request).execute();

if (response.code() == 200) {

return response.body().string();

}

} catch (IOException e) {

e.printStackTrace();

}

return "";

}

public static String postJson(String url, String jsonString) {

OkHttpClient okHttpClient = new OkHttpClient();

RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), jsonString);

Request request = new Request.Builder().url(url).post(requestBody).build();

try {

Response response = okHttpClient.newCall(request).execute();

return response.body().string();

} catch (IOException e) {

e.printStackTrace();

}

return "";

}

}

```

总结

以上是我在学习Python爬虫过程中的一些经验和心得,希望能给大家一个参考。Python爬虫的学习曲线相对较陡峭,需要不断实践和积累。在这个过程中,我遇到了很多问题,也学到了很多知识。通过不断的尝试和调整,我逐渐掌握了Python爬虫的基本技巧和方法。

在学习Python爬虫的过程中,我发现以下几点对于提高学习效果和解决问题非常有帮助:

1. 熟悉Python基础知识。在开始学习爬虫之前,建议先熟悉Python的基础知识,如数据类型、控制结构、函数、类等。这将有助于你更好地理解爬虫的相关知识。

2. 选择合适的库。Python有很多成熟的爬虫库,如requests、BeautifulSoup、Scrapy等。根据自己的需求和兴趣,选择合适的库进行学习和实践。

3. 多动手实践。理论知识固然重要,但实践才是检验真理的唯一标准。通过实际操作,可以加深对知识点的理解,也能发现自己的不足之处,为进一步学习提供方向。

4. 学会查阅资料。在学习过程中遇到问题时,不要害怕查阅资料。可以通过阅读书籍、博客、论坛等途径,找到解决问题的方法和灵感。同时,也可以向他人请教,拓宽自己的视野。

5. 保持耐心和毅力。学习任何技能都需要时间和精力投入,爬虫也不例外。遇到困难时,不要轻易放弃,要相信自己一定能够克服困难,取得成功。

6. 及时反馈和总结。在完成一个项目后,要及时对自己的工作进行总结和反馈,找出存在的问题和不足,以便在以后的学习和实践中加以改进。

7. 交流与分享。与其他学习者和技术社区保持良好的交流和分享,可以帮助你拓宽知识面,提高技术水平。同时,也可以为自己的项目寻求更多的支持和资源。

最后,感谢大家对脚本之家的支持和关注。希望我的经验能为大家提供一些参考和帮助。祝愿大家在学习Python爬虫的道路上越走越远,越来越强大!