Заголовок содержимого Spring Boot для простого текста

У меня есть приложение Spring Boot с обработчиком запросов HTTPpost. Я хочу сделать так, чтобы при использовании следующей команды curl:

curl -d "ncs|56-2629193|1972-03-28|20190218|77067|6208|3209440|self|-123|-123|-123|0.0|0.0|0.0|0.0|0.0|0.0|0.0"
     -H 'Content-Type: text/plain' 'http://localhost:9119/prediction'

Мне не нужно добавлять тип содержимого заголовка.

это мой код:

@RequestMapping(value = "/prediction", method = RequestMethod.POST, produces = {"application/json"},consumes= "text/plain")
    public ResponseEntity<String> payloader(@RequestBody String params ) throws IOException{
        LinkedHashMap<String,String> x = mockconfig.getHM();
        String[] a = params.split("\\|");
        if (a.length!=18){
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Requires 18 parameters");
        }

        if (params.equals((String) x.keySet().toArray()[0])) {
            return ResponseEntity.ok(x.get(mockconfig.input1)); 
        }
        else if (params.equals((String) x.keySet().toArray()[1])) {
            return ResponseEntity.ok(x.get(mockconfig.input2));
        }
        else if (params.equals((String) x.keySet().toArray()[2])) {
            return ResponseEntity.ok(x.get(mockconfig.input3));
        }
        else if (params.equals((String) x.keySet().toArray()[3])) {
            return ResponseEntity.ok(x.get(mockconfig.input4));
        }
        else {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Inccorect payload");
        }
    }
}

Я установил его так, чтобы он потреблял текст/обычный текст, но мне все еще нужно добавить заголовок в команду curl, иначе он выдает эту ошибку:

"status":415,"error":"Unsupported Media Type","message":"Content type 'application/x-www-form-urlencoded' not supported","path":"/prediction"

Любое обходное решение?

Я попытался использовать посредника по содержимому и создал этот класс

import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

  @Override
  public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.defaultContentType(MediaType.TEXT_PLAIN);
  }
}

Но это просто вызвало ошибки в консоли Java:

.w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded' not supported]
.w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]

и ничего не возвращает в терминал при скручивании.

Добавление этой зависимости в мой pom.xml:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformats-text</artifactId>
    <version>2.10.0.pr1</version>
    <type>pom</type>
</dependency>

тоже не получилось...

Обновлено: Я изменил свой код на то, что рекомендовал Мадху:

@PostMapping(value = "/prediction")
    public ResponseEntity<String> payloader(@RequestBody String params ) throws IOException{
        LinkedHashMap<String,String> x = mockconfig.getHM();
         a = params.split("\\|"); //line 35
        if (a.length!=18){
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Requires 18 parameters");
        }

        if (params.equals((String) x.keySet().toArray()[0])) {
            return ResponseEntity.ok(x.get(mockconfig.input1)); 
        }
        else if (params.equals((String) x.keySet().toArray()[1])) {
            return ResponseEntity.ok(x.get(mockconfig.input2));
        }
        else if (params.equals((String) x.keySet().toArray()[2])) {
            return ResponseEntity.ok(x.get(mockconfig.input3));
        }
        else if (params.equals((String) x.keySet().toArray()[3])) {
            return ResponseEntity.ok(x.get(mockconfig.input4));
        }
        else {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Inccorect payload");
        }
    }

и когда я делаю завиток без заголовка, он отвечает статусом моего объекта ответа

"Requires 18 parameters"

Но когда я добавляю заголовок к той же команде curl, он успешно выдает JSON.

Хотя параметры те же.

«Это просто выдает ошибки» не поможет нам вам помочь. Пожалуйста, добавьте ошибки, которые вы получили, в тело вашего вопроса.

Pasukaru 26.07.2019 16:17

Отредактировано с учетом ошибок

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

Ответы 1

Ответ принят как подходящий

Если вы используете consumes= "text/plain" в своем методе контроллера, вам нужно будет передать заголовок типа содержимого как часть запроса на завивку. Простым способом было бы использовать ваш метод контроллера, как показано ниже:

@PostMapping(value = "/prediction")
public ResponseEntity<String> payloader(@RequestBody String params ) throws IOException{
   //method implementation
}

Затем вы можете использовать завиток как

curl -d "ncs|56-2629193|1972-03-28|20190218|77067|6208|3209440|self|-123|-123|-123|0.0|0.0|0.0|0.0|0.0|0.0|0.0" http://localhost:9119/prediction

Обновлено: Со ссылкой на этот документация:

POSTing with curl's -d option will make it include a default header that looks like Content-Type: application/x-www-form-urlencoded.

Поэтому, когда вы не передаете заголовок Content-Type в curl, это приведет к отправке типа контента application/x-www-form-urlencoded с помощью curl. Следовательно, он будет кодировать строку, заменяя |, как показано ниже:

ncs%7C56-2629193%7C1972-03-28%7C20190218%7C77067%7C6208%7C3209440%7Cself%7C-123%7C-123%7C-123%7C0.0%7C0.0%7C0.0%7C0.0%7C0.0%7C0.0%7C0.0=

что означало бы, что ваше разделенное регулярное выражение не будет работать. Таким образом, вы ДОЛЖЕН либо отправляете Content-Type: text/plain в завитке, либо просто Content-Type:, что даже сработает. Таким образом, проблема, с которой вы столкнулись, связана с тем, как curl работает по умолчанию, а не с вашим java-кодом.

Эй, такая работа, но она нарушила логику моего метода... она возвращает сообщение об ошибке в моем объекте ответа, что требуется 18 параметров, хотя на самом деле на входе 18 параметров. Но когда я снова объявляю заголовок содержимого в curl, он возвращает JSON, проверяющий 18 параметров. Я отредактировал свой вопрос для дальнейшего уточнения.

schooner_101 26.07.2019 16:46

@ schooner_101 Я обновил свой ответ, который объяснил бы вам проблему, с которой вы столкнулись. Дайте мне знать, развеет это ваши сомнения или нет.

Madhu Bhat 26.07.2019 17:27

То есть я никак не могу обойти это?

schooner_101 26.07.2019 17:35

@schooner_101 если ваше требование состоит в том, чтобы вообще не передавать тип содержимого в curl, то вы знаете, что curl добавит заголовок по умолчанию и будет кодировать данные, в результате чего регулярное выражение | не работает в вашем коде. Это можно решить, изменив регулярное выражение на разделение на основе %7C, но я не уверен, хотите ли вы пойти по этому пути. Но в противном случае нет другого способа отказаться от отправки заголовка типа контента в curl. Проблема, с которой вы столкнулись в связи с вашим требованием, связана с тем, как работает curl, а не с вашим java-кодом.

Madhu Bhat 26.07.2019 18:43

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