Guzzle POST дает мне не поддерживает HTTP-метод 'GET'

Я пытаюсь сделать простой пост API с помощью Guzzle. Однако API продолжает возвращать ошибку «UnsupportedApiVersion [Message] => Запрошенный ресурс с версией API« 1 »не поддерживает HTTP-метод« GET »».

При создании простого сообщения через почтальона с использованием заголовка Content-Type: application / json и простого тела:

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

Он работает нормально, и я получаю ожидаемый результат.

Однако при использовании следующего кода я продолжаю получать ошибку метода GET is not supported.


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;
}

Вместо использования json я попробовал form_params, который дает тот же результат.

Я использую Guzzle 6.3.3


person Renee Thomassen    schedule 06.06.2019    source источник
comment
Трудно точно определить, что может пойти не так, но пробовали ли вы заменить ключ json на query?   -  person dearsina    schedule 06.06.2019
comment
Использование query, к сожалению, дает тот же результат   -  person Renee Thomassen    schedule 06.06.2019


Ответы (1)


Несколько вопросов:


"UnsupportedApiVersion [Message] => Запрошенный ресурс с API версии '1' не поддерживает HTTP-метод 'GET'

Это указывает на проблему с несовпадающим запросом, когда вместо POST было отправлено GET, что указывает либо на проблему с базовым механизмом, который использует Guzzle (cURL, поток PHP или пользовательский), либо на что-то в запросе, принуждение Guzzle к созданию GET. Вы проверили, действительно ли это происходит, и точно ли сообщает API? Вы можете либо var_dump($res); проверить, либо сформировать запрос как отдельную переменную через $req = client->createRequest('post',...), а затем проверить $req->getMethod() после отправки запроса на основе этот StackOverflow QA.

Глядя на эту ветку, похоже, что перенаправления являются частой причиной этого, поскольку Например, если URL-адрес, который у вас есть в вашем PHP, отличается от того, который работает в Postman, и в нем есть опечатка. Вы также можете попробовать отключить перенаправление, установив параметр с помощью 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.

person Joshua T    schedule 08.06.2019