1. 程式人生 > >構建基於rest的Web服務

構建基於rest的Web服務

構建的rest的Web服務所要實現的功能

  構建一個接受HTTP GET請求的服務,如下:

http://localhost:8080/greeting

  greeting響應的json資料格式如下:

{"id":1,"content":"Hello, World!"}

  在greeting中,我們可以自定義一個名為name的請求引數:

http://localhost:8080/greeting?name=User

  當我們加入name的請求引數後,預設的“World”值將會被重寫,因而響應的結果變更為:

{"id":1,"content":"Hello, User!"}

構建rest的Web伺服器

構建rest的Web伺服器需要準備的前提條件

  • JDK 1.8 及以上版本

  • Gradle 2.3+ 或者 Maven 3.0+

  而我這裡主要是以Maven 3.0+為基礎來進行演示。

構建Maven格式的rest的Web服務

構建Maven格式的rest的Web伺服器基礎框架

  我們需要建立的目錄結構如下:

└── src
    └── main
        └── java
            └── hello

  pom.xml原始碼如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns
="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>org.springframework</groupId> <artifactId>gs-rest-service</artifactId
>
<version>0.1.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <scope>test</scope> </dependency> </dependencies> <properties> <java.version>1.8</java.version> </properties> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-releases</id> <url>https://repo.spring.io/libs-release</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-releases</id> <url>https://repo.spring.io/libs-release</url> </pluginRepository> </pluginRepositories> </project>

  其實我們在搭建這個rest的Web服務的基礎框架時有一個更好的辦法,那就是在Maven官網的GitHub賬號上有一個官方的基礎框架可以直接拿來使用,該框架支援Maven、Gradle,能夠支援在包括windows和linux等的作業系統在內的命令列執行。其連結如下:

  這個 Spring Boot Maven外掛提供了許多方便的特性

  • 它收集類路徑上的所有jar,並構建一個單一的、可執行的“über-jar”,這使得執行和傳輸您的服務更加方便。

  • 它搜尋public static void main()方法並將其標記為可執行的類。

  • 它提供了一個內建的依賴解析器,它可以設定版本號來匹配Spring Boot dependencies。您可以覆蓋任何您希望的版本,但是它將引導預設所選擇的版本集。

新增java程式碼

  我們通過考慮服務互動來開始這個過程。

  該服務將以GET請求的方式來請求/greeting,並可選地使用查詢字串中的name引數。GET請求應該返回一個200 OK的JSON格式的問候響應,其應該是這樣的:

{
    "id": 1,
    "content": "Hello, World!"
}

  id欄位是問候的唯一識別符號,content是問候的文字表示。

  要對問候表示建模,您需要建立一個資源表示類。為idcontent資料提供一個帶有欄位、構造器和存取器的普通java物件。

src/main/java/hello/Greeting.java
package hello;

public class Greeting {

    private final long id;
    private final String content;

    public Greeting(long id, String content) {
        this.id = id;
        this.content = content;
    }

    public long getId() {
        return id;
    }

    public String getContent() {
        return content;
    }
}

  正如您在下面的步驟中看到的,Spring將會呼叫 Jackson JSON的執行庫將Greeting的返回資料轉換成JSON格式。

  接下來,您將建立資源控制器來提供這些問候。

建立一個資源controller

  在Spring構建RESTful web服務的方法中,HTTP請求由控制器處理。這些元件很容易通過@restcontroller註解來識別,下面的GreetingController通過處理訪問/greetingGET請求來返回並裝載一個新的Greeting類。

src/main/java/hello/GreetingController.java
package hello;

import java.util.concurrent.atomic.AtomicLong;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

    private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @RequestMapping("/greeting")
    public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
        return new Greeting(counter.incrementAndGet(),
                            String.format(template, name));
    }
}

  這個控制器簡潔而簡單,但是在底層有很多東西。讓我們一步一步地把它分解。

  @RequestMapping註解確保將/greetingHTTP請求對映到greeting()方法。

  上面的例子並沒有指定GETPUTPOST等等,因為@RequestMapping在預設情況下對映所有的HTTP操作。使用@RequestMapping(method=GET)來縮小這個對映。

  @RequestParam將查詢的字串引數name的值繫結到greeting()方法的name引數中。這個查詢字串引數被顯式地標記為可選的(預設情況下required=true):如果在請求中沒有,則使用defaultValue中的“World”。

  方法主體的實現建立並返回一個帶有idcontent屬性的新Greeting物件,該物件基於counter的下一個值,並通過使用問候template來格式化給定的name

  傳統的MVC控制器和上面的RESTful Web服務控制器之間的一個關鍵區別是HTTP響應主體的建立方式。這個rest式的web服務控制器並不依賴於檢視技術來執行向HTML的問候資料的伺服器端呈現,而是簡單地填充並返回一個Greeting物件。物件資料將以JSON形式直接寫入HTTP響應。

  這段程式碼使用了Spring 4的新@RestController註釋,它將類標記為一個控制器,其中每個方法都返回一個域物件而不是一個檢視。它是@Controller@ResponseBody的縮寫。

  Greeting物件必須轉換為JSON。由於Spring的HTTP訊息轉換器支援,您不需要手工進行這種轉換。因為 Jackson 2類路徑中,Spring的 MappingJackson2HttpMessageConverter自動選擇Greeting例項轉換為JSON。

