Я использую следующий запрос cURL для localhost, который работает нормально:
curl -u admin:e4d4face52f2e3dc22b43b2145ed7c58ce66e26b384d73592c -d "{\"jsonrpc\": \"2.0\", \"method\": \"feed.list\", \"id\": 1}" http://localhost/minifluxR/jsonrpc.php
Но когда я отправляю тот же запрос, используя Postman вместо cURL, я получаю:
{"jsonrpc":"2.0","id":null,"error":{"code":-32700,"message":"Parse error"}}
В Postman я использовал запрос GET
и отправил следующие заголовки:
url:http://localhost/minifluxR/jsonrpc.php username:admin api_token:e4d4face52f2e3dc22b43b2145ed7c58ce66e26b384d73592c method: feed.list
Ниже приведена функция PHP, которую я пытаюсь вызвать:
$server = new Server; $server->authentication(array( \Model\Config\get('username') => \Model\Config\get('api_token') )); // Get all feeds $server->register('feed.list', function () { return Model\Feed\get_all(); });
Пожалуйста, помогите мне исправить эти ошибки.
При использовании cURL параметр -u
(или --user
) используется для предоставления учетных данных для базовой проверки подлинности HTTP . Это устанавливает заголовок Authorization
для хранения необходимых данных для аутентификации с сервером.
Эти шаги применяются к упакованному приложению Postman. Для шагов для устаревшего приложения ознакомьтесь с этим вариантом пересмотра этого ответа.
Чтобы использовать обычную проверку подлинности HTTP, как вы были в вашей команде cURL, перейдите на вкладку Авторизация и введите свои учетные данные. При нажатии кнопки « Обновить запрос» для вас будет добавлен необходимый заголовок « Authorization
.
Чтобы отправить данные JSON так же, как вы делали с cURL, используйте запрос POST
, выберите raw под вкладкой Body и введите свои данные следующим образом:
Чтобы отладить это, я использовал Fiddler – бесплатный прокси-сервер для веб-отладки.
Я использовал параметр --proxy
cURL, чтобы он посылал свои запросы через Fiddler следующим образом:
curl \ --proxy http://localhost:8888 \ -u foo:bar \ -d "{\"jsonrpc\": \"2.0\", \"method\": \"feed.list\", \"id\": 1}" \ http://localhost
Теперь, когда запрос проходит через Fiddler, я могу выбрать его из списка сеансов и использовать «необработанный» инспектор для просмотра необработанного запроса:
Это показывает мне, что cURL делает запрос POST
с базой HTTP-аутентификации и содержимым application/x-www-form-urlencoded
. Этот тип данных обычно состоит из ключей и значений, таких как foo=bar&hoge=fuga
. Однако этот запрос cURL передает ключ без значения. Вызов var_dump($_POST)
приведет к следующему:
С a =
в конце данных (например: {"jsonrpc": "2.0", "method": "feed.list", "id": 1}=
) var_dump
даст следующее:
Однако, похоже, что JsonRPC будет использовать file_get_contents('php://input')
в вашем случае. Это возвращает данные, которые были отправлены с запросом, включая a =
, если данные заканчиваются им. Поскольку он попытается проанализировать входные данные как строку JSON, он завершится неудачно, если строка завершится с помощью a =
, потому что это будет недействительным JSON.
Используя расширение FoxyProxy для Chrome, я создал прокси-конфигурацию для Fiddler ( 127.0.0.1:8888
), что позволило мне легко отладить данные, отправляемые POST
запросом Postman. Используя x-www-form-urlencoded
с ключом foo
без значения, отправленные данные были фактически foo=
, что приведет к тому, что ваша строка JSON будет недействительной.
Однако использование «сырого» ввода позволит отправлять указанные данные без добавления a =
до конца, тем самым обеспечивая достоверность данных JSON.
Керл по умолчанию использует HTTP-аутентификацию по умолчанию. Ваши заголовки, установленные в Postman, – это нечто иное. Попробуйте использовать Basic Auth в Postman. На верхней панели вы заполняете имя пользователя и пароль, и заголовок авторизации будет сгенерирован.