Spring RestController 請求參數詳解

Spring RestController 請求參數詳解

在閱讀以前,最好先了解http請求的get,post,以及各類head頭類型,請求參數類型。html

  1. 無參數,設置RestController請求路徑
  2. 查詢字符串參數,可選和必選參數
  3. json參數,RestController用實體類型接受
  4. 路徑參數
  5. body參數
  6. 文件流參數

1 無參數,設置RestController請求路徑

下面是一個例子,例子無請求參數,經過@RequestMapping設置了請求的路由路徑和請求方法。路由路由由類的mapping和方法的mapping組成,在後面的例子中,我就再也不寫出RestApiRequestDemoController類的mapping了。記住,url裏面有個demo在前面。java

@RestController
@RequestMapping("/demo")
public class RestApiRequestDemoController {

    ///方法說明: 普通查詢
    ///示例請求:http://localhost:8091/demo/list
    @RequestMapping(value="/searchList",method = RequestMethod.POST)
    @ResponseBody
    public List<UserModel> searchList() {
        List list = new list();
        return list;
    }
}

2 查詢字符串參數,可選和必選參數2. 查詢字符串參數,可選和必選參數

下面是使用查詢字符串的例子,required能夠設置請求的字符串是否必填sql

///方法說明: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) {

    Session context = DatabaseHelper.context();
    String sql = "select * from tb_user where name ='"+ name+"'" ;
    List list = context.createSQLQuery(sql)
            .setResultTransformer(Transformers.aliasToBean(TbUserModel.class))
            .list();
    return list;

}

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) {

    Session context = DatabaseHelper.context();
    Transaction tran = context.beginTransaction();
    context.save(user);
    tran.commit();
    user.setId(user.getId());
    context.close();
    return user;


}

4 路徑參數

路徑參數不能設置是否必填,所有都是必須填,不能省略的json

///方法說明:url參數的使用
///示例請求:http://localhost:8091/demo/searchListById/2
@RequestMapping(value="/searchListById/{id}",method = RequestMethod.POST)
@ResponseBody
public List<TbUserModel> searchList(@PathVariable("id") int id) {

     Session context = DatabaseHelper.context();
    // String sql = "select * from tb_user where id ="+ id ;
     String sql = "select * from tb_user where tb_user.id = :id";
     System.out.println(sql);
     List list = context.createSQLQuery(sql).setInteger("id", id)
             .setResultTransformer(Transformers.aliasToBean(TbUserModel.class))
             .list();
     return list;

}

高級用法:路徑參數能夠自由設置本身的規則,好比,你有個請求須要兩個參數,月和日,你能夠寫成{month}-{day}api

///方法說明: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. 表單參數參數

注意,數組

  1. 這種方式傳參數不能設置參數選填
  2. 注意,參數寫在boby中,至關於表單參數,必須設置請求頭爲:application/x-www-form-urlencoded
  3. 若參數不正確,是沒法進入控制器的。
/* * 方法說明:使用表單方式提交數據 * 請求參數: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. 文件流參數

  1. 單個文件經過這種方式 @RequestParam(「file」) MultipartFile file得到,這裏是簡單的寫法,至關於 MultipartFile file = ((MultipartHttpServletRequest) request).getFile(「file」); 多個文件使用@RequestParam(「files」) MultipartFile[] files)app

  2. 表單中文件的name屬性必須設置file(注意,不是文件名),例如,html中 &ltinput type="files" name="file" > </li>
  3. 這個是簡單獲取文件的方式,若不知道表單中文件的name屬性,能夠經過request獲取文件

例子:ide

@RequestMapping("upload")
public Resp upload(HttpServletRequest request,
                   HttpServletResponse response, @RequestParam("file") MultipartFile file){

    try {
        //MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        String filePath = FilesService.uploadFile(file, request);
        return Resp.succeedResp(filePath);
    }
    catch (Exception e){
        e.printStackTrace();
    }

    return Resp.failureResp("圖片上傳失敗");
}


@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使用不一樣類型的參數接收方式。每一個人有不一樣的習慣,個人習慣是:post

  1. 通常獲取內容,不涉及加密的用get方法,設計加密的用post
  2. 提交內容,例如添加,刪除,修改,使用post、delete、put方法
  3. 經過主鍵獲取內容的,我習慣用url參數,例如:/news/details/1,參數不是不少,組合起來有意義的也會用url路徑組合,例如前面的日期:/demo/searchListByDate/2-10
  4. 有時候接收參數組合起來用比較好,有的內容經過url參數,有的部分用表單內容。
  5. 全部的設計接收參數的原則就是,然你的api的url能讀通,看起來合理。

好了,就到這了,後面有時間我會再寫一些hibernate 數據操做的例子和hibernate獲取實體參數驗證的內容,有的問題我也還沒徹底搞清楚,後面在研究看看。

相關文章
相關標籤/搜索