JAVA 基于HttpClient-4.4.1传递json字符串作为参数发送POST请求 详细封装说明

场景:
POST请求,基于json格式,请求报文中部分字段在自动化测试中,是唯一的,所以需要参数化。
将参数化后的json报文作为该POST请求的参数,发送并检查是否请求成功。

以下是详细说明
一、测试类:PushClaimTest.java
定义方法 test(),调用 工具类 Helper.pushClaim()的方法
这里有两种方式:
1、创建Map集合,将所有需要参数化的json字符串的 jsonPath,jsonValue 分别放入Map中,然后调用Helper.pushClaim(map,"","")方法;
2、需要参数化的字段已因定不变且比较少,直接使用Helper.pushClaim("","")方法;这里的两个参数分别代表 companyCode,userAccount

PushClaimTest.java 代码:

import com.arronlong.httpclientutil.exception.HttpProcessException;
import com.cccis.test.common.util.helper.Helper;
import org.testng.annotations.Test;

import java.util.HashMap;
import java.util.Map;

public class PushClaimTest {
    @Test
    public void test() throws HttpProcessException {
        Map map = new HashMap();
        String jsonPath = "";
        String jsonValue = "03";

        map.put(jsonPath,jsonValue);
//        Helper.pushClaim(map,"SH0103","auto01");
        Helper.pushClaim("SH0103","auto01");
    }
}

image.gif

二、工具类:Helper.java
定义了重载方法 pushClaim(),一个是json报文中需要参数化的字段有多个且可变,就使用参数有map集合的pushClaim方法
pushClaim()解析
1、使用工具类JSONUtil.java中的getJsonObject()方法获取json字符串的JSONOject对象
2、json字符串中需要固定参数化的字段通过随机数拼接,使其自动生成
3、使用工具类JSONUtil.replaceJson()方法,替换json对象中需要参数化的字段
4、判断pushClaim()方法中的参数Map集合是否为空
不为空时,就遍历Map集合,然后使用JSONUtil.replaceJson()方法,替换json对象中map集合里需要参数化的字段
5、将上述已替换完成的JSON对象转换成字符串
6、使用工具类HttpUtil.pushClaim()方法并传入第5步的字符串发送HTTP请求(这里是POST请求)
7、判断HTTP请求响应报文中,是否包含成功相关字样
如果成功,就返回任务号
如果失败,就返回null
Helper.java代码:

package com.cccis.test.common.util.helper;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.arronlong.httpclientutil.exception.HttpProcessException;
import com.cccis.test.common.util.HttpUtil;
import com.cccis.test.common.util.JsonUtil;
import com.cccis.test.common.util.SeleniumUtil;
import com.cccis.test.common.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class Helper {

    private static Logger log = LoggerFactory.getLogger(Helper.class);

    public static String pushClaim(String companyCode,String userAccount) throws HttpProcessException {

        return pushClaim(new HashMap(),companyCode,userAccount);

    }

    public static String pushClaim(Map map,String companyCode,String userAccount) throws HttpProcessException {
        JSONObject json;
        json = JsonUtil.getJsonObject(new File("src/main/resources/task.json"));

        String randomStr = StringUtil.getRandStr();
        String taskNo = "taskNo"+randomStr;
        String accidentNo = "accidentNo"+randomStr;
        JsonUtil.replaceJson(json,"$.taskNo",taskNo);
        JsonUtil.replaceJson(json,"$.accidentInfo.accidentNo",accidentNo);
        JsonUtil.replaceJson(json,"$.companyCode",companyCode);
        JsonUtil.replaceJson(json,"$.userAccount",userAccount);

        if(map.size()>0){
            Iterator> iterator = map.entrySet().iterator();
            while(iterator.hasNext()){
                Map.Entry entry = iterator.next();
                SeleniumUtil.logInfo("更新JSON模板,["+entry.getKey()+"] - ["+entry.getValue()+"]");
                JsonUtil.replaceJson(json,entry.getKey(),entry.getValue());
            }
        }

        log.info(JSON.toJSONString(json));

        String  response =  HttpUtil.pushClaim(JSON.toJSONString(json));

        if(response.contains("成功")){
            SeleniumUtil.logInfo("任务推送成功,taskNo: " +taskNo);
            return taskNo;
        }else{
            SeleniumUtil.logInfo("任务推送失败:"+response);
            return null;
        }

    }

}

image.gif

三、工具类:JsonUtil.java
定义了操作JSON对象的相关方法
1、getJsonObject(File file)方法,只需传入File对象(即json字符串所在文件的路径)
通过JSONObject对象的parseObject(FileUtil.readFile(file))方法,读取文件中的json字符串,返回JSON对象

2、getJsonObject(String jsonString)方法,直接传入json字符串
通过JSONObject对象的parseObject(jsonString)方法,读取json字符串,返回JSON对象

3、replaceJson(JSONObject jsonObject, String jsonPath, Object value)方法,需传入要替换的字段对应的JSON对象,需参数化的字段的jsonPath,jsonValue
通过JSONObject对象的set(jsonObject, jsonPath, value)方法,设置JSON对象中指定jsonPath的Value值

4、deleteJson(JSONObject jsonObject, String jsonPath)方法,需传入需要删除的json对象中某个字段的jsonPath
通过JSONObject对象的remove(jsonObject, jsonPath)方法,移除JSON对象中指定的字段

5、getValue(JSONObject jsonObject, String jsonPath)方法,获取JSON对象中指定jsonPath的值
通过JSONObject对象的eval(jsonObject, jsonPath)方法,获取JSON对象中jsonPath对应的value

JsonUtil.java代码:

package com.cccis.test.common.util;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONPath;
import java.io.File;

public class JsonUtil
{
    public static JSONObject getJsonObject(File file)
    {
        return JSONObject.parseObject(FileUtil.readFile(file));
    }

    public static JSONObject getJsonObject(String jsonString)
    {
        return JSONObject.parseObject(jsonString);
    }

    public static boolean replaceJson(JSONObject jsonObject, String jsonPath, Object value)
    {
        return JSONPath.set(jsonObject, jsonPath, value);
    }

    public static boolean deleteJson(JSONObject jsonObject, String jsonPath)
    {
        return JSONPath.remove(jsonObject, jsonPath);
    }

    public static Object getValue(JSONObject jsonObject, String jsonPath)
    {
        return JSONPath.eval(jsonObject, jsonPath);
    }
}
image.gif

四、工具类:HttpUtil.java
定义了pushClaim方法,封装发送HTTP Post请求
这里用到com.arronlong.httpclientutil包下相关类

该包中HttpClientUtil是基于HttpClient-4.4.1封装的一个工具类,支持插件式配置Header、插件式配置httpclient对象,
HttpConfig 插件式配置请求参数(网址、请求参数、编码、client)
HttpConfig config = HttpConfig.custom()
.headers(headers) //设置headers,不需要时则无需设置
.url(url) //设置请求的url
.json(json字符串) //设置请求参数,没有则无需设置
.encoding("utf-8")//设置请求和返回编码,默认就是Charset.defaultCharset()
发送POST请求HttpClientUtil.post(config);

HttpUtil.java代码:

package com.cccis.test.common.util;

import com.arronlong.httpclientutil.HttpClientUtil;
import com.arronlong.httpclientutil.common.HttpConfig;
import com.arronlong.httpclientutil.exception.HttpProcessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HttpUtil
{
    private static Logger log = LoggerFactory.getLogger(HttpUtil.class);

    public static String pushClaim(String task) throws HttpProcessException {
        SeleniumUtil.logInfo("任务推送");

        HttpConfig config = HttpConfig.custom().url("http://192.168.**.**:8888/services/restful/pushClaim").json(task).encoding("utf-8");
        return HttpClientUtil.post(config);
    }
}
image.gif

json文件内容:

{
 "accLossInfo": {
    "absoluteDeductibleRate": 0,
    "accidentType": "pe",
    "dutyCertProcedure": "01",
    "surveyAssignDate": "2019-05-06 10:01:08",
    "vehicleSurveyDate": "2019-05-06 10:01:08",
    "vehicleSurveyName": "车物查勘员",
    "vehicleSurveyOnsiteRecord": "03"
  },
  "accidentInfo": {
    "reportFirstPlaceFlag": false,
    "reportLossAmount": 0,
    "reportNo": "reportNo20190712113700",
    "reporter": "报案人里斯本",
    "reporterFixedTelNo": "103498238299",
    "reporterTelNo": "103498238299",
    "selfClaimFlag": false,
    "surveyMode": "现场查勘",
    "surveyType": "01",
    "weather": "多云"
  },
  "residenceYears": 10,
  "seekMedicalWay": "SeekMedicalWay001",
  "sex": "Sex001",
  "trafficType": "TrafficCondition001",
  "treatmentState": "TreatmentState001",
  "casualtyName": "伤者一",
  "taskNo": "TaskNoOY2019080703",
  "companyCode": "SH0103",
  "userAccount": "ccc01"
}
image.gif

你可能感兴趣的:(JAVA 基于HttpClient-4.4.1传递json字符串作为参数发送POST请求 详细封装说明)