2014-09-25 127 views
4

我使用的是德爾福REST.Client成分,並要送這樣的請求:TRESTRequest:如何查詢字符串參數添加到PUT請求

PUT http://hostname/api/items?arg=value 

下面是我使用的代碼:

req := TRESTRequest.Create(nil); 
req.Client := FRESTClient; 
req.Method := TRESTRequestMethod.rmPUT; 
req.Resource := 'api/items'; 
req.AddParameter('arg', 'value'); 
req.AddBody(someJSONObject); 
req.Execute; 

但是,Fiddler表示參數是而不是被包含在請求中,並且服務器拒絕格式嚴重的請求。

PUT http://hostname/api/items HTTP/1.1 
Content-Type: application/json 
Content-Length: 123 
Connection: keep-alive 
Host: hostname 
Accept: application/json, text/plain; q=0.9, text/html;q=0.8, 
Accept-Charset: UTF-8, *;q=0.8 
Accept-Encoding: identity 
User-Agent: Embarcadero RESTClient/1.0 

在Delphi調試器,我可以看到,所使用的是parameter kindpkGETorPOST(缺省值)。我沒有看到Kind的任何價值,看起來他們會解決這個問題。

任何想法我做錯了什麼?許多這些類別的文檔是notveryhelpful

+1

您是否嘗試過簡單地將參數追加到資源屬性,比如'api/items?arg = value'? – mjn 2014-11-02 10:00:14

回答

-1

通過使用此語法添加一個參數:

FRESTRequest.Params.AddItem('Accept', 
          'application/json, */*; q=0.01', 
          TRESTRequestParameterKind.pkHTTPHEADER); 

其中TRESTRequestParameterKind可以採取其中用於POSTPUT命令值

pkGETorPOST 

+0

是',*/*;實際需要q = 0.01? IIRC這允許服務器發送不同於JSON的內容類型,但這對於Delphi REST庫不是有用的 – mjn 2014-11-02 09:54:47

+0

pkHTTPHEADER是否正確? HTTP標頭不包含查詢字符串參數。 – mjn 2014-11-02 09:58:39

2

無法使用TRESTRequestrmPOST/rmPUT將參數置入查詢部分。

GETpkGETorPOST參數放入所述查詢的一部分,但在POST/PUT這些參數被放置到請求機構。這是設計的。

有一個 - 好,醜 - 解決方法

req := TRESTRequest.Create(nil); 
req.Client := FRESTClient; 
req.Method := TRESTRequestMethod.rmPUT; 
req.Resource := 'api/items?arg={arg}'; 
req.AddParameter( 
    { AName } 'arg', 
    { AValue } 'value', 
    { AKind } TRESTRequestParameterKind.pkURLSEGMENT); 
req.AddBody(someJSONObject); 
req.Execute; 

normal REST PUT request(由我預期)會是這樣的

 
PUT http://hostname/api/items/item17 

,這是由德爾福REST客戶端處理

req.Method := TRESTRequestMethod.rmPUT; 
req.Resource := 'api/items/{itemid}'; 
req.AddParameter( 
    { AName } 'itemid', 
    { AValue } 'item17', 
    { AKind } TRESTRequestParameterKind.pkURLSEGMENT); 
req.AddBody(someJSONObject); 

在我的REST服務器上,我使用標頭獲取更多數據

FRESTClient.AddParameter( 
    { AName } 'context', 
    { AValue } 'foocontext', 
    { AKind } TRESTRequestParameterKind.pkHTTPHEADER); 

req.Method := TRESTRequestMethod.rmPOST; 
req.Resource := 'api/items'; 
req.AddBody(someJSONObject); 

如果有可能更改REST服務器行爲,請改變它,否則使用解決方法。

相關問題