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

我正在使用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 kind是pkGETorPOST(默认值).我没有看到Kind的任何值似乎他们会解决这个问题.

我有什么想法我做错了吗?许多这些课程的文件是not very helpful.

最佳答案 使用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

这是由Delphi 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服务器行为更改它,否则使用变通方法.

点赞