【问题标题】:PHP + Guzzle, Sending Authorization Key in HeaderPHP + Guzzle,在标头中发送授权密钥
【发布时间】:2015-07-21 11:13:37
【问题描述】:

我是 Guzzle 的新手,我正在尝试生成以下 REST 调用:

https://product-search.api.cj.com/v2/product-search?website-id=1594990&keywords=%2Bsony+-camera

GET /v2/product-search?website-id=1594990&keywords=%2Bsony+-camera HTTP/1.1
Host: link-search.api.cj.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: __utma=128446558.2099392322683464700.1239639722.1239639722.1239927095.2; __utmz=128446558.1239639722.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); CONTID=8073; cjuMember=0; JSESSIONID=aM5RSWdqdd_5
Authorization: YOUR DEV KEY HERE

HTTP/1.x 200 OK
Server: Resin/2.1.17
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Thu, 26 Apr 2009 10:25:03 GMT

我正在使用以下 PHP 代码:

$client = new Client('https://linksearch.api.cj.com', array(
    'id' => $website_id,
    'keywords' => 'sony',
));
$request = $client->get("v2/link-search?website-id={id}&keywords={keywords}");
$request->addHeader('Authorization', $dev_key);
$response = $request->send();

这里的问题是,使用 addHeader() 语句我得到响应“错误请求”,而没有 addHeader() 我得到“未授权”。看来我没有正确发送我的身份验证信息。有谁知道我在这里做错了什么?

【问题讨论】:

  • 尽量避免 uri 中的参数:{id}、{keywords}。直到今天我还不能正确使用它们,出于沮丧,我最终像这样手动添加它们:$request->getQuery()->add('query', '123')。有关更多信息,请参阅 guzzlephp.org/http-client/request.html
  • - 它取决于版本,语法可能会有所不同。我建议访问此页面的人使用这里的最新版本docs.guzzlephp.org/en/latest/index.html,如果它不起作用,请不要气馁。只需严格按照说明操作,它就可以像我的情况 guzzle6 一样工作。

标签: php rest guzzle


【解决方案1】:

这里的实际问题是:

1) 标头“授权”可能区分大小写,可能需要小写。

2) 如果任何请求参数不正确,甚至是您的网站 ID,都会抛出 400 错误。 400 错误表示“请求因身份验证以外的原因而无效。”

【讨论】:

  • 有趣的是,标题区分大小写。我见过标头区分大小写的其他实例,它们都忽略了 HTTP/1.1 不应该关心标头的大小写这一事实。然而,这就是为什么 Guzzle 会尊重您提供的任何情况,而不是强制使用特定的外壳。
【解决方案2】:

我认为您创建的 $request 不正确。试试这个:

$client = new Client();
$request = new Request('POST', 'http://someuri/path/here');

然后使用 $client 发送请求:

$response = $client->send($request);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 2015-04-25
    • 2020-03-28
    • 2017-12-04
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多