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

时间:2014-09-25 19:04:53

标签: delphi rest

我正在使用Delphi REST.Client组件,并希望发送这样的请求:

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的任何值,看起来他们会解决这个问题。

任何想法我做错了什么?许多这些课程的文档是not very helpful

2 个答案:

答案 0 :(得分:3)

使用TRESTRequest / rmPOST的{​​{1}}无法将参数输入查询部分。

rmPUT上,GET参数会被放入查询部分,但在pkGETorPOST / POST上,这些参数会被放入请求正文中。这是按照设计的。

有一个 - 好的,丑陋的 - 解决方法

PUT

normal REST PUT request(我想到的)就是这样的

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

这是由Delphi REST客户端

处理的
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;

在我的REST服务器上,我使用标题来获取其他数据

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

如果有可能更改REST服务器行为,请更改它,否则请使用解决方法。

答案 1 :(得分:-1)

使用以下语法添加参数:

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

其中TRESTRequestParameterKind可以取值

pkGETorPOST

用于POSTPUT命令。