第七章 springboot + retrofit

来源:http://www.cnblogs.com/java-zhao/archive/2016/04/03/5350861.html
-Advertisement-
Play Games

retrofit:一套RESTful架構的Android(Java)客戶端實現。 好處: 基於註解 提供JSON to POJO,POJO to JSON,網路請求(POST,GET,PUT,DELETE等)封裝 可以看做是對HttpClient的再次封裝 1、為了做測試,建立了一個新的spring ...


retrofit:一套RESTful架構的Android(Java)客戶端實現。

好處:

  • 基於註解
  • 提供JSON to POJOPOJO to JSON網路請求(POST,GET,PUT,DELETE等)封裝
  • 可以看做是對HttpClient的再次封裝

1、為了做測試,建立了一個新的springboot項目"myboot2",項目結構如下:

1.1、pom.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 4 
 5     <modelVersion>4.0.0</modelVersion>
 6 
 7     <groupId>com.xxx</groupId>
 8     <artifactId>myboot2</artifactId>
 9     <version>1.0-SNAPSHOT</version>
10 
11     <properties>
12         <java.version>1.8</java.version><!-- 官方推薦 -->
13     </properties>
14     
15     <parent> 
16         <groupId>org.springframework.boot</groupId> 
17         <artifactId>spring-boot-starter-parent</artifactId> 
18         <version>1.2.5.RELEASE</version> 
19     </parent>
20 
21     <!-- 引入實際依賴 -->
22     <dependencies>
23         <dependency>
24             <groupId>org.springframework.boot</groupId>
25             <artifactId>spring-boot-starter-web</artifactId>
26         </dependency>
27         <!-- 使用swagger -->
28         <dependency>
29            <groupId>io.springfox</groupId>
30            <artifactId>springfox-swagger2</artifactId>
31            <version>2.2.2</version>
32         </dependency>
33         <dependency>
34            <groupId>io.springfox</groupId>
35            <artifactId>springfox-swagger-ui</artifactId>
36            <version>2.2.2</version>
37         </dependency>
38     </dependencies>
39 
40     <build>
41         <plugins>
42             <plugin>
43                 <groupId>org.springframework.boot</groupId>
44                 <artifactId>spring-boot-maven-plugin</artifactId>
45             </plugin>
46         </plugins>
47     </build>
48 </project>
View Code

1.2、Application.java

 1 package com.xxx.secondboot;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5 import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
 6 import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
 7 
 8 import springfox.documentation.swagger2.annotations.EnableSwagger2;
 9 
10 @SpringBootApplication
11 @EnableSwagger2
12 public class Application implements EmbeddedServletContainerCustomizer{
13 
14     public static void main(String[] args) {
15         SpringApplication.run(Application.class, args);
16     }
17 
18     /**
19      * EmbeddedServletContainerCustomizer介面的未實現方法
20      * 指定容器的啟動埠,之後再瀏覽器輸入localhost:8081/swagger-ui.html即可
21      */
22     public void customize(ConfigurableEmbeddedServletContainer container) {
23         container.setPort(8081);
24     }
25 
26 }
View Code

說明:

  • 實現了EmbeddedServletContainerCustomizer介面,並實現了其方法customize(ConfigurableEmbeddedServletContainer container),指定了該服務的啟動埠是8081,這樣在服務myboot(啟動埠:8080)啟動時,就不會存在埠衝突問題了.

1.3、Hotel.java

 1 package com.xxx.secondboot.domain;
 2 
 3 public class Hotel {
 4     private int id;
 5     private String hotelname;
 6 
 7     public Hotel() {
 8     }
 9 
10     public Hotel(int id, String hotelname) {
11         this.id = id;
12         this.hotelname = hotelname;
13     }
14 
15     public int getId() {
16         return id;
17     }
18 
19     public void setId(int id) {
20         this.id = id;
21     }
22 
23     public String getHotelname() {
24         return hotelname;
25     }
26 
27     public void setHotelname(String hotelname) {
28         this.hotelname = hotelname;
29     }
30 }
View Code

1.4、HotelController.java

 1 package com.xxx.secondboot.web;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import org.springframework.web.bind.annotation.RequestBody;
 7 import org.springframework.web.bind.annotation.RequestMapping;
 8 import org.springframework.web.bind.annotation.RequestMethod;
 9 import org.springframework.web.bind.annotation.RequestParam;