使應用程式成為可執行檔案

  儘管可以將此服務打包為用於部署到外部應用伺服器的傳統WAR檔案,但下面演示的更簡單的方法建立了一個獨立的應用程式。您可以將所有內容打包到一個單獨的、可執行的JAR檔案中,這個JAR檔案由一個好的舊Java main()方法驅動。在此過程中,您使用Spring的支援來將Tomcat servlet容器嵌入到HTTP執行時中,而不是將其部署到外部例項中。

src/main/java/hello/Application.java
package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

  @SpringBootApplication是一個方便的註釋,它添加了以下所有內容:

  • @Configuration將類標記為應用程式上下文中bean定義的來源。

  • @EnableAutoConfiguration告訴Spring引導開始新增基於類路徑設定、其他bean以及各種屬性設定。

  • 通常情況下,你會為一個Spring MVC應用新增@EnableWebMvc,但是當Spring引導在類路徑上看到spring-webmvc時,它會自動新增它。這將應用程式標記為web應用程式,並激活諸如設定DispatcherServlet之類的關鍵行為。

  • @ComponentScan告訴Spring在hello包中尋找其他元件、配置和服務,以便找到控制器。

  main()方法使用Spring BootSpringApplication.run()方法來啟動一個應用程式。您注意到沒有一行XML嗎?沒有web.xml檔案。這個web應用程式是100%純Java的,您不需要處理任何管道或基礎設施的配置。

構建一個可執行JAR

  您可以在命令列中使用Gradle或Maven來執行該應用程式。或者您可以構建一個單一的可執行JAR檔案,該檔案包含所有必需的依賴項、類和資源,並執行該檔案。這使得在整個開發生命週期中,跨不同的環境,以及在不同的環境中,將服務作為一個獨立的應用程式進行釋出、版本和部署服務變得更加容易。

  在Maven中,如果是Linux作業系統,我們需要在應用程式下使用./mvnw spring-boot:run,如果是windows作業系統,我們需要在應用程式下使用mvnw spring-boot:run或者你可以在Linux下使用./mvnw clean package如果在windows下使用mvnw clean package。然後你就可以執行這個JAR檔案了,執行指令如下:

java -jar target/gs-rest-service-0.1.0.jar

   上面的過程將建立一個可執行的JAR。您也可以選擇構建一個典型的WAR檔案。

測試服務

  現在服務已經執行,訪問http://localhost:8080/greeting,你將會看到:

{"id":1,"content":"Hello, World!"}

  新增查詢引數name訪問http://localhost:8080/greeting?name=User。注意,內容屬性的值從“Hello,World!”變成“Hello User!”:

{"id":2,"content":"Hello, User!"}

  這一變化表明,GreetingController中的@RequestParam是按預期工作的。name引數被賦予了“World”的預設值,但是總是可以通過查詢字串顯式地覆蓋它。

  還要注意id屬性是如何從1變更為2的。這就證明了您在多次請求中對同一個GreetingController例項進行了操作,並且它的計數器欄位在每次呼叫時都是按照預期的那樣遞增的。

相關推薦

構建基於虛擬用戶的vsftpd服務器且每個用戶擁有獨立的目錄

utils acc spa mkdir 下載 內容 權限 name useradd 第一步:安裝需要的軟件vsftp,db4-utils,ftp(用於測試) [root@yangf ~]#yum -y install vsftpd db

構建基於RocketMQ的分布式事務服務

