美文网首页软件测试学习之路
JAVA 基于HttpClient-4.4.1传递json字符串

JAVA 基于HttpClient-4.4.1传递json字符串

作者: 乘风破浪的姐姐 | 来源:发表于2019-09-20 18:17 被阅读0次

    场景:
    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<String,Object> 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<String,Object> 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<Map.Entry<String,Object>> iterator = map.entrySet().iterator();
                while(iterator.hasNext()){
                    Map.Entry<String,Object> 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字符串

        本文链接:https://www.haomeiwen.com/subject/jqijuctx.html