2016-12-16 14 views
0

Я использую Citrus для автоматизации наших сервисов RESTful, где входной параметр service1 передается на вход service2 после URLEncoding.Анализ JSON-ответа с использованием структуры Citrus для URLEncode

Ниже приведен фрагмент кода, чтобы объяснить, как я пытался, но каким-то образом не смог URLEncode, поверх конструктора.traceVariables().

Из-за ограничения (возможно, известного!), Что параметры ответа не могут быть переданы вне контекста, мне пришлось вызвать несколько вызовов send(), receive(), определенных в том же методе Gherkin, что и ниже. Я могу напечатать переменную myVar (извлеченную из payLoad), используя designer.traceVariables(), но не смог обработать &, чтобы продолжить ее, чтобы перейти к следующему вызову службы.

@When("^I call CPAuth service for ChasePay$") 
public void i_call_CPAuth_service_for_ChasePay() throws Throwable { 
    designer.send("CitrusContext") 
    .messageType(MessageType.JSON) 
    .header(X_JPMC_CSRF_TOKEN_HEADER, csrfToken) 
    .header(HTTP.CONTENT_TYPE, APPLICATION_JSON) 
    .header(COOKIE, ConnRoutePNames.DEFAULT_PROXY + "=" + proxy) 
    .header("citrus_endpoint_uri", authUrl +"/auth/fcc/login") 
    .message(new HttpMessage("<large_string=no_issues_here>").method(HttpMethod.POST)); 

    designer.receive("CitrusContext").messageType(MessageType.JSON) 
    .validate("$.response", "secauth") 
    .validate("$.newstoken", false) 
    .validate("$.smtoken", "void") 
    .extractFromPayload("$.spid", "myVar"); 

    String request = URLEncoder.encode("appStoreBundleId=com.testmerchant.sampleapp&version=APP%2BBUILD%2BVERSION&channelId=MPD&spid=**${myVar}**&type=json&chasePayMerchantId=1390xxx", CharEncoding.UTF_8); 
    System.out.println("request: "+request); 
    designer.send("CitrusContext") 
    .messageType(MessageType.JSON) 
    .header(X_JPMC_CSRF_TOKEN_HEADER, csrfToken) 
    .header(HTTP.CONTENT_TYPE, APPLICATION_JSON) 
    .header(COOKIE, ConnRoutePNames.DEFAULT_PROXY + "=" + proxy) 
    .header("citrus_endpoint_uri", hostUrl +"/pwc/provisioning/pos/otp/contact/v20160313/list.action") 
    .message(new HttpMessage(request).method(HttpMethod.POST)); 

Результат: Перед кодированием: (. Это должно быть строкой, который должен быть закодирован) MSZp2V/czcKsxej + Q04Da/QeVlo = MCwCFAqrBN/6/J8WZENecE7JQlEODnecAhQCcnXGBjMoiQ7deunlyXKacFo/LQ == После кодирования:% 3D% 24 % 7BmyVar% 7D% 26

Любая помощь будет принята с благодарностью, спасибо.

ответ

0

Операция кодирования уничтожает выражение «$ myVar», прежде чем Citrus сможет анализировать и интерпретировать выражение как часть полезной нагрузки сообщения. Вам нужно выполнить операцию кодирования как функцию цитрусовых. Как написать эту функцию описано здесь: http://citrusframework.org/docs/custom-functions/

Вы в конечном итоге иметь что-то вроде:

designer.send("CitrusContext") 
    .messageType(MessageType.JSON) 
    .message(new HttpMessage("custom:urlEncode('appStoreBundleId=com.testmerchant.sampleapp&version=APP%2BBUILD%2BVERSION&channelId=MPD&spid=**${myVar}**&type=json&chasePayMerchantId=1390xxx')").method(HttpMethod.POST));