0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Spring構(gòu)建REST服務(wù)(二)

「Spring」認(rèn)證安全架構(gòu) ? 來(lái)源:「Spring」認(rèn)證安全架構(gòu) ? 作者:「Spring」認(rèn)證安全 ? 2022-07-28 16:00 ? 次閱讀

書接上文???

HTTP 是平臺(tái)

要使用 Web 層次包裝您的存儲(chǔ)庫(kù),您必須使用 Spring MVC。多虧了 Spring Boot,代碼基礎(chǔ)設(shè)施很少。相反,我們可以專注于行動(dòng):

nonrest/src/main/java/payroll/EmployeeController.java

package payroll;

import java.util.List;

import org.springframework.web.bind.annotation.DeleteMapping;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.PutMapping;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RestController;

@RestController

class EmployeeController {

private final EmployeeRepository repository;

EmployeeController(EmployeeRepository repository) {

this.repository = repository;

}

// Aggregate root

// tag::get-aggregate-root[]

@GetMapping("/employees")

List all() {

return repository.findAll();

}

// end::get-aggregate-root[]

@PostMapping("/employees")

Employee newEmployee(@RequestBody Employee newEmployee) {

return repository.save(newEmployee);

}

// Single item

@GetMapping("/employees/{id}")

Employee one(@PathVariable Long id) {

return repository.findById(id)

.orElseThrow(() -> new EmployeeNotFoundException(id));

}

@PutMapping("/employees/{id}")

Employee replaceEmployee(@RequestBody Employee newEmployee, @PathVariable Long id) {

return repository.findById(id)

.map(employee -> {

employee.setName(newEmployee.getName());

employee.setRole(newEmployee.getRole());

return repository.save(employee);

})

.orElseGet(() -> {

newEmployee.setId(id);

return repository.save(newEmployee);

});

}

@DeleteMapping("/employees/{id}")

void deleteEmployee(@PathVariable Long id) {

repository.deleteById(id);

}

}

  • @RestController表示每個(gè)方法返回的數(shù)據(jù)會(huì)直接寫入響應(yīng)體,而不是渲染模板。
  • AnEmployeeRepository由構(gòu)造函數(shù)注入到控制器中。
  • 我們有每個(gè)操作的路由(@GetMapping、@PostMapping、@PutMapping@DeleteMapping,對(duì)應(yīng)于 HTTP GETPOST、PUTDELETE調(diào)用)。(注意:閱讀每種方法并了解它們的作用很有用。)
  • EmployeeNotFoundException是用于指示何時(shí)查找但未找到員工的異常。

nonrest/src/main/java/payroll/EmployeeNotFoundException.java

package payroll;

class EmployeeNotFoundException extends RuntimeException {

EmployeeNotFoundException(Long id) {

super("Could not find employee " + id);

}

}

當(dāng)EmployeeNotFoundException拋出 an 時(shí),Spring MVC 配置的這個(gè)額外花絮用于呈現(xiàn)HTTP 404

nonrest/src/main/java/payroll/EmployeeNotFoundAdvice.java

package payroll;

import org.springframework.http.HttpStatus;

import org.springframework.web.bind.annotation.ControllerAdvice;

import org.springframework.web.bind.annotation.ExceptionHandler;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.bind.annotation.ResponseStatus;

@ControllerAdvice

class EmployeeNotFoundAdvice {

@ResponseBody

@ExceptionHandler(EmployeeNotFoundException.class)

@ResponseStatus(HttpStatus.NOT_FOUND)

String employeeNotFoundHandler(EmployeeNotFoundException ex) {

return ex.getMessage();

}

}

  • @ResponseBody表示此建議直接呈現(xiàn)到響應(yīng)正文中。
  • @ExceptionHandlerEmployeeNotFoundException將建議配置為僅在拋出an 時(shí)才響應(yīng)。
  • @ResponseStatus說(shuō)要發(fā)出一個(gè)HttpStatus.NOT_FOUND,即一個(gè)HTTP 404。
  • 建議的主體生成內(nèi)容。在這種情況下,它會(huì)給出異常的消息。

