【问题标题】:Issue posting JSON Data with REST AddBody method使用 REST AddBody 方法发布 JSON 数据的问题
【发布时间】:2022-09-28 15:58:22
【问题描述】:

我在处理POST 对我不是其所有者的 API 的请求时遇到问题。

请求必须简单地发布 JSON 数据。请看一看:

var 
  RESTRequest : TRESTRequest;
  RESTClient : TRESTClient;
  Response : TRESTResponse;
  contract : TJSONObject;

begin
  RESTClient := TRESTClient.Create(\'URL\');
  try 
    RESTRequest := TRESTRequest.Create(nil);
    try               
      contract := TJSONObject.Create;
      contract.AddPair(TJSONPair.Create(\'name\',\'my_first_contract.pdf\'));
      
      RESTRequest.Client := RESTClient;
      RESTRequest.Method := rmPOST;
      RESTRequest.Accept := \'application/json\';
      RESTRequest.AddParameter(\'j_token\',\'mytoken\',pkHTTPHEADER,poDoNotEncode);
      RESTRequest.AddBody(contract);
      RESTRequest.Execute;
      Response := RESTRequest.Response;
      ShowMessage(Response.StatusText + \' : \' + Response.Content);
  
    finally
      RESTRequest.Free;
    end;
  finally
    RESTClient.Free; 
  end;
end; 

我得到了这个错误:

未找到:{\"errors\":\"JsonConvert 中的致命错误。JsonConvert.deserializeObject() 中传递的参数 json 对象不是对象类型。\\n\"}

我在网上读到AddBody() 方法首先序列化它的内容,如果它是一个对象。在这种情况下,正文的内容是我的TJSONObject,但是当我尝试用String 替换它时,如下所示:

var
  contract : String;
  ...
begin
  contract := \'{\"name\":\"my_first_contract.pdf\"}\';
  ...
  RESTRequest.AddBody(contract, ctAPPLICATION_JSON);
  ...
end; 

我得到了完全相同的错误。

那么,这是否意味着 TJSONObject 不被视为 JsonConvert.deserializeObject() 方法的对象?或者,AddBody() 的序列化是否搞砸了?

  • 代码看起来正确。你有 API 期望的内容的例子吗?
  • 直接使用 api swagger 修改数据,我们可以看到 curl 它的作用: curl -X \'POST\' \\ \'URL\' \\ -H \'accept: application/json\' \\ -H \ 'j_token: mytoken\' \\ -H \'Content-Type: application/json\' \\ -d \'{ \"name\": \"mon_premier_contrat.pdf\" }\' 有帮助吗?
  • 您使用的是哪个 Delphi 版本?我对AddParameter 的第四个参数有点困惑,它应该是一个集合而不是一个整数。您可以尝试将其替换为[poDoNotEncode]
  • 我认为它是 Delphi 10.3,尽管当我看到他时我仍会询问首席开发人员。使用我的前辈编写的以前的代码来学习 delphi,我看到他们用整数 0 填充最后一个参数,可能是为了避免因为不放任何东西而出错。我养成了这个坏习惯。用 poDoNotEncode 替换它时,错误不会改变。将此整数作为第 4 个参数,请求仍然有效,因为否则我会收到类似 \'j_token header required\' 的错误。
  • 恕我直言,Embarcadero 的 REST 组件设计得不是很好。他们有很多问题。如果不是因为它们的跨平台支持,我会说永远不要使用它们。但这只是我的观点。

标签: rest delphi


【解决方案1】:

问题出在“j_token”标题上:当我试图解决它时,一些朋友想帮助我,但我不想给他们访问令牌,因为它是我公司独有的。他们仍然尝试使用虚假令牌访问 api,结果与我得到的错误相同:

未找到:{“errors”:“JsonConvert 中的致命错误。JsonConvert.deserializeObject() 中传递的参数 json 对象不是对象类型。\n”}

多亏了这一点,我可以推断出问题出在 j_token 上。在设置我自己的 api 之后,我可以看到我发布的内容,然后我看到我的“j_token”标头仍在被编码,即使我在我的AddParameter 方法中添加了poDoNotEncode 选项。

如果你偶然发现同样的问题,我在这个论坛上创建了一个新帖子来寻找那个 poDoNotEncode 错误:Trouble with poDoNotEncode option in TRESTRequest.AddParameter() method

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2016-07-02
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多