JAVA 基於HttpClient-4.4傳遞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<String,Object> map = new HashMap();
        String jsonPath = "";
        String jsonValue = "03";

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


二、工具類: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;
        }


    }



}


三、工具類: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);
    }
}

四、工具類: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);
    }
}

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"
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章