Delphi Seattle - отправка почтового запроса с пользовательским телом. Ответ неверный 400 - PullRequest
0 голосов
/ 30 мая 2018

Я хотел бы отправить Почтовый запрос на Сервер Отдыха внешнего Провайдера.Я попробовал с Curl, и все работает отлично.Вот код CURL:

    curl -X POST -H 'PRODUCT-KEY: SUperL0ngAndSpecialSecretCode' -H 'Content-Type: application/json' -H 'Authorization: Basic CrytedWorksalsowellwithotherget' -i 'http://myserver:8080/rest.svc/v1.0/query' --data '{
"query":"SELECT Name from Address where name like '\''%me%'\''"
}'

В Curl все отлично работает.Я несколько часов пытался заставить этот Код работать в Delphi.В настоящее время мой код выглядит следующим образом:

function GetSomeInformation: string;
var
  lrestrequest: TRESTRequest;
  lRestClient: TRESTClient;
  lRestResponce: TRESTResponse;
begin
  result := '';
  lRestClient := TRESTClient.Create('http://myserver:8080/rest.svc/v1.0/query');
  try
    lrestrequest := TRESTRequest.Create(nil);
    try
      lRestResponce := TRESTResponse.Create(nil);
      try
        lrestrequest.Client := lRestClient;
        lrestrequest.Response := lRestResponce;
        lrestrequest.Method := rmPost;
        lrestrequest.Params.AddItem('PRODUCT-KEY',
          'SUperL0ngAndSpecialSecretCode',
          TRESTRequestParameterKind.pkHTTPHEADER);
        lrestrequest.Params.AddItem('Content-Type', 'application/json',
          TRESTRequestParameterKind.pkHTTPHEADER);
        lrestrequest.Params.AddItem('query',
          ansitoutf8('SELECT Name from Address where Name like ' +
          quotedstr('%me%')), TRESTRequestParameterKind.pkREQUESTBODY);
        lrestrequest.Execute;
        if not lRestResponce.Status.Success then
          showmessage(lRestResponce.StatusText + ' ' +
            inttostr(lRestResponce.StatusCode))
        else
          result := lRestResponce.Content;
      finally
        lRestResponce.Free;
      end;
    finally
      lrestrequest.Free
    end;
  finally
    lRestClient.Free;
  end;
end;

Я понятия не имею, что делать дальше, чтобы выполнить работу?Любые идеи или способы, которыми я могу лучше решить проблемуЗаголовок.Во фрагменте Wireshark есть значение Content-Type.Это должно быть

Content-Type: application/json

Но с Delphi я получаю

Content-Type: application%2Fjson, application/x-www-form-urlencoded

И я также пропускаю значение ключа Procduct-Key.Есть предложения?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

после некоторых исследований и некоторых Wireshark я выполнил свою работу, по крайней мере, вот так, как я добавляю параметры в свой запрос.

function GetSomeInformation: string;
var
  lrestrequest: TRESTRequest;
  lRestClient: TRESTClient;
  lRestResponce: TRESTResponse;
begin
  result := '';
  lRestClient := TRESTClient.Create('http://myserver:8080/rest.svc/v1.0/query');
  try
    lrestrequest := TRESTRequest.Create(nil);
    try
      lRestResponce := TRESTResponse.Create(nil);
      try
        lrestrequest.Client := lRestClient;
        lrestrequest.Response := lRestResponce;
        RESTRequest1.Params.Clear;
        RESTRequest1.Method:=rmpost;
        RESTResponse1.RootElement := '';
        lparam := RESTRequest1.Params.AddItem;
        lparam.name := 'PRODUCT-KEY';
        lparam.Value := 'SpecialKeyButWithSomeTrickyCharsLike==';
        lparam.ContentType := ctNone;
        lparam.Kind := pkHTTPHEADER;
        //This one is Important otherwise the '==' will get url encoded
        lparam.Options := [poDoNotEncode];

        lparam := RESTRequest1.Params.AddItem;
        lparam.name := 'data';
        lparam.Value := '{"query":"' + SelectString + '"}';
        lparam.ContentType := ctAPPLICATION_JSON;
        lparam.Kind := pkGETorPOST;
        lrestrequest.Execute;
        if not lRestResponce.Status.Success then
          showmessage(lRestResponce.StatusText + ' ' +
            inttostr(lRestResponce.StatusCode))
        else
          result := lRestResponce.Content;
      finally
        lRestResponce.Free;
      end;
    finally
      lrestrequest.Free
    end;
  finally
    lRestClient.Free;
  end;
end;

Спасибо за поддержку!

PJM

0 голосов
/ 30 мая 2018

Вы должны указать тип запроса в свойстве Method TRESTRequest

lRESTRequest.Method: = TRESTRequestMethod.rmPost

Delphi поставляется с примерами кода!

http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/REST.RESTDemo_Sample

...