Java:Httpclient进阶

430 阅读4分钟
/*
 * 鉴权:token、cookie、session
 * 1、cookie:客户端(浏览器)本地缓存==>存在磁盘本地某个路径
 *      存储一些小的明文信息,不会放非常隐秘的信息
 *      cookie是如何生成的?客户端(JS脚本)和服务端(Java、Python)都能生成,一般都是服务器生成。
 *
 *      NAME=VALUE      赋予cookie的名称和其值(必填项)
 *      expires=DATE    cookie的有效期(被max-age取代)
 *      path=PATH       cookie适用路径,默认为当前路径
 *      domain=域名      cookie适用域名,默认当前域名
 *      max-age         用秒来设置cookie生存期
 *      size            大小
 *      HttpOnly        只有在http请求头中会带cookie信息,禁止通过JS访问
 *      secure          设置是否只能通过HTTPS来传递此条cookie
 *
 *  2、session:服务端缓存==>存储在内存中或者数据库中,断开了连接(关闭浏览器)session就会失效。
 *      默认失效时间为30分钟。优点:可以存储任意信息,缺点:耗内存;
 *      session是如何生成的?服务端生成,使用cookie回写到客户端(jsessionId),客户端每次发送请求时自动携带该cookie(jsessionId)。
 *
 * 3、token:票据==>存储在客户端(浏览器)对header或body中
 *      优点:不存储在服务端。一般只用来做鉴权存储用户相关信息。
 *      token是如何生成的?服务端生成,携带在header或body中回写客户端,客户端以同样的方法传递给服务端。
 *
 * 4、如何实现鉴权
 *      a、获取到对应的jsession或者对应token字符串;
 *      b、在请求的同时添加上它们;
 * token子验证过程:结果是相等的,算法是相同的。
 *
 * 5、代码鉴权逻辑:
 *      a、在获取Post请求响应之后(HttpUtils),判断响应体中是否还有token字符;
 *      b、如果含有token存储到env环境变量中,(Map<String,String>)
 *      c、每次post、get、patch请求之前,调用添加token的方法addToken
 *      d、addToken中会判断env环境中是否有Token,如果有添加到对应的请求头中
 * */
package com.lemon.utils;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.util.Arrays;


public class HttpUtils {
    /*
     * static 修饰方法和变量
     * 静态特点:
     *   0、直接用类名点击调用
     *   1、被所有的对象共享(环境变量)
     *   2、所有类加载而加载
     */

    public static void get(String url, String params) throws Exception {
        // 1\2\3 login?username=15500110011&password=123456
        HttpGet httpGet = new HttpGet(url+"?"+params);
        // 4、有参传参、有头加头
        httpGet.addHeader("X-Lemonban-Media-Type", "lemonban.v1");
        // 5、点击发送按钮,模拟客户端发送请求
        CloseableHttpClient client = HttpClients.createDefault();
        //记录开始时间
        long startTime = System.currentTimeMillis();
        // 由客户端发出请求,6、接收响应
        CloseableHttpResponse response = client.execute(httpGet);
        //记录结束时间
        long endTime = System.currentTimeMillis();
        // 获取body
        HttpEntity entity = response.getEntity();
        // 获取状态码
        int statusCode = response.getStatusLine().getStatusCode();
        // 获取header
        Header[] headers = response.getAllHeaders();

        System.out.println(EntityUtils.toString(entity));
        System.out.println(statusCode);
        System.out.println(Arrays.toString(headers));
        System.out.println("接口响应时间(毫秒):" + (endTime - startTime));
    }

    public static void jsonPost(String url, String params) throws Exception {
        HttpPost httpPost = new HttpPost(url);
        // 有参传参、有头加头
        httpPost.setHeader("X-Lemonban-Media-Type", "lemonban.v1");
        // Post请求必须添加content-type
        httpPost.setHeader("Content-Type", "application/json");
        // 传参
        httpPost.setEntity(new StringEntity(params));
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = httpClient.execute(httpPost);
        HttpEntity entity = response.getEntity();
        int statusCode = response.getStatusLine().getStatusCode();
        Header[] headers = response.getAllHeaders();

        System.out.println(EntityUtils.toString(entity));
        System.out.println(statusCode);
        System.out.println(Arrays.toString(headers));
    }

    public static void fromPost(String url, String params) throws Exception {
        HttpPost httpPost = new HttpPost(url);
        httpPost.setHeader("X-Lemonban-Media-Type", "lemonban.v1");
        httpPost.setHeader("Content-Type", "application/x-www-from-urlencoded;charset=UTF-8");
        httpPost.setEntity(new StringEntity(params));
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = httpClient.execute(httpPost);
        HttpEntity entity = response.getEntity();
        int statusCode = response.getStatusLine().getStatusCode();
        Header[] headers = response.getAllHeaders();

        System.out.println(EntityUtils.toString(entity));
        System.out.println(statusCode);
        System.out.println(Arrays.toString(headers));
    }

    public static void main(String[] args) {

    }


}
/*
 * 1、allure
 *  Maven常用命令:
 *      test:执行test文件夹中所有代码
 *      package:把当前项目打包(会生成test)
 *      clean:清空当前项目下的Maven生产的文件
 *      install:把jar包安装到本地仓库(会执行test、package)
 *
 *      1、导入allure坐标
 *      2、导入surefire插件
 *      3、运行clean test(生成报表数据)
 *      4、运行io.qameta.allure:allure-maven:server 启动报表服务器
 *      5、如果你需要加上一些文字说明
 *          (1)@Test(dataProvider = "datas1",description = "充值测试")   // DTO数据传输
 *          (2)@Step("回写Excel") 详细描写自动化程序的每个执行步骤
 *          //其他注释:
 *          Features:标注主要功能模块
 *          Stories:标注Features功能模块下的分支功能
 *          Title:标注Stories下的测试用例名称
 *          Severity:标注测试用例的重要级别
 *          Description:标注测试用例的描述
 *
 * 2、mock-server
 *  当接口尚未开发完毕,创建一个虚拟接口,继续测试;
 *  https://github.com/dreamhead/moco
 *  https://github.com/dreamhead/moco/blob/master/moco-doc/apis.md
 *
 * 3、Jenkins
 *  持续抓取版本库最新代码,定时构建(执行代码),生成对应构建信息,发送邮件,生生报表。
 *
 */