GuzzleHTTP возвращает 404 на существующей странице - PullRequest
0 голосов
/ 20 апреля 2019

Запрос My Guzzle POST на https://api.scarif.dev/auth возвращает 404, в то время как страница существует через Почтальон, или браузер, или javascript.Он должен возвращать 200 с сообщением 401, но Guzzle возвращает 404. В обоих режимах POST и GET это.

Я пробовал несколько настроек клиента, включая разные заголовки и отключение проверки SSL, но безлюбой успех.Теперь я скопировал те же самые заголовки, которые сделали его работающим в почтальоне, но все еще безуспешно.

Я искал в google и stackoverflow, но не смог найти ответ, который решил мою проблему.

Запрос в PHP:

<?php
$client = new Client([
    'header' => [
        'Accept' => 'application/json',
        'Content-Type' => 'application/x-www-form-urlencoded'
    ],
    'verify' => false
]);

$response = $client->request('POST', 'https://api.scarif.dev/auth', [
    'form_params' => []
]);

echo $response->getBody()->getContents();
?>

Ожидаемый результат:

{
    "detail": "https://login.scarif.dev",
    "status": 401,
    "title": "Unauthorized",
    "type": "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html"
}

Фактический результат:

Неустранимая ошибка: Uncaught GuzzleHttp \ Exception \ ClientException: ошибка клиента: POST https://api.scarif.dev/auth привел к ответу 404 Not Found: 404 Не найдено

Не найдено (усечено ...) в /home / admin / domains / login.scarif.dev / framework / vendor / guzzlehttp / guzzle / src / Exception / RequestException.php: 113 Трассировка стека: # 0 /home/admin/domains/login.scarif.dev/framework/vendor/guzzlehttp/guzzle/src/Middleware.php(66): GuzzleHttp \ Exception \ RequestException :: create (Объект (GuzzleHttp \ Psr7 \ Запрос), Объект (GuzzleHttp \ Psr7 \ Response)) # 1 / home / admin / domains /login.scarif.dev/framework/vendor/guzzlehttp/promises/src/Promise.php(203): GuzzleHttp \ Middleware :: GuzzleHttp {closure} (Object (GuzzleHttp \ Psr7 \ Response)) 2 /home/admin/domains/login.scarif.dev/framework/vendor/guzzlehttp/promises/src/Promise.php(156):

GuzzleHttp\ Promise \ Promise :: callHandler (1, Объект (GuzzleHttp \ Psr7 \ Response), Массив) # 3 /home/admin/domains/login.scarif.dev/framework/ven в /home/admin/domains/login.scarif.dev / framework / vendor / guzzlehttp / guzzle / src / Exception / RequestException.php в строке 113

Контроллер конечной точки API:

<?php

namespace Controller;

use Core\Config;
use Core\Request;
use Core\Response;
use Model\Token;
use Model\User;
use MongoDB\BSON\UTCDateTime;

class AuthController extends Controller
{
    public function view(User $user, Token $token)
    {
        extract(Request::getPostData());

        if (isset($access_token) && !empty($access_token)) {
            $_token = $token->getTokenByToken($access_token);

            if (
                $_token['type'] !== Token::TYPE_ACCESS_TOKEN ||
                $_token['expires_on'] <= new UTCDateTime()
            ) {
                return $this->view->display('json', [
                    'payload' => Response::apiResponse(
                        $this->config->get('url.login'), 401
                    )
                ]);
            }

            $token->delete($_token['_id']);

            $newToken = $token->create(Token::TYPE_ACCESS_TOKEN, $_token['user_id']);

            return $this->view->display('json', [
                'payload' => Response::apiResponse($newToken['token'])
            ]);
        }

        if (!isset($email) || !isset($password) || empty($email) || empty($password)) {
            return $this->view->display('json', [
                'payload' => Response::apiResponse(
                    $this->config->get('url.login'), 401
                )
            ]);
        }

        if (!$user->checkCredentials($email, $password)) {
            return $this->view->display('json', [
                'payload' => Response::apiResponse(
                    "The email address or password you've entered is invalid. Please check your entry and try again.",
                    422
                )
            ]);
        }

        $user = $user->getUserByEmail($email);
        $token = $token->create(Token::TYPE_ACCESS_TOKEN, $user['_id']);

        return $this->view->display('json', [
            'payload' => Response::apiResponse($token['token'])
        ]);
    }
}

1 Ответ

0 голосов
/ 20 апреля 2019

Похоже, проблема связана с API, который вы используете. При использовании вашего кода с другим URL-адресом он работает просто отлично:

$client = new Client([
    'header' => [
        'Accept' => 'application/json',
        'Content-Type' => 'application/x-www-form-urlencoded'
    ],
    'verify' => false
]);

$response = $client->request('POST', 'https://jsonplaceholder.typicode.com/posts', [
    'form_params' => []
]);

echo $response->getBody()->getContents();

Не могли бы вы показать код для конечных точек API?

...