Рейтинг:0

Как настроить пользовательский API POST для приема запроса с Content-Type как «application/x-www-form-urlencoded» в заголовке?

флаг bw

Я создал контроллер в пользовательском модуле, который принимает ПУБЛИКОВАТЬ запрос.
У меня есть такая установка, что я получаю ПУБЛИКОВАТЬ запрос от стороннего сервера приложений к этому API. Но ПУБЛИКОВАТЬ запрос имеет Content-Type: "application/x-www-form-urlencoded" в заголовке.
И из-за этого я получаю следующую ошибку в последних сообщениях журнала:

Symfony\Component\HttpKernel\Exception\UnsupportedMediaTypeHttpException: не найден маршрут, соответствующий "Content-Type: application/x-www-form-urlencoded" в Drupal\Core\Routing\ContentTypeHeaderMatcher->filter() (строка 49 из /var/ www/html/web/core/lib/Drupal/Core/Routing/ContentTypeHeaderMatcher.php).```

Когда я тестирую API с помощью почтальона:

  1. если я использую Тип содержимого: "приложение/json" в шапке выполняется код внутри API, и я получаю правильный ответ.
  2. если я использую Content-Type: "application/x-www-form-urlencoded", я получаю ту же ошибку.

Я не могу настроить сторонний сервер приложений для изменения Тип содержимого. Поэтому единственный вариант для меня — настроить API так, чтобы он принимал ПУБЛИКОВАТЬ запрос с Content-Type: "application/x-www-form-urlencoded". Как я могу это сделать?

Отредактировано: Мой класс расширяет класс ResourceBase. Определение маршрута контроллера. Также я использую друпал 8.

 * @RestResource(
 * идентификатор = "test_abc_callback",
 * label = @Translation("Пользовательский API для тестирования"),
 * uri_paths = {
 * "создать" = "/api/v1/test_callback",
 * }
 * )
4uk4 avatar
флаг cn
Это формат по умолчанию для запросов POST. Что находится в определении маршрута контроллера?
флаг bw
@ 4k4 Я отредактировал вопрос, добавив определение маршрута. Спасибо.
Рейтинг:0
флаг cn

Это не пользовательский контроллер. Для исходного вопроса вам нужно будет определить метод POST в пользовательском маршруте. Видеть https://www.drupal.org/docs/drupal-apis/routing-system/structure-of-routes

Но вам не обязательно нужен собственный контроллер. Вы можете добавить сериализаторы в REST API для форматов, уже определенных в объекте запроса Symfony:

Запрос:: InitializeFormats

защищенная статическая функция initializeFormats()
{
    статический :: $ форматы = [
        'html' => ['текст/html', 'приложение/xhtml+xml'],
        'txt' => ['текст/обычный'],
        'js' => ['приложение/javascript', 'приложение/x-javascript', 'текст/javascript'],
        'CSS' => ['текст/CSS'],
        'json' => ['приложение/json', 'приложение/x-json'],
        'jsonld' => ['приложение/ld+json'],
        'xml' => ['текст/xml', 'приложение/xml', 'приложение/x-xml'],
        'rdf' => ['приложение/rdf+xml'],
        'атом' => ['приложение/атом+xml'],
        'rss' => ['приложение/rss+xml'],
        'form' => ['application/x-www-form-urlencoded'],
    ];
}

Видеть https://www.drupal.org/docs/drupal-apis/serialization-api/adding-new-formats и Как я могу отправить данные x-www-form-urlencoded из плагина REST API?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.