将 JSON 发布到控制器返回 400 错误请求
Posted
技术标签:
【中文标题】将 JSON 发布到控制器返回 400 错误请求【英文标题】:Posting JSON to Controller returns 400 Bad Request 【发布时间】:2015-02-25 13:25:24 【问题描述】:我正在开发 RESTful 服务。 我无法将 JSON 数据发布到控制器。
我正在使用以下依赖项:
春天:3.2.3.RELEASE 杰克逊:1.9.6我也试过了:
Spring 3.2.3.RELEASE w/ Jackson 1.9.9 Spring 3.1.1.RELEASE w/ Jackson 1.9.9这里建议POSTing JSON to Spring MVC Controller Returns 400 Bad Request
我也输入了 MessageConverters,
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
控制器
@Controller
@RequestMapping(value="/todo", consumes="application/json", produces="application/json")
//@RequestMapping(value="/todo", consumes="text/plain", produces="application/json")
public class TodoRestService
Logger logger = LoggerFactory.getLogger(TodoService.class);
@Autowired
private TodoService todoService;
@RequestMapping(value="/id", method= RequestMethod.GET)
@ResponseBody public Todo find(@PathVariable("id") Long id)
Todo todo = todoService.find(id);
return todo;
@RequestMapping(method=RequestMethod.POST)
@ResponseBody public Todo create(@RequestBody Todo todo)
//public Todo create(@RequestBody String todo)
//public Todo create(@RequestParam("todo") String todo)
System.out.println(todo);
todoService.create(newTodo);
return newTodo;
POJO
public class TODO
private String firstName;
private String lastName;
//getter setters
我正在使用邮递员发布 JSON
我已将 Content-Type 设置为 application/json
表单数据 ----- 名称 = 待办事项 值 = "firstName":"nilam","lastName":"naik"
方法 = POST
我收到 400 错误请求。
但是,如果我将使用 @RequestBody 注释的参数的数据类型从 TODO 更改为 String,那么 我得到了类似的东西,
------WebKitFormBoundaryu6banLlTPiPudsBB
Content-Disposition: form-data; name="todo"
"firstName":"nilam","lastName":"naik"
------WebKitFormBoundaryu6banLlTPiPudsBB--
我的类路径中也有 Jackson。
如果我将属性消耗从 application/json 更改为 text/plain 和
@RequestBody String todo 然后我得到,
"firstName":"nilam","lastName":"naik"
但我不想手动将字符串转换为 Java 对象。但我不明白为什么 @RequestBody 无法将我的 JSON 数据转换为 Java 对象。
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven- v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.orci</groupId>
<artifactId>OrciMavenTutorial</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>OrciMavenTutorial Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<!-- <org.springframework.version>3.2.3.RELEASE</org.springframework.version> -->
<org.springframework.version>3.1.1.RELEASE</org.springframework.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>$org.springframework.version</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>$org.springframework.version</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>$org.springframework.version</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>$org.springframework.version</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.2.2.Final</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derbyclient</artifactId>
<version>10.5.3.0_1</version>
</dependency>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.5.3.0_1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<!-- <version>1.9.6</version> -->
<!-- <version>1.4.2</version> -->
<!-- <version>1.9.9</version> -->
<version>1.9.7</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<!-- <version>1.9.6</version> -->
<!-- <version>1.4.2</version> -->
<!-- <version>1.9.9</version> -->
<version>1.9.7</version>
</dependency>
</dependencies>
<build>
<finalName>OrciMavenTutorial</finalName>
</build>
请有人帮助我。
【问题讨论】:
请问,你的 pom 怎么样? 【参考方案1】:从您给出的解释中可以清楚地看出,您错误地使用了POSTMAN。
您不能在form-data
中发送@RequestBody
注释对象。使用@ModelAttribute
或@RequestParam
(多个)处理表单。
如果您想将 JSON 发布到 Controller 端点,您必须按照下图进行操作;
显然你必须选择POST
并且必须将标题Content-Type
设置为application/json
,最后你必须从选项卡中选择raw
并从下拉列表中选择JSON
。
如果您遵循这一点,您的 Controller 方法必须使用 Todo
对象作为 @RequestBody
注释,并且无需使用 String
并手动转换为对象。
【讨论】:
非常感谢!我已经正确设置了所有内容,除了在引号中包含 application/json。它不适用于单引号或双引号。 你拯救了我的一天,非常感谢。以上是关于将 JSON 发布到控制器返回 400 错误请求的主要内容,如果未能解决你的问题,请参考以下文章
AJAX请求返回HTTP 400 错误 - 请求无效 (Bad request)
AJAX请求返回HTTP 400 错误 - 请求无效 (Bad request)
来自包含双精度数字的 Json 帖子的错误 400(错误请求)