Nexmo API и CFHttp POST

Я пытаюсь использовать CFHttp для POST в Nexmo API.

документация по API

<cfhttp url="https://rest.nexmo.com/number/buy/" method="post">
    <cfhttpparam name="api_key" value="#api.key#" type="url">
    <cfhttpparam name="api_secret" value="#api.secret#" type="url">
    <cfhttpparam name="country" value="US" type="url">
    <cfhttpparam name="msisdn" value="11234567890" type="url">
</cfhttp>

Я получаю статус 420 (неправильные параметры) при запуске этого.

Что я делаю не так?

Вот пример на PHP: API


person Dre    schedule 21.03.2013    source источник
comment
Ваш код кажется мне правильным. Может ли быть так, что он распознает, что запрошенный вами isdn недействителен?   -  person BKK    schedule 21.03.2013
comment
@BenKoshy Я проверил, что все переданное действительно. Я просто изменил номер, прежде чем написать сюда.   -  person Dre    schedule 21.03.2013


Ответы (2)


Глядя на документацию API, мне кажется, что они ожидают, что поля будут значениями формы. Вот выдержка из здесь:

Методы HTTP

Все запросы отправляются с помощью метода HTTP POST или GET с использованием кодировки UTF-8 и значений в кодировке URL.

Ожидаемый "Content-Type" для POST: "application/x-www-form-urlencoded", однако мы также поддерживаем "application/json", "application/jsonrequest", "application/x-javascript". ", "text/json", "text/javascript", "text/x-javascript", "text/x-json" при отправке параметров в виде объекта JSON.

Поэтому попробуйте изменить код на следующий:

<cfhttp url="https://rest.nexmo.com/number/buy/" method="post" charset="utf-8">
    <cfhttpparam name="Content-Type" value="application/x-www-form-urlencoded" type="header">
    <cfhttpparam name="Accept" value="application/xml" type="header">
    <cfhttpparam name="api_key" value="#api.key#" type="formField">
    <cfhttpparam name="api_secret" value="#api.secret#" type="formField">
    <cfhttpparam name="country" value="US" type="formField">
    <cfhttpparam name="msisdn" value="11234567890" type="formField">
</cfhttp>

Обратите внимание, что для заголовка Accept установлено значение application/xml. Согласно документам, это также может быть application/json. Измените это значение в зависимости от того, что вы хотите.

person Miguel-F    schedule 21.03.2013
comment
@Dre, возможно, вам также нужно включить кодировку символов. Я обновил свой пример кода. - person Miguel-F; 21.03.2013
comment
Все равно не повезло. Я также пробовал encoded="yes", и это не сработало. - person Dre; 21.03.2013
comment
@Dre Я только что заметил, что в документации также указано Вы должны установить HTTP-заголовок Accept в своем запросе, поэтому позвольте мне снова обновить свой ответ. - person Miguel-F; 21.03.2013
comment
То же самое, к сожалению. Я могу выполнять GET запросы в течение всего дня, но POST не сотрудничает. - person Dre; 22.03.2013
comment
Хм? Да, это просто вопрос определения формата, который они хотят. Нашли ли вы примеры на другом языке (PHP и т. д.)? Это может нам помочь. - person Miguel-F; 22.03.2013
comment
@Dre Я добавил в свой пример заголовок Content-Type. Может быть, нам нужно указать и это? - person Miguel-F; 22.03.2013
comment
@Dre Я евангелист разработчиков в Nexmo, но я не очень хорошо знаком с ColdFusion. Если он все еще не работает (насколько я могу судить, текущий код в ответе выглядит хорошо для меня) - я могу собрать несколько примеров вызовов CURL, которые могут быть полезны. - person Tim Lytle; 22.03.2013
comment
Я думаю, это было бы полезно. Приведенный выше ответ по-прежнему не работает. Вот пример на PHP по запросу. github.com/prawnsalad/Nexmo-PHP-lib/blob/ мастер/ - person Dre; 22.03.2013
comment
Я просмотрел примеры CURL из документов, чтобы найти этот ответ. Я также посмотрел на этот пример PHP. Единственное, что я вижу, это установка заголовков Content-Type и Accept, что я и пытался сделать здесь. Что странно для меня, так это то, что возвращается ошибка 420 wrong parameters. Итак, я предполагаю, что часть связи/формата работает. В документах упоминаются только 2 параметра, которые он включил в качестве необходимых для этого вызова. Может ли ключ и/или секрет быть недействительным? Это должно вернуть ошибку 401, верно? - person Miguel-F; 22.03.2013
comment
@ Miguel-F Правильно насчет 401. Есть ли способ получить дамп необработанного HTTP-запроса? Это было бы очень полезно. - person Tim Lytle; 22.03.2013
comment
Попробуйте gist.github.com/kylejmhudson/4e8a6154da72972dce50 и сообщите о результате. - person Kyle Hudson; 22.03.2013
comment
@TimLytle Я всегда использую Fiddler для захвата необработанного HTTP-трафика. OP необходимо будет установить его на сервере ColdFusion, который делает запрос cfhttp. - person Miguel-F; 22.03.2013

Попробуйте перейти на formfield

<cfhttp url="https://rest.nexmo.com/number/buy/" method="post">
    <cfhttpparam name="api_key" value="#api.key#" type="FormField">
    <cfhttpparam name="api_secret" value="#api.secret#" type="FormField">
    <cfhttpparam name="country" value="US" type="FormField">
    <cfhttpparam name="msisdn" value="11234567890" type="FormField">
</cfhttp>

Этот документ ищет POST и отправляете комбо post/get. Основываясь на том, что вы отправляете, вы не отправляете переменные. FormField исправит это.

person steve    schedule 21.03.2013