создание chttp с использованием заголовка и параметров - PullRequest
2 голосов
/ 06 июня 2019

Я пытаюсь создать cfhttp из запроса curl.Вот запрос:

curl https://url/paymentMethods \
-H "x-API-key: YOUR_X-API-KEY" \
-H "content-type: application/json" \
-d '{
  "merchantAccount": "YOUR_MERCHANT_ACCOUNT",
  "countryCode": "NL",
  "amount": {
    "currency": "EUR",
    "value": 1000
  },
  "channel": "Web"
}'

Я создаю функцию для запуска cfhttp:

try{
    apiKey = 'myKey';
    requestURL = 'https://url/';
    merchantAccount = 'myAccount';
    amount = {
      'value': 1000,
      'currency': 'USD'  
    };

    cfhttp(method="GET", url="#requestURL#/paymentMethods", result="data"){
        cfhttpparam(name="x-API-key", type="header", value="#apiKey#");
        cfhttpparam(name="content-type", type="header", value="application/json");
        cfhttpparam(name="merchantAccount", type="formfield", value="#merchantAccount#");
        cfhttpparam(name="countryCode", type="formfield", value="US");
        cfhttpparam(name="amount", type="formfield", value="#amount#");
        cfhttpparam(name="channel", type="formfield", value="web");
    }
    data = deserializeJSON(charge.data);
    WriteDump(data);
} catch(any e){
    WriteDump(e);
}

При запуске я получаю ошибку: Ошибка проверки атрибута для CFHTTPPARAM.Значение атрибута VALUE недопустимо.Требуется строковое значение.

Я неправильно отправляю параметры?

Спасибо

Ответы [ 2 ]

2 голосов
/ 07 июня 2019

Похоже, вам нужно упаковать данные в виде JSON в тело вашего запроса.Я предпочитаю следующий синтаксис в отличие от cfhttp / cfhttpparam, но следующий код по сути тот же:

// the api is expecting json in the body
requestData = {
    "merchantAccount": "YOUR_MERCHANT_ACCOUNT",
    "countryCode": "NL",
    "amount": {
        "currency": "EUR",
        "value": 1000
    },
    "channel": "Web"
};

apiKey = "your_api_key";

http = new http(argumentCollection={
    "url": "https://myendpoint.com/",
    "method": "post",
    "timeout": 30,
    "throwOnError": false,
    "encodeUrl": false
});

http.addParam(type="header", name="x-API-key", value=apiKey);
http.addParam(type="header", name="content-type", value="application/json");
http.addParam(type="body", value=serializeJSON(requestData));

// send the request
var httpResult = http.send().getPrefix();

// validate the response
param name="httpResult.status_code" default=500;

if (httpResult.status_code != 200) {
    throw(message="Failed to reach endpoint");
}

dump(var=httpResult);
2 голосов
/ 06 июня 2019

Вы передаете структуру в cfhttpparam amount.Попробуйте value="#serializeJSON( amount )#"

...