线索匹配请求POST由params

时间:2018-02-05 16:59:01

标签: post parameters wiremock

我有一个简单的POST请求,使用application/x-www-form-urlencoded编码发送params。

查看线索docs我无法通过参数值找到匹配请求的方法,例如我所说的querystring匹配。

此外,身体contains似乎也不可能,也不可能完全匹配整个身体(就像base64一样)。

有没有办法匹配这类请求?

4 个答案:

答案 0 :(得分:2)

我发现的另一个选择是使用contains进行 存根 Content-Type: application/x-www-form-urlencoded

{
  "request": {
    "method": "POST",
    "url": "/oauth/token",
    "basicAuthCredentials": {
      ...
    },
    "bodyPatterns": [
      {
        "contains": "username=someuser"
      }
    ]
  },
  "response": {
    ....
  }
}

答案 1 :(得分:1)

您可以尝试https://github.com/WireMock-Net/WireMock.Net

使用此示例json可以匹配查询参数 body

{
    "Guid": "dae02a0d-8a33-46ed-aab0-afbecc8643e3",
    "Request": {
      "Url": "/testabc",
      "Methods": [
        "put"
      ],
      "Params": [
        {
          "Name": "start",
          "Values": [ "1000", "1001" ]
        },
        {
          "Name": "end",
          "Values": [ "42" ]
        }
      ],
       "Body": {
        "Matcher": {
          "Name": "WildcardMatcher",
          "Pattern": "test*test"
        }
      }
    }
}

答案 2 :(得分:1)

我有一个类似的问题-我想检查确切的参数,但没有patterm魔术(因此更易于维护)。作为解决方法,我创建了一个帮助器类:

import java.util.Iterator;
import java.util.LinkedHashMap;

public class WireMockUtil {
    public static String toFormUrlEncoded(LinkedHashMap<String, String> map) {
        if (map == null) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        Iterator<String> it = map.keySet().iterator();
        while (it.hasNext()) {
            String key = it.next();
            String value = map.get(key);
            appendFormUrlEncoded(key,value,sb);
            if (it.hasNext()) {
                sb.append('&');
            }
        }
        return sb.toString();
    }

    public static String toFormUrlEncoded(String key, String value) {
        StringBuilder sb = new StringBuilder();
        appendFormUrlEncoded(key, value,sb);
        return sb.toString();
    }

    public static void appendFormUrlEncoded(String key, String value, StringBuilder sb) {
        sb.append(key).append('=');
        if (value != null) {
            sb.append(value);
        }
    }
}

在Wiremock测试中,您可以通过以下方式使用它:

LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");

...

withRequestBody(equalTo(WireMockUtil.toFormUrlEncoded(map))).

或仅通过containing检查专用零件:

withRequestBody(containing(WireMockUtil.toFormUrlEncoded("key","value1"))).

答案 3 :(得分:0)

使用经典的Wiremock,您可以使用bodyPatterns的匹配器和正则表达式:

例如:

  ...
“请求”:{
   “ method”:“ POST”,
   “ url”:“ / api / v1 / auth / login”,
   “ bodyPatterns”:[
     {
       “ matches”:“(。*&| ^)username = test($ |&。*)”
     },
     {
       “ matches”:“(。*&| ^)password = 123($ |&。*)”
     }
   ]
},