10 import org.springframework.web.bind.annotation.RestController;
11 
12 import com.xxx.secondboot.domain.Hotel;
13 
14 import io.swagger.annotations.Api;
15 import io.swagger.annotations.ApiOperation;
16 
17 @RestController
18 @RequestMapping("/hotel")
19 @Api("HotelController相關api")
20 public class HotelController {
21 
22     @ApiOperation("獲取酒店Hotel信息:getHotelWithQueryParameter")
23     @RequestMapping(value="/getHotelWithQueryParameter",method=RequestMethod.GET)
24     public Hotel getHotelWithQueryParameter(@RequestParam("hotelname") String hotelname) {
25         if(hotelname.equals("nana")){
26             return new Hotel(777, "假日酒店");
27         }
28         return new Hotel(1314, "玫瑰酒店");
29     }
30     
31     @ApiOperation("獲取酒店Hotel信息:getHotelList")
32     @RequestMapping(value="/getHotelList",method=RequestMethod.POST)
33     public List<Hotel> getHotelList() {
34         List<Hotel> hotelList = new ArrayList<>();
35         hotelList.add(new Hotel(1314, "玫瑰酒店"));
36         hotelList.add(new Hotel(2046, "2046酒店"));
37         return hotelList;
38     }
39     
40     @ApiOperation("獲取酒店Hotel信息:getHotelListWithBody")
41     @RequestMapping(value="/getHotelListWithBody",method=RequestMethod.POST)
42     public List<Hotel> getHotelListWithBody(@RequestBody Hotel hotel) {
43         List<Hotel> hotelList = new ArrayList<>();
44         if(hotel.getHotelname().equals("武林酒店")){
45             hotelList.add(new Hotel(13141, "玫瑰酒店1"));
46             hotelList.add(new Hotel(20461, "2046酒店1"));
47             return hotelList;
48         }
49         hotelList.add(new Hotel(1314, "玫瑰酒店"));
50         hotelList.add(new Hotel(2046, "2046酒店"));
51         return hotelList;
52     }
53 }
View Code

說明:該類提供了三個方法,也是將來myboot服務遠程調用的三個方法。

 

2、myboot項目基於上一節的結構繼續編寫

2.1、pom.xml

1          <!-- retrofit -->
2          <dependency>
3              <groupId>com.squareup.retrofit</groupId>
4              <artifactId>retrofit</artifactId>
5              <version>1.9.0</version>
6          </dependency>
View Code

說明:引入retrofit1.9.0依賴,與2.0的差別很大。

2.2、RestAdapterConfig.java

 1 package com.xxx.firstboot.config;
 2 
 3 import org.springframework.context.annotation.Bean;
 4 import org.springframework.context.annotation.Configuration;
 5 
 6 import retrofit.RestAdapter;
 7 
 8 @Configuration
 9 public class RestAdapterConfig {
10     
11     /**
12      * 獲取RestAdapter單例Bean
13      * @return
14      */
15     @Bean
16     public RestAdapter getRestAdapter(){
17         /**
18          * setEndpoint("http://localhost:8081"):指定基本的URL,
19          * API介面中的URL是相對於該URL的路徑的,
20          * 不能少了協議名,例如寫成:localhost:8081就不行
21          */
22         RestAdapter adapter = new RestAdapter.Builder()
23                 .setEndpoint("http://localhost:8081")
24                 .build();
25         return adapter;
26     }
27 
28 }
View Code

說明:

  • 使用 @Configuration+@Bean 構建RestAdapter單例
  • 在構建的過程中,一定要有setEndpoint("http://localhost:8081")方法,該方法指定了基本的URL(即:指定協議+IP+port)

2.3、HotelAPI.java

 1 package com.xxx.firstboot.retrofit.api;
 2 
 3 import java.util.List;
 4 
 5 import com.xxx.firstboot.domain.Hotel;
 6 
 7 import retrofit.http.Body;
 8 import retrofit.http.GET;
 9 import retrofit.http.POST;
10 import retrofit.http.Query;
11 
12 public interface HotelAPI {
13     
14     /**
15      * GET請求帶查詢參數
16      */
17     @GET("/hotel/getHotelWithQueryParameter")
18     public Hotel getHotelWithQueryParameter(@Query("hotelname") String hotelname);
19     
20     /**
21      * POST請求
22      */
23     @POST("/hotel/getHotelList")
24     public List<Hotel> getHotelList();
25     
26     /**
27      * POST請求,帶參數JavaBean
28      */
29     @POST("/hotel/getHotelListWithBody")
30     public List<Hotel> getHotelListWithBody(@Body Hotel hotel);
31     
32 }
View Code

說明:

  • 該介面指定了調用遠程服務的方法的基本路徑與參數以及返回值等
  • 路徑都是相對路徑,相對於setEndpoint("http://localhost:8081")指定的路徑
  • 方式有@GET/@POST/@PUT/@DELETE等
  • 傳遞參數在get方式中可以直接將參數連到URL上去
  • 傳遞參數使用@Query(服務被調用方使用@RequestParam接收),路徑中的傳遞參數使用@PathRestful風格),還可以直接傳遞一個對象@Body(服務被調用方使用@RequestBody接收)
  • 依舊要建一個Hotel類,最好與myboot2中的相同,不同也沒關係

2.4、HotelAPIConfig.java

 1 package com.xxx.firstboot.config;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.context.annotation.Bean;
 5 import org.springframework.context.annotation.Configuration;
 6 
 7 import com.xxx.firstboot.retrofit.api.HotelAPI;
 8 
 9 import retrofit.RestAdapter;
10 
11 @Configuration
12 public class HotelAPIConfig {
13     @Autowired
14     private RestAdapter adapter;
15     
16     @Bean
17     public HotelAPI getHotelAPI(){
18         return adapter.create(HotelAPI.class);
19     }
20 }
View Code

