我正在使用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的任何值,看起来他们会解决这个问题。
答案 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
用于POST
和PUT
命令。