接口OkHttp系列(二)
Json格式、Header、Cookie、模拟浏览器
目录
- 1、Json格式
- 2、Header
- 3、Cookie
- 4、模拟浏览器
1、Json格式
1、创建Json类。
发送数据将数据类型转为Json格式。
接收数据将数据类型转为Json格式。
脚本代码:
代码语言:javascript复制package com.test.demo;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import org.json.JSONObject;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* Json格式
*
* @author wangmcn
*
*/
public class Json {
public static void main(String[] args) throws IOException {
final int CONNECT_TIMEOUT = 30;
final int READ_TIMEOUT = 30;
final int WRITE_TIMEOUT = 30;
// 创建OkHttpClient对象
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS) // 设置连接超时时间
.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS) // 设置读超时时间
.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS) // 设置写超时时间
.retryOnConnectionFailure(true) // 是否自动重连
.build();
// 数据类型为Json格式
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
// Json数据
String jsonStr = "{"username":"admin","password":"123456"}";
// 得到RequestBody对象
RequestBody body = RequestBody.create(JSON, jsonStr);
// 创建Request对象
Request request = new Request.Builder()
.url("http://localhost:8083/json")
.post(body)
.build();
// 得到Response对象
Response response = client.newCall(request).execute();
if(response.isSuccessful()){
System.out.println("获取响应状态: " response.code());
System.out.println("获取响应信息: " response.message());
}
// 将返回的响应结果字符串转化成为Json对象
JSONObject resultJson = new JSONObject(response.body().string());
System.out.println("获取网页源码: " resultJson);
// 清除并关闭线程池
client.dispatcher().executorService().shutdown();
// 清除并关闭连接池
client.connectionPool().evictAll();
}
}
2、运行结果:
2、Header
1、创建Header类。
使用header(name,value)来设置HTTP头的唯一值(如果name已经存在,将会移除该name对应的value,然后将新value添加进来,即替换掉原来的value值)。
使用addHeader(name,value)来补充新值(即使当前值已经存在,也只会添加新的value值,并不会移除或替换原来的值)。
添加2个Header:
内容格式设定为Json格式("Content-Type", "application/json;charset:utf-8")
自定义Header("Self-Header", "MySelfHeader")。
脚本代码:
代码语言:javascript复制package com.test.demo;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import org.json.JSONObject;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* Header
*
* @author wangmcn
*
*/
public class Header {
public static void main(String[] args) throws IOException {
final int CONNECT_TIMEOUT = 30;
final int READ_TIMEOUT = 30;
final int WRITE_TIMEOUT = 30;
// 创建OkHttpClient对象
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS) // 设置连接超时时间
.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS) // 设置读超时时间
.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS) // 设置写超时时间
.retryOnConnectionFailure(true) // 是否自动重连
.build();
// 数据类型为Json格式
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
// Json数据
String jsonStr = "{"username":"admin","password":"123456"}";
// 得到RequestBody对象
RequestBody body = RequestBody.create(JSON, jsonStr);
// 创建Request对象
Request request = new Request.Builder()
.url("http://localhost:8083/header")
.addHeader("Content-Type", "application/json;charset:utf-8")
.addHeader("Self-Header", "MySelfHeader")
.post(body)
.build();
// 得到Response对象
Response response = client.newCall(request).execute();
if(response.isSuccessful()){
System.out.println("获取响应状态: " response.code());
System.out.println("获取响应信息: " response.message());
}
// 将返回的响应结果字符串转化成为Json对象
JSONObject resultJson = new JSONObject(response.body().string());
System.out.println("获取网页源码: " resultJson);
// 获取请求头
Headers requestHeader = request.headers();
System.out.println("获取请求头: " requestHeader);
// 获取响应头
Headers responseHeader = response.headers();
System.out.println("获取响应头: " responseHeader);
// 清除并关闭线程池
client.dispatcher().executorService().shutdown();
// 清除并关闭连接池
client.connectionPool().evictAll();
}
}
2、运行结果:
3、Cookie
1、创建Cookie类。
在Header里添加Cookie(addHeader("Cookie", "login=true"))。
脚本代码:
代码语言:javascript复制package com.test.demo;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import org.json.JSONObject;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* Cookie
*
* @author wangmcn
*
*/
public class Cookie {
public static void main(String[] args) throws IOException {
final int CONNECT_TIMEOUT = 30;
final int READ_TIMEOUT = 30;
final int WRITE_TIMEOUT = 30;
// 创建OkHttpClient对象
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS) // 设置连接超时时间
.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS) // 设置读超时时间
.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS) // 设置写超时时间
.retryOnConnectionFailure(true) // 是否自动重连
.build();
// 数据类型为Json格式
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
// Json数据
String jsonStr = "{"username":"admin","password":"123456"}";
// 得到RequestBody对象
RequestBody body = RequestBody.create(JSON, jsonStr);
// 创建Request对象
Request request = new Request.Builder()
.url("http://localhost:8083/cookie")
.addHeader("Content-Type", "application/json;charset:utf-8")
.addHeader("Cookie", "login=true")
.post(body)
.build();
// 得到Response对象
Response response = client.newCall(request).execute();
if(response.isSuccessful()){
System.out.println("获取响应状态: " response.code());
System.out.println("获取响应信息: " response.message());
}
// 将返回的响应结果字符串转化成为Json对象
JSONObject resultJson = new JSONObject(response.body().string());
System.out.println("获取网页源码: " resultJson);
// 获取响应头与Cookie
Headers responseHeader = response.headers();
System.out.println("获取响应头: " responseHeader);
System.out.println("获取响应头里的Cookie: " responseHeader.get("Set-Cookie"));
// 清除并关闭线程池
client.dispatcher().executorService().shutdown();
// 清除并关闭连接池
client.connectionPool().evictAll();
}
}
2、运行结果:
4、模拟浏览器
模拟浏览器操作需要在Header里添加User-Agent参数与参数值,那么这个参数值怎么获取呢?
如图所示:
打开Fiddler,之后打开浏览器随便访问一个地址(如https://www.baidu.com/),此时Fiddler抓取请求头信息里就可以看到User-Agent的参数与参数值,将此参数与参数值添加到脚本的Header里即可。
1、创建Browser类。
模拟浏览器addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36")
脚本代码:
代码语言:javascript复制package com.test.demo;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
/**
* 模拟浏览器
*
* @author wangmcn
*
*/
public class Browser {
public static void main(String[] args) throws IOException {
final int CONNECT_TIMEOUT = 30;
final int READ_TIMEOUT = 30;
final int WRITE_TIMEOUT = 30;
// 创建OkHttpClient对象
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS) // 设置连接超时时间
.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS) // 设置读超时时间
.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS) // 设置写超时时间
.retryOnConnectionFailure(true) // 是否自动重连
.build();
// 创建Request对象
Request request = new Request.Builder()
.url("http://localhost:8083/getdemo")
.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36")
.get()
.build();
// 得到Response对象
Response response = client.newCall(request).execute();
if(response.isSuccessful()){
System.out.println("获取响应状态: " response.code());
System.out.println("获取响应信息: " response.message());
System.out.println("获取网页源码: " response.body().string());
}
// 获取请求头
Headers requestHeader = request.headers();
System.out.println("获取请求头: " requestHeader);
// 获取响应头
Headers responseHeader = response.headers();
System.out.println("获取响应头: " responseHeader);
// 清除并关闭线程池
client.dispatcher().executorService().shutdown();
// 清除并关闭连接池
client.connectionPool().evictAll();
}
}
2、运行结果: