2011-10-10 11 views
8

AndroidアプリケーションからサーバーにPOSTリクエストを送信しています。サーバーはSpring Frameworkを使用して開発されています。リクエストはサーバによって受信されましたが、送信していたパラメータはnull /空です(ログに表示されます)。Androidアプリケーションからサーバー(Spring Framework)でPOSTリクエストを受信

POSTリクエストを送信するために使用されるコードは次のとおりです。

DefaultHttpClient hc=new DefaultHttpClient(); 
ResponseHandler <String> res=new BasicResponseHandler(); 

String postMessage = "json String"; 

HttpPost postMethod=new HttpPost("http://ip:port/event/eventlogs/logs"); 
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);  
nameValuePairs.add(new BasicNameValuePair("json", postMessage)); 

postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs));  
hc.execute(postMethod,res); 

私はまた、次のようにHttpParamsを設定しようとしたが、それはまた失敗した:

HttpParams params = new BasicHttpParams(); 
params.setParameter("json", postMessage); 
postMethod.setParams(params); 

これを受けたサーバ側のコードをリクエストは:

@RequestMapping(value = "/eventlogs/logs", method = RequestMethod.POST) 
public String logs(@ModelAttribute("json") String json) { 

    logger.debug("Received POST request:" + json); 

    return null; 
} 

私がロギングしているロガーメッセージ:

Received POST request: 

私はここで何が不足していますか?

答えて

4

。サーバーのコードは次のようになります。

@RequestMapping(value = "/eventlogs/logs", method = RequestMethod.POST) 
public String logs(@RequestParam("json") String json) { 
logger.debug("Received POST request:" + json); 

    return null; 
} 
+0

クライアントでは、要求のエンティティとしてパラメータを指定します。それらをsetParamsとして指定することは、まだ動作しません。 –

+0

私は全く同じ問題があります。あなたが言ったことをするとき、私はorg.springframework.web.bind.MissingServletRequestParameterExceptionを取得しています:必須の整数パラメータ 'channel'が存在しません。私は基本的な名前の値ペアとアンドロイドクライアントからパラメータを送信しています。手伝ってくれますか? – Emilla

+0

@Emillaはあなたのパラメータを逃してしまう可能性がありますので、required = falseとしてマークしてください。この回答を見るhttp://stackoverflow.com/a/3466851/867475 – rizzz86

7

おそらく、春はPOSTボディをModelに変換していません。その場合、Modelがないため、jsonがあなたのModelにある属性を知ることはできません!

Spring Documentation regarding mapping the request bodyをご覧ください。

スプリングMessageConverterの実装を使用して、必要な操作を行うことができます。具体的には、フォームデータをMultiValueMap<String, String>に/から変換するFormHttpMessageConverterをご覧ください。あなたのXML設定に次の行を追加し

@RequestMapping(value = "/eventlogs/logs", method = RequestMethod.POST) 
public String logs(@RequestBody Map<String,String> body) { 
    logger.debug("Received POST request:" + body.get("json")); 

    return null; 
} 

デフォルトでFormHttpMessageConverterを有効にする必要があります。私はRequestParam注釈を使用している、それは私の作品

<mvc:annotation-driven/> 
+0

お返事ありがとうございます@ nicholas.hauschild。 RequestBodyアノテーションを試しましたが、HTTPエラー415サポートされていないメディアタイプ(http://www.checkupdown.com/status/E415.html)が返されます。その後、私はRequestBarアノテーションをRequestParamアノテーションに置き換えて動作します。今私はサーバー上のPOST要求パラメータを取得しています。 – rizzz86

2

クライアントからコンテンツタイプのヘッダーを追加する必要があると思います。 JSONのMessageConverterは、それが受け入れるいくつかのcontent-typeで自分自身を登録します。一つはapplication/jsonです。

MessageConvertで処理できないコンテンツタイプで送信すると、動作しません。

"Content-type:application/json"をヘッダーとして追加してください。

+0

私はContent-Typeヘッダを追加してくれます。ありがとうございます。 –

関連する問題