JAVA - Обработка запроса HttpClient для Content-Type: application / json

Надеюсь, у всех все отлично.

проблема: Я получаю следующий ответ каждый раз, когда вызываю api для входа в систему через запрос POST

[status] => 415
[error] => Unsupported Media Type
[message] => Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

Вот мой код для Сторона приложения Yii2:

$url = ['auth/login'];
$data = ['email'=>$email, 'password'=>$password];

$response = \Yii::$app->apiclient->createRequest()
    ->setMethod('post')

    ->setUrl($url)

    ->addHeaders(['Accept-Charset' => 'UTF-8'])
    ->addHeaders(['Accept' => 'application/json'])
    ->addHeaders(['Content-Type' => 'application/json'])
    ->addHeaders(['Accept-Language' => \app\helpers\Helper::getUserLanguage()])

    ->setData($data)

    ->send();

return $response;

Вот какие мои настройки apiclient находятся в файле web.conf в разделе компонентов

'apiclient' => [
            'class' => 'yii\httpclient\Client',
            'baseUrl' => 'http://myserverName:8000',
        ],

Вот мой код для Сторона API Spring (JAVA):

@RequestMapping(value = "/auth/login", method = RequestMethod.POST)
public ResponseEntity<?> authenticateUser(@Valid @RequestBody LoginRequest loginRequest) {}

Цель: Я хочу получить данные пользователя из api, если учетные данные для входа (адрес электронной почты и пароль) верны. Или даже сообщение об ошибке проверки будет делать

Контекст: я использую структуру Yii2 в качестве приложения (интерфейс) и Spring (JAVA) в качестве серверной части (API)

Примечание: Интересно то, что я даже не пытаюсь использовать тип контента application/x-www-form-urlencode, как вы можете видеть в моем коде Yii2, но все же получаю ответ, упомянутый в проблеме.

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

Любая помощь приветствуется.

Что это за "apiclient" компонент в вашем приложении PHP? Похоже, это заставляет неправильный заголовок типа контента для запроса.

Joni 16.11.2018 14:39

apiclient - это псевдоним для yii \ httpclient \ Client. Я тоже отредактировал свой вопрос с его кодом

ahmednawazbutt 19.11.2018 05:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
320
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуй это :

@RequestMapping(value = "/auth/login", method = RequestMethod.POST, consumes = "application/json")
public ResponseEntity<?> authenticateUser(@Valid @RequestBody LoginRequest loginRequest, BindingResult bindingResult) {}

Это может вам помочь ..

Спасибо :)

извини, но сейчас я проверю это в понедельник. Надеюсь это работает.

ahmednawazbutt 16.11.2018 14:03

А пока ты можешь немного объяснить это, пожалуйста

ahmednawazbutt 16.11.2018 14:04

проверьте эту ссылку для объяснения - dzone.com/articles/spring-31-valid-requestbody

Anish B. 16.11.2018 14:11
Ответ принят как подходящий

Добавьте это в свой запрос:

-> setFormat (\ yii \ httpclient \ Client :: FORMAT_JSON)

Проблема заключалась в запросе, который я отправлял в api.

Вот что мне нужно было сделать

$response = \Yii::$app->apiclient->createRequest()
            ->setMethod('POST')
            ->setUrl($url)
            ->setData($data)
            ->setFormat(\yii\httpclient\Client::FORMAT_JSON)

            ->addHeaders(['accept-charset' => 'utf-8'])
            ->addHeaders(['accept' => 'application/json'])
            ->addHeaders(['content-type' => 'application/json'])
            ->addHeaders(['accept-language' => \app\helpers\Helper::getUserLanguage()])

            ->send();

Я добавил следующую строку, и она сработала

->setFormat(\yii\httpclient\Client::FORMAT_JSON)

Примечание:

Я понятия не имею, как и почему это сработало, но это может быть связано с тем, что PHP - это слабо типизированный язык, а JAVA - наоборот. Java будет запрашивать отправку всех второстепенных деталей для обработки запроса.

Другие вопросы по теме