【发布时间】: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 组件设计得不是很好。他们有很多问题。如果不是因为它们的跨平台支持,我会说永远不要使用它们。但这只是我的观点。