2016-07-03 5 views
1

Angular POSTリクエストを使用してパラメータをTomcatサーバー、Spring Frameworkに渡そうとしています。どういうわけか、パラメータが送信されたときにそのパラメータが存在することがわかりますが、何らかの形でバックエンドに到着/適切に取得されません。ここでAngular2コードは次のとおりです。Angular2がPOST要求のパラメータを渡さない

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(); 
    });; 
} 

私はパラメータの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 }); 

など

私はこの1つ試してみました:私はPOJOを作成しようとしましたJB Nizet提案後Angular2 - Http POST request parameters

を:

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); 
} 

私はinput=nullと方法でCompanyオブジェクトを取得しています。

は、それから私は@ConfigurationからCompany@Beanの登録を解除し、次へのリクエストメソッドを変更しようとしました:

@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> 

答えて

2

あなたは体としてJSONオブジェクトを送っている、あなたが期待しますこのJSONオブジェクトの属性を含むリクエストパラメータを取得します。

これは起こりません。送信されたJSONの構造と一致するPOJOが必要です。引数としてPOJOをとり、@RequestBodyと注釈を付けます。 JacksonはJSONをPOJOに非整列化し、POJOはメソッドに渡されます。

リクエストパラメータにapplication/x-www-form-urlencodedペイロードが含まれている場合、リクエストパラメータを使用できます。ペイロードはJavaScriptを使用せずにHTMLフォームを送信するときに送信するペイロードの種類です。

+0

以下のように私はあなたが提案する方法を試してみましたが、私がnullに等しいパラメータ「INPUT」になりましたPOJOを取得しています。 –

+0

したがって、バインディングを固定する必要があると思います。確かにわかりません。 –

+0

あなたの質問を編集して、このPOJOのコードとaddCompanyメソッドの新しいコードを投稿してください。また、null以外の入力が実際にブラウザによって送信されることを確認してください。 –

0

代わりの let body = JSON.stringify({ input: nameId });

使用してみてください let body = { input: nameId };

0

を試してみてください。

let body:string='input='+nameId;

そして

let headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded', 'X-CSRF-TOKEN':this.getToken() });

このヘッダを使用します

1つ以上のパラメータを送信する場合は、他の読者に限ります。 &をパラメータとして使用してください。コード

let body :string='username='+username+'&password='+password;

関連する問題