Guzzle POST给我“不支持HTTP方法'GET'”

时间:2019-06-06 10:42:10

标签: php guzzle guzzle6

我正在尝试使用Guzzle做一个简单的API帖子。但是,API始终返回错误“ UnsupportedApiVersion [Message] =>具有API版本'1'的请求资源不支持HTTP方法'GET'。”

使用Content-Type通过邮递员进行简单发布时:application / json标头和简单正文:

{
"Username" : "xxxxxxx",
"Password" : "xxxxxxx",
"ApplicationID" : "xxxxxxx",
"DeveloperID" : "xxxxxxx"
}

它工作正常,我得到预期的结果。

但是,当使用以下代码时,我一直在获取方法GET不支持的错误。


public function connect()
{
   $client = new Client([
      'base_uri' => $this->url,
      'headers' => [
          'Accept' => 'application/json',
          'Content-Type' => 'application/json',
      ],
      'http_errors' => $this->getHttpErrors(),
    ]);
    return $client;
}

public function login()
{
    $client = $this->connect();
    $res = $client->post($this->url.'auth/signin', [
        'json' => [
            'ApplicationID' => xxxxxx,
            'DeveloperID'   => xxxxxx,
            'Username' => xxxxxx,
            'Password' => xxxxxx
        ]
    ]);

    $results = json_decode($res->getBody());
    return $results;
}

我尝试使用“ form_params”,而不是使用“ json”,这给了我相同的结果。

我正在使用Guzzle 6.3.3

1 个答案:

答案 0 :(得分:1)

一些问题:


  

“ UnsupportedApiVersion [Message] =>具有API版本'1'的请求资源不支持HTTP方法'GET'

这表明请求不匹配的问题-发送了GET而不是POST,这表明Guzzle使用的基础机制存在问题(cURL,PHP流或自定义),或迫使Guzzle进行GET的请求中的某些内容。您是否检查过这是否确实在发生,并且API正确报告了?您可以var_dump($res);进行检查,也可以通过$req = client->createRequest('post',...)将请求形成为单独的变量,然后在基于this StackOverflow QA发送请求之后检查$req->getMethod()

this thread看,重定向似乎是导致这种情况的常见原因-例如,如果您的PHP中的URL与Postman中使用的URL不同,并且存在错字在里面。您也可以尝试通过setting the option with Guzzle禁用重定向,方法是

$res = $client->post($this->url.'auth/signin', [
    'json' => [
        'ApplicationID' => xxxxxx,
        'DeveloperID'   => xxxxxx,
        'Username' => xxxxxx,
        'Password' => xxxxxx
    ],
    'allow_redirects' => false
]);

作为旁注,base_uri的意义在于做到这一点,因此您所要做的就是在调用请求方法时指定路径。由于您已经将base_uri定义为$this->url,因此可以将其设置为:

$res = $client->post($this->url.'auth/signin', ...

进入:

$res = $client->post('auth/signin', ...

另外,请注意上述内容,因为这实际上是形成格式错误的URL的简便方法-尤其是因为您没有共享代码中$this->url的值。


此外,您提到使用form_params尝试请求。确保这样做时也要换出Content-Type标头-例如设置为application/x-www-form-urlencoded