Guzzle POST дает мне "не поддерживает HTTP метод 'GET'" - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь сделать простой пост API, используя Guzzle.Однако 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;
}

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

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

1 Ответ

1 голос
/ 08 июня 2019

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


"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.

...