TRESTRequest:如何将数组添加为 PUT 请求的正文

Bob*_*ers 3 delphi rest json

我想发送一个 PUT 请求,其中正文包含一组 JSON 对象,如下所示:

PUT http://hostname/api/items
[{"ID":1},{"ID":2},...]
Run Code Online (Sandbox Code Playgroud)

使用如下代码,我可以轻松地发送一个带有单个 TJSONObject 主体的 POST 请求:

req := TRESTRequest.Create(nil);
req.Client := FRESTClient;
req.Method := TRESTRequestMethod.rmPOST;
req.Resource := 'api/items';
req.AddBody(someJSONObject);
req.Execute;
Run Code Online (Sandbox Code Playgroud)

Fiddler 将请求显示为具有正确的内容:

{"ID",1}
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用 PUT 请求并添加 TJSONArray 作为正文...

ja := TJSONArray.Create;
for jo in someJSONObjects do
  ja.Add(jo);
req.Method := TRESTRequestMethod.rmPUT;
req.AddBody(ja);
Run Code Online (Sandbox Code Playgroud)

Fiddler 将请求显示为有一大堆奇怪的 JSON 内容:

{"elements":{"items":[{"members":{"items":[{"jsonString":{"strBuffer":{"data":["I","D","","","","","","","","","","","","","",""],"length":2,"maxCapacity":2147483647},"owned":true},"jsonValue":{"strBuffer":{"data":["1","","","","","","","","","","","","","","",""],"length":1,"maxCapacity":2147483647},"owned":true},"owned":true}],...
Run Code Online (Sandbox Code Playgroud)

它看起来像是原始内存对象的某种低级序列化,而不是预期的 JSON 数组内容。

知道我做错了什么吗?AddBody 方法的文档不是很有帮助。

Bob*_*ers 6

回答我自己的问题...

AddBody 方法的重载包括:

procedure AddBody(AObject: TJSONObject);
procedure AddBody<T>(AObject: T);
Run Code Online (Sandbox Code Playgroud)

我曾假设 TJSONArray 是从 TJSONObject 派生的,因此会使用第一个重载,但实际上这两个类都是从 TJSONValue 派生的。因此,在我的例子中没有使用 TJSONObject 重载,而是使用泛型重载,它显然在某种较低级别的序列化中取得了成功。

由于 TJSONArray 没有直接重载,而且我使用的 API 不期望包含在对象中的 JSON 数组,我改为这样做:

req.AddBody(ja.ToJSON, ctAPPLICATION_JSON);
Run Code Online (Sandbox Code Playgroud)

这会将数组序列化为字符串,然后将内容类型指定为application/json