как отправить grant_type=client_credentials в качестве тела post-запроса в Java DSL (весенняя загрузка)

#spring-boot #spring-integration #spring-integration-dsl

#весенняя загрузка #spring-интеграция #spring-integration-dsl

Вопрос:

тело запроса postman

Как видно на изображении выше, я отправляю grant_type=client_credentials в качестве тела post. Эквивалентная команда curl

curl —location —запрос POST ‘https://localhost:8080/token Авторизация ‘
—header’: Базовая **************************************’
— тип содержимого заголовка ‘: application/x-www-form-urlencoded’
—data-urlencode ‘grant_type=client_credentials’

Я могу отправить grant_type=client_credentials в качестве параметра запроса и получить успешный ответ. Но нас просят не использовать в качестве параметра запроса из-за политики компании и просят отправить его в теле.

Код, который я придумал, это

 public Message<Map<String, String>> getTokenGenRequest() {
        setHeaderMapper(new String[] { TransferConstants.AUTHORIZATION, TransferConstants.CONTENT_TYPE });
        Map<String, String> requestMap = new HashMap<String, String>();
        requestMap.put("grant_type", "client_credentials");
        return MessageBuilder.withPayload(requestMap)
                .setHeader(TransferConstants.AUTHORIZATION, getAuthCredentials())
                .setHeader(TransferConstants.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED).build();
    }


private void setHeaderMapper(String[] headerNames) {
        headerMapper.setOutboundHeaderNames(headerNames);

    }
  

Однако запрос завершается записью [{grant_type=[client_credentials]}] как «application / x-www-form-urlencoded», из-за чего я не получаю никакого ответа.Может кто-нибудь сказать мне, что не так с кодом?

Ответ №1:

Это {grant_type=[client_credentials]} правильный x-www-form-urlencoded тип контента. Смотрите спецификацию HTTP: https://url.spec.whatwg.org/#urlencoded-serializing .

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

Я имею в виду, что вы getTokenGenRequest() должны вернуть a Message<HttpEntity<?>> , но, конечно, было бы лучше проконсультироваться с другой стороной (службой REST), чтобы быть уверенным, чего они действительно хотят от вас. Возможно, вы не отправили какой-то дополнительный заголовок или есть некоторые, которые они не принимают.

Комментарии:

1. Спасибо @Artem Bilan. Я написал метод, который генерирует токен. Но сейчас у меня другая проблема. Сгенерированный токен должен быть отправлен в качестве значения заголовка в другой api. Пожалуйста, обратите внимание, я создал 2 отдельных шаблона rest, 1 для токена, а другой для api. Можем ли мы это сделать? Также генерация токена происходит во время запуска сервера. Но когда я отправляю запрос, вызов переходит непосредственно к методу exchange шаблона rest, не переходя к коду генерации токена. Также запрос отличается от того, что я отправил. Не могли бы вы сказать мне, где я могу ошибаться?

2. Похоже, это не связано с исходным вопросом. Вероятно, лучше начать новый поток SO с гораздо большей информацией.