我正在使用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服务器行为更改它,否则使用变通方法.