要啟動(dòng)應(yīng)用程序,請(qǐng)右鍵單擊其中并從 IDEpublic static void mainPayRollApplication選擇運(yùn)行,或者:

Spring Initializr 使用 maven 包裝器,所以輸入:

$ ./mvnw clean spring-boot:run

或者使用您安裝的 Maven 版本輸入:

$ mvn clean spring-boot:run

當(dāng)應(yīng)用程序啟動(dòng)時(shí),我們可以立即對(duì)其進(jìn)行詢。

$ curl -v localhost:8080/員工

這將產(chǎn)生:

* 嘗試 ::1...* TCP_NODELAY 設(shè)置* 連接到 localhost (::1) 端口 8080 (#0)> GET /員工 HTTP/1.1> 主機(jī):本地主機(jī):8080> 用戶代理:curl/7.54.0> 接受:*/*>< HTTP/1.1 200< 內(nèi)容類型:application/json;charset=UTF-8< 傳輸編碼:分塊< 日期:格林威治標(biāo)準(zhǔn)時(shí)間 2018 年 8 月 9 日星期四 17:58:00<* 連接 #0 到主機(jī) localhost 保持不變[{"id":1,"name":"Bilbo Baggins","role":"竊賊"},{"id":2,"name":"Frodo Baggins","角色":"小偷"} ]

在這里,您可以看到壓縮格式的預(yù)加載數(shù)據(jù)。

如果您嘗試查詢一個(gè)不存在的用戶......

$ curl -v localhost:8080/employees/99

你得到…

* 嘗試 ::1...* TCP_NODELAY 設(shè)置* 連接到 localhost (::1) 端口 8080 (#0)> 獲取 /employees/99 HTTP/1.1> 主機(jī):本地主機(jī):8080> 用戶代理:curl/7.54.0> 接受:*/*>< HTTP/1.1 404< 內(nèi)容類型: text/plain;charset=UTF-8< 內(nèi)容長(zhǎng)度:26< 日期:格林威治標(biāo)準(zhǔn)時(shí)間 2018 年 8 月 9 日星期四 18:00:56<* 連接 #0 到主機(jī) localhost 保持不變找不到員工 99

此消息很好地顯示了HTTP 404錯(cuò)誤以及自定義消息Could not find employee 99。

顯示當(dāng)前編碼的交互并不難……?

如果您使用 Windows 命令提示符發(fā)出 cURL 命令,則以下命令可能無(wú)法正常工作。您必須選擇一個(gè)支持單引號(hào)參數(shù)的終端,或者使用雙引號(hào),然后轉(zhuǎn)義 JSON 中的那些。

要?jiǎng)?chuàng)建新Employee記錄,我們?cè)诮K端中使用以下命令——$開(kāi)頭的表示后面是終端命令:

$ curl -X POST localhost:8080/employees -H 'Content-type:application/json' -d '{"name": "Samwise Gamgee", "role": "gardener"}'

然后它存儲(chǔ)新創(chuàng)建的員工并將其發(fā)送回給我們:

{"id":3,"name":"Samwise Gamgee","role":"gardener"}

您可以更新用戶。讓我們改變他的角色。

$ curl -X PUT localhost:8080/employees/3 -H 'Content-type:application/json' -d '{"name": "Samwise Gamgee", "role": "ring bearer"}'

我們可以看到輸出中反映的變化。

{"id":3,"name":"Samwise Gamgee","role":"戒指持有者"}

您構(gòu)建服務(wù)的方式可能會(huì)產(chǎn)生重大影響。在這種情況下,我們說(shuō)update,但replace是更好的描述。例如,如果未提供名稱,則它將被取消。

最后,您可以像這樣刪除用戶:

