2014-09-25 39 views
2

我想發在身體中含有JSON對象的數組,像這樣的PUT請求的主體:TRESTRequest:如何添加一個數組作爲PUT請求

PUT http://hostname/api/items 
[{"ID":1},{"ID":2},...] 

使用如下代碼,我可以在體內與單個TJSONObject容易發送POST請求:

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

的Fiddler示出了請求爲具有正確的內容:

{"ID",1} 

不過,如果我使用一個PUT請求,並添加TJSONArray作爲身體,而不是...

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

提琴手顯示要求爲具有奇異的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}],... 

它看起來像原始內存中對象的某種低級別序列化,而不是預期的JSON數組內容。

任何想法我做錯了什麼? AddBody方法上的documentation不是很有幫助。

回答

3

回答我的問題...

的AddBody方法的重載包括:

procedure AddBody(AObject: TJSONObject); 
procedure AddBody<T>(AObject: T); 

我曾以爲TJSONArray從TJSONObject而來,因此將使用第一超載,但實際上兩者類來自TJSONValue。因此,TJSONObject重載不是用於我的情況,而是泛型重載,這在某種較低級別的序列化中顯然成功。

由於是TJSONArray沒有直接的過載,而我使用的是不指望一個JSON陣列封裝在對象中的API,我這樣做,而不是:

req.AddBody(ja.ToJSON, ctAPPLICATION_JSON); 

此序列化數組到字符串,然後指定內容類型爲application/json

+0

謝謝你SOOOOOOO張貼您的問題的答案。幫助我出去了很多! – Pascal 2016-08-31 00:14:24