#delphi #indy
Вопрос:
Я отправляю JSON с компонентом http Indy в API stripe, но он не принимается API, поскольку он должен быть получен, когда я получаю ответ «Неверный запрос» .:
jsnObj := TJSONObject.Create;
jsnObj.AddPair('amount', TJSONNumber.Create('111'));
jsnObj.AddPair('currency', 'eur');
jsnObj.AddPair('customer', 'cus_JNxQsqf6BoK8Rt');
jsnObj.AddPair('description', 'My First Test');
ss := TStringStream.Create(jsnObj.ToString, TEncoding.UTF8);
rs := TStringStream.Create;
IdHTTP1.Request.BasicAuthentication := True;
IdHTTP1.Request.Username := ApiKey ; // test private key
IdHTTP1.Post('https://api.stripe.com/v1/charges', ss, rs);
StatusBar1.SimpleText := IdHTTP1.ResponseText;
JSON, предназначенный для отправки, является:
{
"amount": 111,
"currency": "eur",
"customer": "cus_JNxQsqf6BoK8Rt",
"description": "My First Test"
}
Панель мониторинга API сообщает, что получила это:
{
"{"amount":111,"currency":"eur","customer":"cus_JNxQsqf6BoK8Rt","description":"My First Test"}": null
}
Компонент HTTP должен что-то делать, чтобы он отправлялся таким образом, включая нулевое значение, возможно, из-за включения имени пользователя в запрос? С другими API-интерфейсами один и тот же HTTP-компонент всегда отправляет то, что он должен отправлять. Поддержка полосы указывает на то, что проблема на моей стороне.
Документ stripe указывает это:
curl -X POST https://api.stripe.com/v1/charges
-u STRIPE_SECRET_KEY:
-d amount=2000
-d currency=usd
-d source=tok_visa
-d description="Charge for aiden.jones@example.com"
У кого-нибудь есть хоть какое-то представление о том, в чем проблема?
Ответ №1:
Пример CURL, приведенный в документации Stripe, вообще не отправляет данные в формате JSON. Вместо этого он отправляет name=value
пары в application/x-www-form-urlencoded
формате, согласно документации CURL:
-d, —данные
(HTTP MQTT) Отправляет указанные данные в запросе POST на HTTP-сервер таким же образом, как это делает браузер, когда пользователь заполняет HTML-форму и нажимает кнопку отправить. Это приведет к тому, что curl передаст данные на сервер с помощью приложения типа содержимого/x-www-форма-url-код. Сравните с-F, —форма.
Используйте TStrings
перегрузку TIdHTTP.Post()
при отправке application/x-www-form-urlencoded
запроса, например:
var
postData: TStringList;
rs: string;
...
postData := TStringList.Create;
try
postData.Add('amount=111');
postData.Add('currency=eur');
postData.Add('customer=cus_JNxQsqf6BoK8Rt');
postData.Add('description=My First Test');
IdHTTP1.Request.BasicAuthentication := True;
IdHTTP1.Request.Username := ApiKey; // test private key
rs := IdHTTP1.Post('https://api.stripe.com/v1/charges', postData);
StatusBar1.SimpleText := IdHTTP1.ResponseText;
finally
postData.Free;
end;