【发布时间】:2019-12-10 11:23:46
【问题描述】:
我已经在 PostMan 中测试了 POST 函数,以使用以下正文参数执行 POST 函数:
这里是 eBay 的这个功能的文档:
HTTP method: POST
URL (Sandbox): https://api.sandbox.ebay.com/identity/v1/oauth2/token
HTTP headers:
Content-Type = application/x-www-form-urlencoded
Authorization = Basic <B64-encoded-oauth-credentials>
Request body:
grant_type=authorization_code
code=<authorization-code-value>
redirect_uri=<RuName-value>
我的第一次尝试如下:
function udxEBayExchangeAuthCodeForUserToken(AAuthCode: String; AIsProduction: Boolean): String;
var
xRequestBody: TStringStream;
begin
with objHTTP.Request do begin
CustomHeaders.Clear;
ContentType := 'application/x-www-form-urlencoded';
CustomHeaders.Values['Authorization'] := 'Basic ' + 'V2VpbmluZ0MtV2VpbmluZ0M';
end;
xRequestBody := TStringStream.Create('grant_type=' + 'authorization_code' + ','
+ 'code=' + 'v%5E1.1%23i%5E1%23f%5E0%23r%5E1%23I%5E3%23p%5E3' + ','
+ 'redirect_uri=' + 'myredirecturlnameinsandbox',
TEncoding.UTF8);
try
try
Result := objHTTP.Post('https://api.sandbox.ebay.com/identity/v1/oauth2/token', xRequestBody);
except
on E: Exception do
ShowMessage('Error on request: ' + #13#10 + e.Message);
end;
finally
xRequestBody.Free;
end;
end;
第二次尝试使用下面的 Body 代码
xRequestBody := TStringStream.Create('grant_type=' + 'authorization_code' + '&'
+ 'code=' + AAuthCode + '&'
+ 'redirect_uri=' + gsRuName,
TEncoding.UTF8);
两次尝试都给出 HTTP/1.1 400 Bad Request。
我在 Stack Overflow 中进行了一些搜索,这是最接近的问题。唯一不同的部分是 POST 的正文。
谁能告诉我分配 POST 正文部分的正确方法是什么? 谢谢。
【问题讨论】:
-
代码中有几处你做错了。除此之外,您说您收到了
400 Bad Request,但这与 Postman 中的相同。那么这里真正的问题是什么?如何通过邮递员邮寄?如何通过 Indy 发布?如何使用易趣 API?无论如何,我将您的示例代码粘贴到 Delphi 10.2 中的普通 VCL 应用程序中,我得到了401 Unathorized。有什么你没有给我们看的吗? -
@PeterWolf 感谢您的帮助。示例代码中未完全粘贴三个参数(['Authorization']、'code='、'redirect_uri=')。此 POST 调用之后是另一个 GET 调用,以获取 POST 正文中的代码值,该代码在 eBay 授予后 299 秒后过期。使用您的 cmets,现在我发现 Postman 的状态为“400 Bad Request”。让我在 Postman 中进行更多测试。
-
一个问题:{ "error": "invalid_grant", "error_description": "提供的授权授权码无效或已发给另一个客户端" } 这个消息是显示在 Postman 中,我认为这是来自服务器的反馈。如果是这样,这是否意味着 POST 调用正常但授权码无效?谢谢。
-
是的,您的 POST 请求已发送到服务器,并以 JSON 内容进行响应。服务器提示为什么请求无法成功服务(401 - 授权问题,400 - 格式错误的请求)。在我的第一条评论中,我写道您的代码中有一些问题。请参阅 Remy 的回答,这几乎总结了它们。
-
@PeterWolf 感谢您的快速回复。我正在用 Remy 的代码做更多的测试。
标签: delphi http-post ebay-api idhttp x-www-form-urlencoded