У меня есть приложение 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.
Хотя параметры те же.
Отредактировано с учетом ошибок




Если вы используете 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 Я обновил свой ответ, который объяснил бы вам проблему, с которой вы столкнулись. Дайте мне знать, развеет это ваши сомнения или нет.
То есть я никак не могу обойти это?
@schooner_101 если ваше требование состоит в том, чтобы вообще не передавать тип содержимого в curl, то вы знаете, что curl добавит заголовок по умолчанию и будет кодировать данные, в результате чего регулярное выражение | не работает в вашем коде. Это можно решить, изменив регулярное выражение на разделение на основе %7C, но я не уверен, хотите ли вы пойти по этому пути. Но в противном случае нет другого способа отказаться от отправки заголовка типа контента в curl. Проблема, с которой вы столкнулись в связи с вашим требованием, связана с тем, как работает curl, а не с вашим java-кодом.
«Это просто выдает ошибки» не поможет нам вам помочь. Пожалуйста, добавьте ошибки, которые вы получили, в тело вашего вопроса.