2015-04-02 199 views
5

我有這樣的控制器在春天彈簧安置控制器POST請求

@RestController 
public class GreetingController { 

    @RequestMapping(value = "/greeting", method = RequestMethod.POST) 
    public String greeting(@RequestParam("uouo") String uouo) { 
     return uouo; 
    } 
} 

,當我測試它

curl -k -i -X POST -H "Content-Type:application/json" -d uouo=test http://192.168.1.104:8080/api/greeting 

測試

HTTP狀態400結果 - 必需的字符串參數「 uouo'不存在

我試過可能的事情,但我認爲@RequestParam不能用於POST它總是通過使用GET傳遞URL中的參數,我只有在使用@RequestBody作爲參數的對象JSON時才使用post,是否有任何方法使用POST來使字符串參數發送?

回答

6

如果內容類型爲application/x-www-form-urlencoded,則Servlet容器將僅爲POST請求提供主體參數。如果內容類型是其他內容,它將忽略主體。這在Servlet Specification Chapter 3.1.1 When Parameters Are Available

以下指定的是 數據將被填充到所述參數集必須交形式之前必須滿足的條件:

  1. 該請求是HTTP或HTTPS請求。
  2. HTTP方法是POST。
  3. 內容類型爲application/x-www-form-urlencoded
  4. 該servlet已經對請求對象上的任何getParameter方法進行了初始調用。

如果條件不滿足和後的形式數據不包括在參數集 ,後數據仍必須提供給通過請求對象的輸入流中的 的servlet。如果滿足條件 ,則表單數據將不再可用於從請求對象的輸入流直接讀取 。

既然你不發送任何JSON,只需設置適當的內容類型

curl -k -i -X POST -H "Content-Type:application/x-www-form-urlencoded" -d uouo=test http://192.168.1.104:8080/api/greeting 

還是讓curl推斷它

curl -k -i -X POST -d uouo=test http://192.168.1.104:8080/api/greeting?uouo=test 

請注意,您還可以通過查詢參數URL

curl -k -i -X POST -H "Content-Type:application/json" http://192.168.1.104:8080/api/greeting?uouo=test