Intereting Posts
SPL против массива: когда следует использовать SPL и когда мы должны использовать Array в PHP? Как добавить новый вид (а также новый тип элемента меню) к существующим компонентам Joomla 2.5? Laravel 5.2 нужен пример, который реализует драйверы аутентификации по умолчанию / «Multi-Auth». который требует много работ прямо сейчас, поскольку php удалить «пустые» значения в массиве Как PHP обрабатывает переменные в ОЗУ? Адаптация метода select для приема более одного параметра проблемы в Parse.com php hosting Специальные символы в URL для выбора БД json_encode (): Недопустимая последовательность UTF-8 в аргументе Вывод (эхо / печать) все из массива PHP PHP register_shutdown_function для запуска, когда сценарий убит из командной строки? PHP – Блокирование загруженных изображений для взрослых Может ли вредоносное вступление в файл записываться в файл? PHPUnit – «Никаких тестов не выполняется» при использовании файла конфигурации Платная оплата Android

Как стимулировать запрос cURL на запрос с использованием почтового менеджера

Я использую следующий запрос 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) приведет к следующему:


Вывод var_dump


С a = в конце данных (например: {"jsonrpc": "2.0", "method": "feed.list", "id": 1}= ) var_dump даст следующее:


Вывод 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. На верхней панели вы заполняете имя пользователя и пароль, и заголовок авторизации будет сгенерирован.