<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] # 簡介 * `@Controller`:修飾class,用來創建處理http請求的對象 * `@RestController`:Spring4之后加入的注解,原來在`@Controller`中返回json需要`@ResponseBody`來配合,如果直接用`@RestController`替代`@Controller`就不需要再配置`@ResponseBody`,默認返回json格式 * `@RequestMapping`:配置url映射 下面我們嘗試使用Spring MVC來實現一組對User對象操作的RESTful API,配合注釋詳細說明在Spring MVC中如何映射HTTP請求、如何傳參、如何編寫單元測試。 **RESTful API具體設計如下:** ![](https://img.kancloud.cn/55/17/55170ebc73da78ee94064ca74c25cb09_1700x740.png) `patch /users/text 修改users的text字段` put是更新整個資源的,patch是表述更新部分字段 * @GetMapping,處理理 Get 請求 * @PostMapping,處理理 Post 請求 * @PutMapping,用于更更新資源 * @DeleteMapping,處理理刪除請求 * @PatchMapping,用于更更新部分資源 ~~~ @GetMapping(value="/xxx") 等價于 @RequestMapping(value = "/xxx",method = RequestMethod.GET) @PostMapping(value="/xxx") 等價于 @RequestMapping(value = "/xxx",method = RequestMethod.POST) @PutMapping(value="/xxx") 等價于 @RequestMapping(value = "/xxx",method = RequestMethod.PUT) @DeleteMapping(value="/xxx") 等價于 @RequestMapping(value = "/xxx",method = RequestMethod.DELETE) @PatchMapping(value="/xxx") 等價于 @RequestMapping(value = "/xxx",method = RequestMethod.PATCH) ~~~ # 案例 定義一個實體 ~~~ @Data public class Message { private Long id; private String text; private String summary; private Calendar created = Calendar.getInstance(); } ~~~ ## Repository **定義接口** ~~~ public interface MessageRepository { List<Message> findAll(); Message save(Message message); Message update(Message message); Message updateText(Message message); Message findMessage(Long id); void deleteMessage(Long id); } ~~~ 用ConcurrentHashMap來模擬存儲Message對象的增刪改查. AtomicLong作為消息的自增主鍵來使用,并發場景下獲得唯一Long值 **InMemoryMessageRepository** ~~~ @Service("messageRepository") public class InMemoryMessageRepository implements MessageRepository { private static AtomicLong counter = new AtomicLong(); private final ConcurrentMap<Long, Message> messages = new ConcurrentHashMap<>(); @Override public List<Message> findAll() { List<Message> messages = new ArrayList<>(this.messages.values()); return messages; } //保存消息的時候,先判斷是否存在id,沒有,可以用AtomicLong取一個 @Override public Message save(Message message) { Long id = message.getId(); if (id == null) { id = counter.incrementAndGet(); message.setId(id); } this.messages.put(id, message); return message; } @Override public Message update(Message message) { this.messages.put(message.getId(), message); return message; } //更新Text字段 @Override public Message updateText(Message message) { Message msg = this.messages.get(message.getId()); msg.setText(message.getText()); this.messages.put(msg.getId(), msg); return msg; } @Override public Message findMessage(Long id) { return this.messages.get(id); } @Override public void deleteMessage(Long id) { this.messages.remove(id); } } ~~~ ## 控制器 將封裝好的MessageRepository注入到Controller中,調用增刪改查 ~~~ @RestController @RequestMapping("/") public class MessageController { @Autowired private MessageRepository messageRepository; //獲取所有消息體 @GetMapping(value = "message") public List<Message> list() { List<Message> messages = this.messageRepository.findAll(); return messages; } //創建消息體 @PostMapping(value = "message") public Message create(Message message) { return this.messageRepository.save(message); } //使用Put請求進行修改 @PatchMapping(value = "/message/text") public Message patch(Message message) { return this.messageRepository.updateText(message); } @GetMapping(value = "message/{id}") public Message get(@PathVariable Long id) { return this.messageRepository.findMessage(id); } @DeleteMapping(value = "message/{id}") public void delete(@PathVariable("id") Long id) { this.messageRepository.deleteMessage(id); } } ~~~ ## 測試 * MultiValueMap ?用來存儲需要發送的請求參數。 * MockMvcRequestBuilders.post 代表使?用 post 請求 ~~~ //運行一個spring容器 @RunWith(SpringRunner.class) //用于測試的注解 @SpringBootTest public class MessageControllerTest { @Autowired private WebApplicationContext wac; private MockMvc mockMvc; public void setup() { //提前加載MVC環境 this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); //一開始就保存一些數據 saveMessages(); } //創建一個消息體 @Test public void saveMessage() throws Exception { final MultiValueMap<String, String> params = new LinkedMultiValueMap<>(); params.add("text", "text"); params.add("summary", "summary"); String mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/message") .params(params)).andReturn().getResponse().getContentAsString(); System.out.println("Result === " + mvcResult); } //批量添加消息請求 private void saveMessages() { for (int i = 0; i < 10; i++) { final MultiValueMap<String, String> params = new LinkedMultiValueMap<>(); params.add("text", "text" + i); params.add("summary", "summary" + i); try { MvcResult mvcResult = mockMvc.perform( MockMvcRequestBuilders.post("/message") .params(params)).andReturn(); }catch (Exception e) { e.printStackTrace(); } } } //獲取所有消息 @Test public void getAllMessages() throws Exception { String mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/message")) .andReturn().getResponse().getContentAsString(); System.out.println("Result === " + mvcResult); } //獲取單個消息 @Test public void getMessage() throws Exception { String mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/message/6")) .andReturn().getResponse().getContentAsString(); System.out.println("Result === " + mvcResult); } //修改 @Test public void modifyMessage() throws Exception { LinkedMultiValueMap<String, String> params = new LinkedMultiValueMap<>(); params.add("id", "6"); params.add("text", "text"); params.add("summary", "summary"); String mvcResult = mockMvc.perform(MockMvcRequestBuilders.put("/message") .params(params)).andReturn().getResponse().getContentAsString(); System.out.println("Result === " + mvcResult); } //測試局部修改 @Test public void patchMessage() throws Exception { LinkedMultiValueMap<String, String> params = new LinkedMultiValueMap<>(); params.add("id", "6"); params.add("text", "text"); String mvcResult = mockMvc.perform(MockMvcRequestBuilders.patch("/message/text") .params(params)).andReturn().getResponse().getContentAsString(); System.out.println("Result === " + mvcResult); } @Test public void deleteMessage() throws Exception { mockMvc.perform(MockMvcRequestBuilders.delete("/message/6")) .andReturn(); String mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/message")) .andReturn().getResponse().getContentAsString(); System.out.println("Result === " + mvcResult); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看