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<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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容