接口OkHttp系列(二)- Json格式、Header、Cookie、模拟浏览器

2022-07-25 17:23:20 浏览数 (1)

接口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、运行结果:

0 人点赞