Как перевести команду CURL в Delphi - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь использовать компоненты Delphi 10.2 TREST с AWS.У меня есть команда CURL, которая работает:

curl -X POST --data @GetIDData.json -H "X-Amz-Target: AWSCognitoIdentityService.GetId" -H "Content-Type: application/x-amz-json-1.1" https://cognito-identity.us-east-1.amazonaws.com/

GetIDData.json содержит это:

{"IdentityPoolId":"us-east-1:XXXXXXXXXXXXXXXXXXXXX"}

Успешный результат таков:

{"IdentityId":"us-east-1:XXXXXXXXXXXXXXXXXXXXX"}

Мне бы хотелосьдля дублирования этого результата с использованием компонентов Delphi TREST:

    ...
    fClient := TRESTClient.Create('https://cognito-identity.us-east-1.amazonaws.com/');
    fClient.SetHTTPHeader('Content-Type', 'application/x-amz-json-1.1');
    fClient.SetHTTPHeader('X-Amz-Target', 'AWSCognitoIdentityService.GetId');
    fRequest := TRESTRequest.Create(nil);
    fRequest.Client := fClient;
    fRequest.Method := TRESTRequestMethod.rmPOST;
//    fRequest.AddBody('{"IdentityPoolId":"us-east-1:XXXXXXXXXXXXXXXXXXXXX"}', ctAPPLICATION_JSON);
    lJObj := TJSONObject.Create;
    lJObj.AddPair('IdentityPoolId', 'us-east-1:XXXXXXXXXXXXXXXXXXXXX');
    fRequest.AddBody(lJObj);
    fRequest.Execute;
    str := fRequest.Response.Content;
    ...

Но результатом является ошибка:

{"Output":"__type":"com.amazon.coral.service#UnknownOperationException","message":null},"Version":"1.0"}

Загрузка OpenSSL и помещение dll в System32 не помогло.

Может кто-нибудь сказать мне, что я делаю не так?

Спасибо

Дэвид

1 Ответ

0 голосов
/ 07 мая 2019

Это работает:

...
    lClient := TRESTClient.Create('https://cognito-identity.us-east-1.amazonaws.com/');
    lRequest := TRESTRequest.Create(nil);
    lRequest.Client := lClient;
    lRequest.Method := TRESTRequestMethod.rmPOST;

    lParam := lRequest.Params.AddItem;
    lParam.name := 'X-Amz-Target';
    lParam.Value := 'AWSCognitoIdentityService.GetId';
    lParam.ContentType := ctNone;
    lParam.Kind := pkHTTPHEADER;

    lParam := lRequest.Params.AddItem;
    lParam.name := 'Content-Type';
    lParam.Value := 'application/x-amz-json-1.1';
    lParam.ContentType := ctNone;
    lParam.Kind := pkHTTPHEADER;
    lParam.Options := [poDoNotEncode];

    lRequest.AddBody('{"IdentityPoolId":"us-east-1:XXXXXXXXXXXXXXXXXXXXX"}', ctAPPLICATION_JSON);

    lRequest.Execute;
...

WireShark был не так полезен, как я хотел, потому что его документ устарел, и я использую шифрование.Но сайт, упомянутый @Christophe Morio в этой публикации, позволил найти решение проблемы.

...