JSON, отправленный с помощью Indy, не принимается, так как он отправляется с помощью Stripe API

#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;