【Myself-Security】SpringMVC 開發 RESTFul API

RestFul API

通常的API都是什麼樣子的呢?java

查詢 /user/query?name=tom              GET
詳情 /user/getInfo?id=1                GET
建立 /user/create?name=tom            POST
修改 /user/update?id=1&name=jay       POST
刪除 /user/delete?id=1                 GET

那麼咱們但願的RESTFul API 是什麼樣子的呢?git

查詢    /user?name=tom             GET
詳情    /user/1                    GET
建立    /user                      POST
修改    /user/1                    PUT
刪除    /user/1                    DELETE

簡單的說,RESTFul就是:
一、用URL描述資源
二、使用HTTP方法描述行爲,使用HTTP狀態碼來表示不一樣的結果
三、使用json交互數據
四、RESTFul只是一種風格,並非強制的標準github

RESTFul 成熟度模型

圖片描述

Level0:使用Http做爲傳輸方式
Level1:引入資源概念,每一個資源都有對應的URL
Level2:使用HTTP方法進行不一樣的操做,使用HTTP狀態碼來表示不一樣的結果
Level3:使用超媒體,在資源的表達中包含了連接信息

編寫第一個RESTFul API

首先咱們先了解一些經常使用的註解web

一、@RestController 標明此Controller提供RestAPI
二、@RequestMapping及其變體。映射http請求URL到java方法
三、@RequestParam 映射請求參數到java方法的參數
四、@PageableDefault指定分頁參數默認值正則表達式

直接拿出代碼模塊來說解吧!spring

package com.myself.web.controller;

import com.fasterxml.jackson.annotation.JsonView;
import com.myself.dto.User;
import com.myself.dto.UserQueryCondition;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * @author  MySelf
 * @create  2018/9/15
 * @desc User Controller 層
 **/
@RestController
@RequestMapping("/user")
public class UserController {

    /**
     * 獲取用戶列表
     * @RequestMapping(value = "/user", method = RequestMethod.GET)
     * @RequestParam(name = "username",required = false,defaultValue = "tom") String nickname
     * @param condition {@link UserQueryCondition}
     * @return {@link List}
     */
    @GetMapping()
    @JsonView(User.UserSimpleView.class)
    public List<User> query(UserQueryCondition condition,@PageableDefault(page = 2,size = 17,sort = "username,asc") Pageable pageable){
        //反射工具
        System.out.println(ReflectionToStringBuilder.toString(condition, ToStringStyle.MULTI_LINE_STYLE));

        System.out.println(pageable.getPageSize());
        System.out.println(pageable.getPageNumber());
        System.out.println(pageable.getSort());

        List<User> users = new ArrayList<>();
        users.add(new User());
        users.add(new User());
        users.add(new User());
        return users;
    }

    /**
     * 獲取用戶信息 正則校驗參數必須爲數字
     * @RequestMapping(value = "/user/{id:\\d+}", method = RequestMethod.GET)
     * @param idxxx {@link String}
     * @return {@link User}
     */
    @GetMapping("/{id:\\d+}")
    @JsonView(User.UserDetailView.class)
    public User getInfo(@PathVariable(name = "id") String idxxx){
        User user = new User();
        user.setUsername("tom");
        return user;
    }

}

User Bean 對象apache

package com.myself.dto;


import com.fasterxml.jackson.annotation.JsonView;

/**
 * @author  MySelf
 * @create  2018/9/15
 * @desc User Bean
 **/
public class User {

    /** 用戶簡單視圖 */
    public interface UserSimpleView {}

    /** 用戶詳情視圖 */
    public interface UserDetailView extends UserSimpleView {}

    /** 用戶名 */
    private String username;

    /** 用戶密碼 */
    private String password;

    @JsonView(UserSimpleView.class)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @JsonView(UserDetailView.class)
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

接下來咱們就來說解一些註解的使用點,其實看着註解也能大體瞭解了。json

首先咱們在接受參數時,可使用@PathVariable映射url片斷到java方法的參數,同時也支持在url聲明中使用正則表達式,使用@JsonView控制json輸出內容。app

咱們須要在Bean中聲明對應的接口,並在值對象的get方法上指定視圖,最後在Controller方法上指定視圖便可。dom

還有就是,當咱們在處理建立請求時,還要注意可使用@RequestBody映射請求體到java方法參數,且要注意對日期類型參數的處理,也可使用@Valid註解和BindingResult驗證請求參數的合法性並處理校驗結果。

本文是針對UncleCatMySelf/myself-security(基於Spring Security + Spring Social + Spring Security OAuth + REST服務開發的案例教程,Maven多模塊開發)的GitHub項目的基礎演進。


若是本文對你有所幫助,歡迎關注本人技術公衆號,謝謝。

圖片描述

相關文章
相關標籤/搜索