Angular2不传递POST请求中的参数

时间:2016-07-03 09:04:17

标签: spring spring-security angular

我正在尝试使用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>

3 个答案:

答案 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;