首页 > 解决方案 > 如何将 Pact HTTP 请求交互转换为 Curl

问题描述

我一直在寻找一种方法,将我的 Pact 测试的交互转换为 cUrl,以便于调试,但不知道该怎么做。

标签: javacurlpact

解决方案


可能有更好的方法来做到这一点,但我能够使用我编写的 logCurlFromPact() 方法并从 pactTestTemplate.

@TestTemplate
@ExtendWith(PactVerificationInvocationContextProvider.class)
void pactTestTemplate(PactVerificationContext context, HttpRequest request) throws IOException {
    request.addHeader("Authorization", AUTHORIZATION_TOKEN);

    logCurlFromPact(context, request);

    context.verifyInteraction();
}


public static void logCurlFromPact(PactVerificationContext context, HttpRequest request) throws IOException {

    String bodyParam = ((RequestResponseInteraction) context.getInteraction()).getRequest().getBody().valueAsString();

    String bodyResponse = ((RequestResponseInteraction) context.getInteraction()).getResponse().getBody().valueAsString();

    String method = ((RequestResponseInteraction) context.getInteraction()).getRequest().getMethod();

    String baseUrl = "";
    if (method.equals("POST")) {
        baseUrl = ((HttpPost) request).getURI().toString();
    } else if (method.equals("GET")) {
        baseUrl = ((HttpGet) request).getURI().toString();
    }

    Header[] headers = request.getAllHeaders();

    String headersString = "";

    for (Header s : headers) {
        headersString = headersString + "--header " + "'" + s.getName() + ": " + s.getValue() + "'" + "\\" + "\n";
    }

    String curl = "" +
            "curl " +
            "'" + baseUrl + "' \\" + "\n" +
            headersString +
            "--data-binary " + "'" + bodyParam + "' \\" + "\n" +
            "--compressed \\" + "\n" +
            "--insecure \\" + "\n" +
            "--verbose" +
            "";

    System.out.println(curl + "\n\n " + bodyResponse + "\n ---- \n\n");

}

在此处输入图像描述

这里是 logback.xml 文件的示例,以防您可能想要使用日志而不是 System.out.print()

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{HH:mm:ss.SSS} %-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </layout>
    </appender>

    <appender name="File" class="ch.qos.logback.core.FileAppender">
        <file>logback.log</file>
        <append>true</append>

        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx</pattern>
        </layout>
    </appender>

    <logger name="com.my.package.packagewiththelogmethod" level="DEBUG">
        <appender-ref ref="File"/>
    </logger>

    <logger name="curl" level="DEBUG">
        <appender-ref ref="File"/>
    </logger>

    <root level="info">
        <appender-ref ref="Console" />
    </root>

</configuration>

更新

对于Pact 4.3.2<http.client.version>5.1.2</http.client.version>

public static void logCurlFromPact(PactVerificationContext context, HttpRequest request) {

        String bodyParam = ((RequestResponseInteraction) context.getInteraction()).getRequest().getBody().valueAsString();

        String bodyResponse = ((RequestResponseInteraction) context.getInteraction()).getResponse().getBody().valueAsString();

        String method = ((RequestResponseInteraction) context.getInteraction()).getRequest().getMethod();

        String baseUrl = "";
        switch (method) {
            case "POST":
                baseUrl = ((HttpPost) request).getURI().toString();
                break;
            case "GET":
                baseUrl = ((HttpGet) request).getURI().toString();
                break;
            case "PUT":
                baseUrl = ((HttpPut) request).getURI().toString();
                break;
            case "PATCH":
                baseUrl = ((HttpPatch) request).getURI().toString();
                break;
            case "DELETE":
                baseUrl = ((HttpDelete) request).getURI().toString();
                break;
        }

        Header[] headers = request.getAllHeaders();

        String headersString = "";

        for (Header s : headers) {
            headersString = headersString + "--header " + "'" + s.getName() + ": " + s.getValue() + "'" + "\\" + "\n";
        }

        String curl = "" +
                "curl " +
                "--request " + method + " " +
                "'" + baseUrl + "' \\" + "\n" +
                headersString +
                "--data-binary " + "'" + bodyParam + "' \\" + "\n" +
                "--compressed \\" + "\n" +
                "--insecure \\" + "\n" +
                "--verbose" +
                "";

        log.debug(curl + "\n\n " + bodyResponse + "\n ---- \n\n");
    }

推荐阅读