com aca 防止 本地事務 image 就會 分析 oid ndt 說在前面 Apache RocketMQ-4.3.0正式Release了事務消息的特性,順著最近的這個熱點。第一篇文章,就來聊一下在軟件工程學上的長久的難題——分布式事務(Distributed Tra

基於天氣預報項目談springcloud構建的微服務(一)

個人理解 動態 spring 解決方案 消費 服務架構 方式 mage 什麽是 單體架構 簡單介紹一下四個模塊分別的作用: 城市信息模塊: 主要是調用第三方服務獲取所有的城市信息,用於數據采集的時候調用 數據采集模塊: 由於是基於調用第三方 api 的服務,所以我們要考

構建基於RocketMQ的分散式事務服務

說在前面 Apache RocketMQ-4.3.0正式Release了事務訊息的特性,順著最近的這個熱點。第一篇文章,就來聊一下在軟體工程學上的長久的難題——分散式事務(Distributed Transaction)。 這個技術也在各個諸如阿里,騰訊等大廠的

微服務實戰(三):落地微服務架構到直銷系統(構建基於RabbitMq的訊息匯流排)

從前面文章可以看出,訊息匯流排是EDA(事件驅動架構)與微服務架構的核心部件,沒有訊息匯流排,就無法很好的實現微服務之間的解耦與通訊。通常我們可以利用現有成熟的訊息代理產品或雲平臺提供的訊息服務來構建自己的訊息匯流排;也可以自己完全寫一個訊息代理產品,然後基於它構建自己的訊息匯流排。通常我們不用重複造輪子(除

構建基於rest的Web服務

構建的rest的Web服務所要實現的功能   構建一個接受HTTP GET請求的服務,如下: http://localhost:8080/greeting   greeting響應的json資料格式如下: {"id":1,"content":"He

構建基於CXF的WebService服務(2)-- 利用CXF提供的wsdl2java工具建立客戶端

1、環境配置 將CXF_HOME/bin加入到環境變數path中,如我的是D:\Java\Jar\apache-cxf-2.7.7\bin 開啟cmd輸入 wsdl2java -v 出現如下資訊表示配

使用ASP.NET Web Api構建基於REST風格的服務實戰系列教程【三】——Web Api入門

前言 經過前2節的介紹,我們已經把資料訪問層搭建好了,從本章開始就是Web Api部分了。在正式開始之前,再一次回顧一下Web Api的應用場景:Web Api可以與 MVC,WebForm結合使用,也可以作為一個單獨的Web服務。在正式討論Web Api的配置以及如何構造我們的URI來消費資源之前,我

Docker從入門到掉坑(二):基於Docker構建SpringBoot微服務

本篇為Docker從入門到掉坑第二篇:基於Docker構建SpringBoot微服務,沒有看過上一篇的最好讀過 Docker 從入門到掉坑 之後,閱讀本篇。 在之前的文章裡面介紹瞭如何基於docker容器部署一些常見的基礎環境,例如MySQL、Redis這些,那麼這篇文章裡面我會介紹一些關

使用 Jersey 和 Apache Tomcat 構建 RESTful Web 服務

eclipse encode 服務器 form red 了解 響應代碼 知識 -s RESTful Web 服務簡單介紹 REST 在 2000 年由 Roy Fielding 在博士論文中提出,他是 HTTP 規範 1.0 和 1.1 版的首席作者之中的一個。

構建基於Javascript的移動web CMS——Hello,World

引用 ack div line gin round bottom log important 在一篇構建基於Javascript的移動web CMS入門——簡單介紹中簡單的介紹了關於墨頎CMS的一些原理,其極框架組成。於是開始接著應該說明一下這個CMS是怎樣一步步搭建起

java網絡編程學習之——構建基於多線程的網絡通信模型1

傳遞 println util adl 多個 start oid stream 數值   該例展示了多用戶/服務器通信模型,包含三個文件:Server.java ServerThread.java 和Client.java類。其中ServerThread類支持多線程,為

Maven - 構建基於Maven的ssh分模塊項目

inpu utf8 out str odin ans dialect rep ica 一、數據庫準備 1.創建數據庫maven create database maven character set utf8 collate utf8_general_ci; //u

基於網站服務器防禦DDOS辦法的前沿技術

五九盾網絡 ddos防禦 網絡安全防攻擊 五九盾解讀DDOS攻擊原理和防禦辦法分布式拒絕服務(DDoS)攻擊是目前互聯網僅次於蠕蟲病毒的第二大威脅,每年造成的經濟損失達千億美元。由於其利用互聯網的系統漏洞和安全隱患進行攻擊,具有行為自然,難以防範的特點。研究如何防禦DDoS攻擊的安全機制已成為網絡

使用.net core在Ubuntu構建一個TCP服務

ask 技術分享 string 行程 art write star 可能 工作 介紹和背景 TCP編程是網絡編程領域最有趣的部分之一。在Ubuntu環境中,我喜歡使用.NET Core進行TCP編程,並使用本機Ubuntu腳本與TCP服務器進行通信。以前,我在.NET框架本

基於Windows服務的WCF

ora 基於 int get poi service() ont host tables (1)創建WCF 代碼示例: [ServiceContract] public interface ILimsDBService { [OperationContract] int E

構建基於Suricata+Splunk的IDS入侵檢測系統

多核 訪問 直觀 isf 文件路徑 github 優勢 external dconf 一.什麽是IDS和IPS? IDS(Intrusion Detection Systems):入侵檢測系統,是一種網絡安全設備或應用軟件,可以依照一定的安全策略,對網絡、系統的運行狀況進行

net 和Mono 構建的HTTP服務框架

ots .config app pac spn 請求方法 park 找不到 get   Nancy是一個基於.net 和Mono 構建的HTTP服務框架,是一個非常輕量級的web框架。    設計用於處理 DELETE, GET, HEAD, OPTIONS, POST,

用commit方式構建具有sshd服務的centos鏡像

docker sshd1.從遠程倉庫中pull centos鏡像docker pull centos2.查詢鏡像docker images[root@HA2 kehj]# docker imagesREPOSITORY TAG IMAGE ID

構建Squid代理服務

reload) color 停止 /dev/null class 轉發 頁面 錯誤 則表達式 Squid(Squid cache,簡稱Squid)是Linux系統中最常用的一款開源代理服務軟件,可以很好地實現HTTP和FTP,以及DNS查詢、SSL等應用的緩存代理,