首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >德尔福西雅图-发送带有自定义身体响应的邮件请求--糟糕的请求400

德尔福西雅图-发送带有自定义身体响应的邮件请求--糟糕的请求400
EN

Stack Overflow用户
提问于 2018-05-30 08:32:08
回答 2查看 6.8K关注 0票数 0

我想向外部提供者的Rest服务器发送一个Post请求。我试过用Curl,一切都很完美。这是卷曲代码:

代码语言:javascript
复制
    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里工作,我已经尝试了好几个小时。此时,我的代码如下所示:

代码语言:javascript
复制
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来检查Post命令之间是否有任何不同,看起来Delphi忽略了我的头或者破坏了我的头。在Wireshark片段中,有一个值内容类型。它应该是

代码语言:javascript
复制
Content-Type: application/json

但有了德尔菲我得到了

代码语言:javascript
复制
Content-Type: application%2Fjson, application/x-www-form-urlencoded

我也想念宝洁的关键价值。有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-30 14:33:33

经过一些研究和一些Wireshark之后,我完成了我的工作,至少在这里是这样的:我把参数放入我的请求中。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-05-30 10:40:22

您必须在TRESTRequest的方法属性中指定请求的类型

lRESTRequest.Method := TRESTRequestMethod.rmPost

Delphi附带了代码样本!

Sample

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50599948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档