說明:

  • 使用 @Configuration+@Bean 構建HotelAPI單例。
  • HotelAPI介面實例是由RestAdapter來構建的,所以需要註入了RestAdapter

經過以上步驟後,之後就可以直接在其他類中註入HotelAPI實例來像普通的bean進行操作了。

2.5、UserService.java

 1     @Autowired
 2     private HotelAPI hotelApi;
 3     
 4     public Hotel getHotelFromMyboot2WithQueryParameter(String hotelname){
 5         return hotelApi.getHotelWithQueryParameter(hotelname);
 6     }
 7     
 8     public List<Hotel> getHotelFromMyboot2List(){
 9         return hotelApi.getHotelList();//測試post請求
10     }
11     
12     public List<Hotel> getHotelFromMyboot2ListWithBody(Hotel hotel){
13         return hotelApi.getHotelListWithBody(hotel);//測試post請求
14     }
View Code

說明:

  • service中註入了HotelAPI實例,使用該實例調用介面方法
  • 其實,retrofit的介面的註入和使用與mybatis的註解方式的mapper介面的使用相似

2.6、UserController.java

 1     @Autowired
 2     private UserService userService;
 3     
 4     @ApiOperation("獲取酒店信息,測試GETWithQueryParameter")
 5     @RequestMapping(value="/getHotelWithQueryParameter",method=RequestMethod.GET)
 6     public Hotel getHotel(@RequestParam("hotelname") String hotelname) {
 7         return userService.getHotelFromMyboot2WithQueryParameter(hotelname);
 8     }
 9     
10     @ApiOperation("獲取酒店信息,測試POST")
11     @RequestMapping(value="/getHotelList",method=RequestMethod.GET)
12     public List<Hotel> getHotelList() {
13         return userService.getHotelFromMyboot2List();
14     }
15     
16     @ApiOperation("獲取酒店信息,測試POST")
17     @RequestMapping(value="/getHotelListWithBody",method=RequestMethod.GET)
18     public List<Hotel> getHotelListWithBody() {
19         return userService.getHotelFromMyboot2ListWithBody(new Hotel(888, "武林酒店"));
20     }
View Code

 

測試:

首先,啟動服務myboot2,瀏覽器輸入"localhost:8081/swagger-ui.html"可以查看服務是否啟動成功。

其次,啟動服務myboot,瀏覽器輸入"localhost:8080/swagger-ui.html",再進行相應介面的測試即可。

 

參考自:

http://www.tuicool.com/articles/26jUZjv


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.2 產品特點 Laxcus大數據管理系統運行在電腦集群上,特別強調軟體對分佈資源可隨機增減的適應性。這種運行過程中數據動態波動和需要瞬時感知的特點,完全不同與傳統的集中處理模式。這個特性衍生出一系列的新變化,需要重新審視產品的目標,設計新的架構,當我們把這些需求和定位綜合起來,然後逐一分解歸併 ...
  • 本文講述如何升級Debian8的內核到4.5版本 0x01:去linux kernel官網https://www.kernel.org/下載4.5的內核,選擇tar.xz格式 0x02:想辦法把下載好的包弄進你的虛擬機或...直接你的物理機 0x03:解壓 有的朋友可能沒見過tar.xz格式的包,解 ...
  • input_manager.h #ifndef _INPUT_MANAGER_H #define _INPUT_MANAGER_H #include #define INPUT_TYPE_STDIN 0 #define INPUT_TYPE_TOUCHSCREEN 1 #define INPUT_V... ...
  • 某些環境下(如WIN PE)windows自帶的選擇文件夾api不能使用或者體驗不佳。現在利用GetOpenFileName的回掉參數實現了選擇文件夾選擇功能。 參考:http://blog.csdn.net/norsd/article/details/3476606 ...
  • 這學期我們學操作系統,所以得寫個PCB。 於是我借鑒了一下windows的PCB,寫了這個 那個SingleLinkedList是我自定義的 ...
  • list也就是列表的意思,可以存儲一組數據集合,比如classmates=['zhangsan','lisi','123']每個數據用單引號包裹,逗號隔開。 list是一個有序列表,可以向其中添加單元,在末尾追加 一個數據classmates.append('Adam'),也可以在任意位置添加數據, ...
  • 方法表集合 前面的魔數,次版本號,主板本號,常量池入口,常量池,訪問標誌,類索引,父類索引,介面索引集合,欄位表集合,那麼再接下來就是方法表了. 方法表集合 前面的魔數,次版本號,主板本號,常量池入口,常量池,訪問標誌,類索引,父類索引,介面索引集合,欄位表集合,那麼再接下來就是方法表了. 方法表的 ...
  • 談起C++中的巨集,我們第一個想到的應該就是“#define”,它的基本語法長得像這樣: 巨集的聲明和普通的函數聲明很像,但是兩者之間有本質的區別:C++函數在運行時(runtime)才執行代碼段;而巨集則是在預編譯時期(preprocessor)執行代碼段。下麵簡單介紹一下幾個巨集的應用。 一、考慮下麵的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...