Одноногий клиент OAuth 1.0 «Несанкционированная ошибка HTTP 401» для метода PATCH

0

Это первый раз, когда я использую OAuth, и я создал класс ниже, который частично работает! Я следовал этому руководству.

Методы methodGet() и methodPost() работают нормально, но methodPatch() возвращает "HTTP 401 Unauthorized error". Конечная точка ожидает метод запроса PATCH и поскольку в классе OAuth нет константы для PATCH, я пытаюсь отправить запрос POST и пытаюсь переопределить его с помощью дополнительного заголовка X-Http-Method-Override чтобы он стал Метод PATCH за сценой (может быть, нет !!!). В этом проблема, я не могу ПУТЬ!

Поскольку это очень вероятно, что с PATCH (GET и POST работают нормально), кто-нибудь знает какое-либо решение или я пропущу что-то еще?

Примечание. Я могу подтвердить, что конечная точка работает нормально, поэтому на этой стороне нет проблем.

заранее спасибо

use Exception;
use OAuth;
use OAuthException;

class ApiClient
{
    // End-point accepts GET request - This works fine
    public function methodGet()
    {
        return $this->call(
            OAUTH_HTTP_METHOD_GET,
            array('id' => 123)
        );
    }

    // End-point accepts POST request - This works fine
    public function methodPost()
    {
        return $this->call(
            OAUTH_HTTP_METHOD_POST,
            array('name' => 'inanzzz')
        );
    }

    // End-point accepts PATCH request - This returns HTTP 401 Unauthorized
    public function methodPatch()
    {
        return $this->call(
            OAUTH_HTTP_METHOD_POST,
            array('id' => 123, 'name' => 'inanzzz123'),
            ['X-Http-Method-Override' => 'PATCH']
        );
    }

    private function call($method, $params = array(), $headers = array())
    {
        try {
            $oAuth = new OAuth('api_key_goes_here', 'api_secret_goes_here');
            $oAuth->setNonce(md5(uniqid(mt_rand(), true)));
            $oAuth->setTimestamp(time());
            $oAuth->setVersion('1.0');
            $oAuth->fetch(
               'http://api.domain.com/1/products/service.json',
               $params, $method, $headers
            );

            return json_decode($oAuth->getLastResponse(), true);
        } catch (OAuthException $e) {
            throw new Exception($e->getMessage(), $e->getCode());
        }
    }
}
Теги:
oauth

1 ответ

0
Лучший ответ

Решение заключалось в том, чтобы использовать Guzzle Client, поэтому метод ниже:

Примечание: $authHeader содержит $oauth->getRequestHeader(...); поэтому вы можете сгенерировать его и передать его методу.

private function call($uri, $method, $authHeader, array $payload = [])
{
    try {
        $client = new Client();
        $request = $client->createRequest($method, $uri);
        $request->addHeader('Authorization', $authHeader);
        $request->addHeader('Content-Type', 'application/json');
        $request->setBody(Stream::factory(json_encode($payload)));
        $response = $client->send($request);
    } catch (RequestException $e) {
        $message = $e->hasResponse()
            ? $e->getResponse()
            : 'An unknown error occurred while trying to process your request.';

        throw new Exception($message);
    }

    return json_decode($response->getBody(), true);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню