使用REST AddBody方法发布发布JSON数据

eoigrqb6  于 2022-10-16  发布在  其他
关注(0)|答案(1)|浏览(245)

我在向API发出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.desializeObject()中传递的参数json对象不是Object类型。\n”}
我在网上读到,如果AddBody()方法是对象,则它首先序列化其内容。在本例中,正文的内容是my TJSONObject,但当我尝试将其替换为String时,如下所示:

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

我也收到了完全相同的错误。
那么,这是否意味着TJSONObject不被视为JsonConvert.deserializeObject()方法的对象呢?或者,AddBody()的序列化搞砸了?

lfapxunr

lfapxunr1#

问题出在‘j_Token’头上:当我试图解决这个问题时,一些朋友想要帮助我,但我不想给他们访问令牌,因为它是我公司独有的。他们仍然试图使用虚假令牌访问API,结果与我收到的错误相同:
找不到:{“Errors”:“JsonConvert中出现致命错误。JsonConvert.desializeObject()中传递的参数json对象不是Object类型。\n”}
多亏了这一点,我可以推断出问题出在j_令牌上。在设置了我自己的API之后,我可以查看我发布的内容,然后我发现,尽管我向AddParameter方法添加了poDoNotEncode选项,但我的‘j_Token’头仍然在编码。
我在这个论坛上创建了一个新帖子,如果你遇到同样的问题:Trouble with poDoNotEncode option in TRESTRequest.AddParameter() method,我会寻找poDoNotEncode错误

相关问题