目录:
Java OkHttpClient 工具类
OkHttpClient
1. pom
```xml
```
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
Iterator
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
Request request = new Request.Builder().url(attachHttpGetParams(url, params)).build();
return okHttpClient.newCall(request).execute().body().string();
}
public String post(String url, Map
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
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
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爬虫的道路上越走越远,越来越强大!