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的任何价值,看起来他们会解决这个问题。
答
通过使用此语法添加一个参数:
FRESTRequest.Params.AddItem('Accept',
'application/json, */*; q=0.01',
TRESTRequestParameterKind.pkHTTPHEADER);
其中TRESTRequestParameterKind
可以采取其中用于POST
和PUT
命令值
pkGETorPOST
。
答
无法使用TRESTRequest
与rmPOST
/rmPUT
将参数置入查询部分。
在GET
的pkGETorPOST
参数放入所述查询的一部分,但在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服务器行为,请改变它,否则使用解决方法。
您是否尝试过简单地将参数追加到资源属性,比如'api/items?arg = value'? – mjn 2014-11-02 10:00:14