gpt4 book ai didi

delphi - TREST请求 : How to add query string parameters to a PUT request

转载 作者:行者123 更新时间:2023-12-03 15:32:26 24 4
gpt4 key购买 nike

我正在使用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 .

最佳答案

无法使用 TRESTRequestrmPOST/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

and this is handled by the Delphi REST client

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

在我的 REST 服务器上,我使用 header 来获取附加数据

FRESTClient.AddParameter( 
{ AName } 'context',
{ AValue } 'foocontext',
{ AKind } TRESTRequestParameterKind.pkHTTPHEADER );

req.Method := TRESTRequestMethod.rmPOST;
req.Resource := 'api/items';
req.AddBody( someJSONObject );

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

关于delphi - TREST请求 : How to add query string parameters to a PUT request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26046164/

24 4 0