我正在尝试使用Angular POST请求将参数传递给Tomcat服务器Spring Framework。不知怎的,我发现参数在发送时就存在了,但它在某种程度上没有在后端到达/正确检索。这是Angular2代码:
addCompany() {
console.log("addCompany button clicked!");
console.log("company name: " + this.input);
let nameId = this.input;
let body = JSON.stringify({ input: nameId });
let headers = new Headers({ 'Content-Type': 'application/json', 'X-CSRF-TOKEN':this.getToken() });
console.log("csrf token: " + this.getToken());
let options = new RequestOptions({ headers: headers });
this.http.post('http://localhost:8080/views/addcompany', body, options).toPromise()
.then(() => {
console.log("company added!");
this.reloadList();
});;
}
当我试图在Spring中获取它时,我得到null
参数:
@RequestMapping(value = "/addcompany", method = RequestMethod.POST)
@ResponseBody
public void addCompany(HttpServletRequest request,
HttpServletResponse response) {
String nameId = request.getParameter("input");
eventService.addCompany(nameId);
}
我也这样试过:
@RequestMapping(value = "/addcompany", method = RequestMethod.POST)
@ResponseBody
public void addCompany(Model model, @RequestParam("input") String nameId) {
eventService.addCompany(nameId);
}
在Angular代码中,我一直在尝试更改逗号,例如:
let nameId = this.input;
let body = JSON.stringify({ 'input': nameId });
等。
我试过这个:Angular2 - Http POST request parameters
根据建议JB Nizet
,我尝试创建POJO
:
public class Company {
public String input;
public Company() {
this.input = "";
}
public String getInput() {
return this.input;
}
public void setInput(String input) {
this.input = input;
}
}
在我的@Configuration
文件中注册:
@Bean
public Company getCompany(){
return new Company();
}
并将请求方法更改为以下内容:
@RequestMapping(value = "/addcompany", method = RequestMethod.POST)
@ResponseBody
public void addCompany(Company company) {
eventService.addCompany(company.input);
}
之后我使用Company
在方法中获得了input=null
个对象。
然后我尝试从Company
取消注册@Bean
@Configuration
,并将请求方法更改为以下内容:
@RequestMapping(value = "/addcompany", method = RequestMethod.POST)
@ResponseBody
public void addCompany(@RequestBody Company company) {
eventService.addCompany(company.input);
}
但之后我收到415 (Unsupported Media Type)
错误。
在pom.xml
我有以下杰克逊导入:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.10</version>
</dependency>
将其替换为第二个杰克逊版本解决了这个问题:
<properties>
...
<jackson.version>2.7.5</jackson.version>
</properties>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
答案 0 :(得分:2)
您正在发送一个JSON对象作为正文,并且您希望获得一个包含此JSON对象属性的请求参数。
那不会发生。您需要一个与发送的JSON结构匹配的POJO,将该POJO作为参数并使用@RequestBody
进行注释。杰克逊将把JSON解组到POJO,POJO将被传递给你的方法。
如果请求包含application / x-www-form-urlencoded有效负载,则可以使用请求参数:提交HTML表单时发送的有效负载类型,而不执行任何JavaScript。
答案 1 :(得分:0)
let body = JSON.stringify({ input: nameId });
试
let body = { input: nameId };
答案 2 :(得分:0)
尝试使用:
let body:string='input='+nameId;
并使用此标题
let headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded', 'X-CSRF-TOKEN':this.getToken() });
如果您想发送多个参数,则仅适用于其他读者。用一些东西&amp;分离参数。如下面的代码
let body :string='username='+username+'&password='+password;