Spring RestController 請求參數詳解
在閱讀之前,最好先了解http請求的get,post,以及各種head頭類型,請求參數類型。
- 無參數,設置RestController請求路徑
- 查詢字符串參數,可選和必選參數
- json參數,RestController用實體類型接受
- 路徑參數
- body參數
- 文件流參數
1 無參數,設置RestController請求路徑
下面是一個例子,例子無請求參數,通過@RequestMapping設置了請求的路由路徑和請求方法。路由路由由類的mapping和方法的mapping組成,在后面的例子中,我就不再寫出RestApiRequestDemoController類的mapping了。記住,url里面有個demo在前面。
@RestController
@RequestMapping("/demo")
public class RestApiRequestDemoController {
<span class="c1">///方法說明: 普通查詢</span>
<span class="c1">///示例請求:http://localhost:8091/demo/list</span>
<span class="nd">@RequestMapping</span><span class="o">(</span><span class="n">value</span><span class="o">=</span><span class="s">"/searchList"</span><span class="o">,</span><span class="n">method</span> <span class="o">=</span> <span class="n">RequestMethod</span><span class="o">.</span><span class="na">POST</span><span class="o">)</span>
<span class="nd">@ResponseBody</span>
<span class="kd">public</span> <span class="n">List</span><span class="o"><</span><span class="n">UserModel</span><span class="o">></span> <span class="nf">searchList</span><span class="o">()</span> <span class="o">{</span>
<span class="n">List</span> <span class="n">list</span> <span class="o">=</span> <span class="k">new</span> <span class="n">list</span><span class="o">();</span>
<span class="k">return</span> <span class="n">list</span><span class="o">;</span>
<span class="o">}</span>
}
2 查詢字符串參數,可選和必選參數2. 查詢字符串參數,可選和必選參數
下面是使用查詢字符串的例子,required可以設置請求的字符串是否必填
///方法說明:url參數的使用-查詢字符串 ,且name必填
///示例請求:http://localhost:8091/demo/searchListByName?name=liuyanwei
@RequestMapping(value="/listByName",method = RequestMethod.POST)
@ResponseBody
public List<TbUserModel> searchList(@RequestParam(value="name",required = true) String name) {
<span class="n">Session</span> <span class="n">context</span> <span class="o">=</span> <span class="n">DatabaseHelper</span><span class="o">.</span><span class="na">context</span><span class="o">();</span>
<span class="n">String</span> <span class="n">sql</span> <span class="o">=</span> <span class="s">"select * from tb_user where name ='"</span><span class="o">+</span> <span class="n">name</span><span class="o">+</span><span class="s">"'"</span> <span class="o">;</span>
<span class="n">List</span> <span class="n">list</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">createSQLQuery</span><span class="o">(</span><span class="n">sql</span><span class="o">)</span>
<span class="o">.</span><span class="na">setResultTransformer</span><span class="o">(</span><span class="n">Transformers</span><span class="o">.</span><span class="na">aliasToBean</span><span class="o">(</span><span class="n">TbUserModel</span><span class="o">.</span><span class="na">class</span><span class="o">))</span>
<span class="o">.</span><span class="na">list</span><span class="o">();</span>
<span class="k">return</span> <span class="n">list</span><span class="o">;</span>
}
3 json參數,RestController用實體類型接受
注意,需要設置application/json 否則數據庫會返回。hibernate操作數據庫代碼暫時可以不用去管他。
/* * 方法說明:添加數據 * 1:使用json數據提交,直接使用實體對象接收 * 2:hibernate 添加數據 * 請求參數: {"id":1,"userId":1,"pwd":"123","name":"123","pwd":"123","headPortait":"123","isEnable":"123","createDate":"2015-05-12","lastLogin":"2015-05-12"} * 請求頭:Content-Type : application/json * 請求ur:http://localhost:8091/demo/addUser * */
@RequestMapping(value="/addUser",method = RequestMethod.POST)
@ResponseBody
public TbUserModel addUser(@RequestBody TbUserModel user) {
<span class="n">Session</span> <span class="n">context</span> <span class="o">=</span> <span class="n">DatabaseHelper</span><span class="o">.</span><span class="na">context</span><span class="o">();</span>
<span class="n">Transaction</span> <span class="n">tran</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">beginTransaction</span><span class="o">();</span>
<span class="n">context</span><span class="o">.</span><span class="na">save</span><span class="o">(</span><span class="n">user</span><span class="o">);</span>
<span class="n">tran</span><span class="o">.</span><span class="na">commit</span><span class="o">();</span>
<span class="n">user</span><span class="o">.</span><span class="na">setId</span><span class="o">(</span><span class="n">user</span><span class="o">.</span><span class="na">getId</span><span class="o">());</span>
<span class="n">context</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
<span class="k">return</span> <span class="n">user</span><span class="o">;</span>
}
4 路徑參數
路徑參數不能設置是否必填,全部都是必須填,不能省略的
///方法說明:url參數的使用
///示例請求:http://localhost:8091/demo/searchListById/2
@RequestMapping(value="/searchListById/{id}",method = RequestMethod.POST)
@ResponseBody
public List<TbUserModel> searchList(@PathVariable("id") int id) {
<span class="n">Session</span> <span class="n">context</span> <span class="o">=</span> <span class="n">DatabaseHelper</span><span class="o">.</span><span class="na">context</span><span class="o">();</span>
<span class="c1">// String sql = "select * from tb_user where id ="+ id ;</span>
<span class="n">String</span> <span class="n">sql</span> <span class="o">=</span> <span class="s">"select * from tb_user where tb_user.id = :id"</span><span class="o">;</span>
<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">sql</span><span class="o">);</span>
<span class="n">List</span> <span class="n">list</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">createSQLQuery</span><span class="o">(</span><span class="n">sql</span><span class="o">).</span><span class="na">setInteger</span><span class="o">(</span><span class="s">"id"</span><span class="o">,</span> <span class="n">id</span><span class="o">)</span>
<span class="o">.</span><span class="na">setResultTransformer</span><span class="o">(</span><span class="n">Transformers</span><span class="o">.</span><span class="na">aliasToBean</span><span class="o">(</span><span class="n">TbUserModel</span><span class="o">.</span><span class="na">class</span><span class="o">))</span>
<span class="o">.</span><span class="na">list</span><span class="o">();</span>
<span class="k">return</span> <span class="n">list</span><span class="o">;</span>
}
高級用法:路徑參數可以自由設置自己的規則,比如,你有個請求需要兩個參數,月和日,你可以寫成{month}-{day}
///方法說明:url參數的使用
///示例請求:http://localhost:8091/demo/searchListByDate/2-10
@RequestMapping(value="/searchListByDate/{month}-{day}",method = RequestMethod.POST)
@ResponseBody
public List<TbUserModel> searchList(@PathVariable("month") int month,
@PathVariable("day") int day) {
}
5. 表單參數參數
注意,
- 這種方式傳參數不能設置參數選填
- 注意,參數寫在boby中,相當於表單參數,必須設置請求頭為:application/x-www-form-urlencoded
- 若參數不正確,是無法進入控制器的。
/* * 方法說明:使用表單方式提交數據 * 請求參數:isEnable=1&name=cool * 配置 * 請求頭:Content-Type : application/x-www-form-urlencoded * 請求url:http://localhost:8091/demo/findUsersByName * */
@RequestMapping(value="/findUsersByName",method = RequestMethod.POST)
@ResponseBody
public void findUsersByName(boolean isEnable , String name)
{
System.out.println(isEnable);
System.out.println(name);
}
6. 文件流參數
-
單個文件通過這種方式 @RequestParam(“file”) MultipartFile file獲得,這里是簡單的寫法,相當於 MultipartFile file = ((MultipartHttpServletRequest) request).getFile(“file”); 多個文件使用@RequestParam(“files”) MultipartFile[] files)
- 表單中文件的name屬性必須設置file(注意,不是文件名),例如,html中 <input type="files" name="file" > </li>
- 這個是簡單獲取文件的方式,若不知道表單中文件的name屬性,可以通過request獲取文件
例子:
@RequestMapping("upload")
public Resp upload(HttpServletRequest request,
HttpServletResponse response, @RequestParam("file") MultipartFile file){
<span class="k">try</span> <span class="o">{</span>
<span class="c1">//MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;</span>
<span class="n">String</span> <span class="n">filePath</span> <span class="o">=</span> <span class="n">FilesService</span><span class="o">.</span><span class="na">uploadFile</span><span class="o">(</span><span class="n">file</span><span class="o">,</span> <span class="n">request</span><span class="o">);</span>
<span class="k">return</span> <span class="n">Resp</span><span class="o">.</span><span class="na">succeedResp</span><span class="o">(</span><span class="n">filePath</span><span class="o">);</span>
<span class="o">}</span>
<span class="k">catch</span> <span class="o">(</span><span class="n">Exception</span> <span class="n">e</span><span class="o">){</span>
<span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">Resp</span><span class="o">.</span><span class="na">failureResp</span><span class="o">(</span><span class="s">"圖片上傳失敗"</span><span class="o">);</span>
}
@RequestMapping("batchUpload")
public Resp batchUpload(HttpServletRequest request,
HttpServletResponse response,
@RequestParam("files") MultipartFile[] files) throws IOException {
List<String> list = new ArrayList<String>();
try {
for (MultipartFile file :files) {
String filePath = FilesService.uploadFile(file, request);
list.add(filePath);
System.out.println("filePath:" + filePath);
}
return Resp.succeedResp(list);
}
catch (Exception e){
e.printStackTrace();
}
return Resp.failureResp("文件上傳失敗");
}
總結
想要把Rest風格的api用好,合理利用參數是必須的。不同功能的api使用不同類型的參數接收方式。每個人有不同的習慣,我的習慣是:
- 一般獲取內容,不涉及加密的用get方法,設計加密的用post
- 提交內容,例如添加,刪除,修改,使用post、delete、put方法
- 通過主鍵獲取內容的,我習慣用url參數,例如:/news/details/1,參數不是很多,組合起來有意義的也會用url路徑組合,例如前面的日期:/demo/searchListByDate/2-10
- 有時候接收參數組合起來用比較好,有的內容通過url參數,有的部分用表單內容。
- 所有的設計接收參數的原則就是,然你的api的url能讀通,看起來合理。
好了,就到這了,后面有時間我會再寫一些hibernate 數據操作的例子和hibernate獲取實體參數驗證的內容,有的問題我也還沒完全搞清楚,后面在研究看看。
<div class="declare">
<div>
</div>
</div>