$ curl -X DELETE 本地主機(jī):8080/employees/3# 現(xiàn)在如果我們?cè)倏匆槐?,它就不?jiàn)了$ curl localhost:8080/employees/3找不到員工 3

這一切都很好,但是我們有 RESTful 服務(wù)了嗎?(如果你沒(méi)有聽(tīng)懂提示,答案是否定的。)

少了什么東西?

......未完待續(xù)......

2022就業(yè)季|Spring認(rèn)證教你,如何使用 Spring 構(gòu)建 REST 服務(wù)

#java##spring##spring認(rèn)證##2022就業(yè)季#


以上就是今天關(guān)于Spring的一些討論,對(duì)你有幫助嗎?如果你有興趣深入了解,歡迎到Spring中國(guó)教育管理中心留言交流!

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14362
  • REST
    +關(guān)注

    關(guān)注

    0

    文章

    32

    瀏覽量

    9428
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何用ACM簡(jiǎn)化你的Spring Cloud微服務(wù)環(huán)境配置管理

    摘要: 本文我們就如何使用阿里云ACM這樣的配置管理產(chǎn)品在Spring Cloud中替代Spring Cloud Config幫助簡(jiǎn)化環(huán)境配置管理做一個(gè)簡(jiǎn)單的示例,幫助你理解基于ACM來(lái)簡(jiǎn)化微服務(wù)
    發(fā)表于 02-02 14:18

    使用阿里云ACM簡(jiǎn)化你的Spring Cloud微服務(wù)環(huán)境配置管理

    摘要: 本文我們就如何使用阿里云ACM這樣的配置管理產(chǎn)品在Spring Cloud中替代Spring Cloud Config幫助簡(jiǎn)化環(huán)境配置管理做一個(gè)簡(jiǎn)單的示例,幫助你理解基于ACM來(lái)簡(jiǎn)化微服務(wù)
    發(fā)表于 07-04 17:16

    Spring Boot嵌入式Web容器原理是什么

    Spring Boot嵌入式Web容器原理Spring Boot的目標(biāo)是構(gòu)建“非常容易創(chuàng)建、獨(dú)立、產(chǎn)品級(jí)別的基于Spring的應(yīng)用”。這些應(yīng)用是“立即可運(yùn)行的”。在這個(gè)過(guò)程中,完全沒(méi)有
    發(fā)表于 12-16 07:57

    REST端口支持構(gòu)建動(dòng)態(tài)REST請(qǐng)求來(lái)使用RESTful API網(wǎng)絡(luò)

    REST端口支持構(gòu)建動(dòng)態(tài)REST請(qǐng)求來(lái)使用RESTful API網(wǎng)絡(luò)服務(wù)。 概覽 REST端口暴露了一個(gè)簡(jiǎn)單的接口來(lái)為
    的頭像 發(fā)表于 01-17 09:11 ?4880次閱讀

    REST API是什么,如何使用REST端口

    /服務(wù)器) 模型對(duì)資源進(jìn)行增刪改查操作。而其中客戶端和服務(wù)器是分離的,而知行之橋中的REST端口就是作為REST API中的客戶端,對(duì)服務(wù)
    的頭像 發(fā)表于 02-17 18:00 ?9371次閱讀
    <b class='flag-5'>REST</b> API是什么,如何使用<b class='flag-5'>REST</b>端口

    Spring REST Docs RESTful服務(wù)文檔

    ./oschina_soft/spring-restdocs.zip
    發(fā)表于 05-24 09:31 ?1次下載
    <b class='flag-5'>Spring</b> <b class='flag-5'>REST</b> Docs RESTful<b class='flag-5'>服務(wù)</b>文檔

    Spring認(rèn)證是什么?

    ,例如:配置、組件掃描、AOP、數(shù)據(jù)訪問(wèn)和事務(wù)、REST、安全、自動(dòng)配置、執(zhí)行器、 Spring boot測(cè)試等。
    的頭像 發(fā)表于 07-04 10:19 ?1344次閱讀
    <b class='flag-5'>Spring</b>認(rèn)證是什么?

    如何獲得Spring認(rèn)證?學(xué)習(xí)JAVA如何獲得Spring Professional認(rèn)證?

    、組件掃描、AOP、數(shù)據(jù)訪問(wèn)和事務(wù)、REST、安全、自動(dòng)配置、執(zhí)行器、 Spring boot測(cè)試等。 1)參加Spring中國(guó)教育管理中心授權(quán)合作伙伴Spring培訓(xùn)課程 2)報(bào)名考
    的頭像 發(fā)表于 07-04 10:20 ?1833次閱讀
    如何獲得<b class='flag-5'>Spring</b>認(rèn)證?學(xué)習(xí)JAVA如何獲得<b class='flag-5'>Spring</b> Professional認(rèn)證?

    如何使用Spring構(gòu)建REST服務(wù)(一)

    關(guān)于 REST 如何適應(yīng)微服務(wù)世界還有一個(gè)更大的討論,但是——對(duì)于本教程——讓我們看看構(gòu)建 RESTful 服務(wù)。
    的頭像 發(fā)表于 07-28 15:59 ?931次閱讀

    如何使用Spring構(gòu)建REST服務(wù)(三)

    到目前為止,您擁有一個(gè)基于 Web 服務(wù)來(lái)處理涉及員工數(shù)據(jù)的核心操作。但這還不足以讓事情變得“RESTful”。
    的頭像 發(fā)表于 07-28 16:01 ?870次閱讀

    如何使用Spring構(gòu)建REST服務(wù)(四)

    通過(guò)一個(gè)額外的庫(kù)和幾行額外的代碼,您已將超媒體添加到您的應(yīng)用程序中。但這并不是使您的服務(wù)成為 RESTful 所需的唯一事情。REST 的一個(gè)重要方面是它既不是技術(shù)堆棧也不是單一標(biāo)準(zhǔn)。
    的頭像 發(fā)表于 07-28 16:02 ?779次閱讀

    如何使用Spring構(gòu)建REST服務(wù)(五)

    到目前為止,您已經(jīng)使用基本鏈接構(gòu)建了一個(gè)可進(jìn)化的 API。為了發(fā)展您的 API 并更好地為您的客戶服務(wù),您需要接受超媒體作為應(yīng)用程序狀態(tài)引擎的概念。
    的頭像 發(fā)表于 07-28 16:03 ?875次閱讀

    REST的6大指導(dǎo)原則

    systems )架構(gòu)風(fēng)格。由Roy Fielding 提出。 REST API 也稱RESTful API, 其遵循REST架構(gòu)規(guī)范的應(yīng)用編程接口, 支持與RESTful WEB服務(wù)進(jìn)行交互。簡(jiǎn)單來(lái)講就是
    的頭像 發(fā)表于 10-09 14:27 ?1639次閱讀

    Spring Cloud :打造可擴(kuò)展的微服務(wù)網(wǎng)關(guān)

    Spring Cloud Gateway是一個(gè)基于Spring Framework 5和Project Reactor的反應(yīng)式編程模型的微服務(wù)網(wǎng)關(guān)。它提供了豐富的功能,包括動(dòng)態(tài)路由、請(qǐng)求限流、集成安全性等,使其成為
    的頭像 發(fā)表于 10-22 10:03 ?546次閱讀
    <b class='flag-5'>Spring</b> Cloud :打造可擴(kuò)展的微<b class='flag-5'>服務(wù)</b>網(wǎng)關(guān)

    Spring Cloud Gateway網(wǎng)關(guān)框架

    SpringCloud Gateway功能特征如下: (1) 基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 進(jìn)行構(gòu)建; (2) 動(dòng)態(tài)路由:能夠匹配任何請(qǐng)求屬性;
    的頭像 發(fā)表于 08-22 09:58 ?520次閱讀
    <b class='flag-5'>Spring</b> Cloud Gateway網(wǎng)關(guān)框架