TRESTRequest:如何查询字符串参数添加到PUT请求

问题描述:

我使用的是德尔福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

通过使用此语法添加一个参数:

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

无法使用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服务器行为,请改变它,否则使用解决方法。