第七章 springboot + retrofit

retrofit:一套RESTful架构的Android(Java)客户端实现。

好处:

  • 基于注解
  • 提供JSON to POJO,POJO 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>

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 }

说明:

  • 实现了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 }

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 }

说明:该类提供了三个方法,也是将来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>

说明:引入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 }

说明:

  • 使用 @[email protected] 构建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 }

说明:

  • 该接口指定了调用远程服务的方法的基本路径与参数以及返回值等
  • 路径都是相对路径,相对于setEndpoint("http://localhost:8081")指定的路径
  • 方式有@GET/@POST/@PUT/@DELETE等
  • 传递参数在get方式中可以直接将参数连到URL上去
  • 传递参数使用@Query(服务被调用方使用@RequestParam接收),路径中的传递参数使用@Path(Restful风格),还可以直接传递一个对象@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 }

说明:

  • 使用 @[email protected] 构建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     }

说明:

  • 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     }

测试:

首先,启动服务myboot2,浏览器输入"localhost:8081/swagger-ui.html"可以查看服务是否启动成功。

其次,启动服务myboot,浏览器输入"localhost:8080/swagger-ui.html",再进行相应接口的测试即可。

参考自:

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

时间: 2024-10-09 22:38:48

第七章 springboot + retrofit的相关文章

第七章 springboot + retrofit(转载)

本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5350861.html retrofit:一套RESTful架构的Android(Java)客户端实现. 好处: 基于注解 提供JSON to POJO,POJO to JSON,网络请求(POST,GET,PUT,DELETE等)封装 可以看做是对HttpClient的再次封装 1.为了做测试,建立了一个新的springboot项目"myboot2",项目结构如下: 1.1.pom.xml <

第十六章 springboot + OKhttp + String.format

模拟浏览器向服务器发送请求四种方式: jdk原生的Http包下的一些类 httpclient(比较原始,不怎么用了):第一章 HttpClient的使用 Okhttp(好用,推荐) retrofit(好用,推荐),用法:第七章 springboot + retrofit 看本章之前可以先看看第七章 springboot + retrofit 1.myboot2项目 1.1.application.properties 1 server.port=8081 注意:指定服务器启动端口的有三种方式 在

第七章

第七章 控制发光二极管. 尽管linux 驱动直接和硬件打交道,但并不是linux驱动直接向硬件中的内存写数据,而是与本机的i/o内存进行交互.所谓I/O内存是通过各种接口(PCI, USB.蓝牙以太网等)连接到主机的硬件在主机的内存映射.Linux内核提供了多个与I/O内存交互的函数.Linux内核的内存管理模块负责同步I/O内存与硬件的数据. 每一个连接Linux 的硬件在I/O内存中都会有映射首地址.在使用ioread 32.ioread32等函数读写I/O内存时需要指定这些首地址.Led

第七章:常用类

第七章:常用类 包装类 java中有8中基本类型,对应有八种包装类作用:包装类中封装了该类型常用的属性和方法,以方便操作.byte---->Byteshort--->Shortint--->Integerlong---->Longfloat---->Floatdouble---->Doublechar---->Characterboolean---->Boolean装箱:将基本数据类型转换成包装类,经常通过构造方法完成.Integer i = new Int

构建之法学习(第七章 MSF)

第七章 MSF MSF(Microsoft Solution Framework)微软解决方案框架: MSF是一套大型系统开发指南,是微软推荐的软件开发方法,它描述了如何用组队模型.过程模型和应用模型来开发Client/Server结构的应用程序,是在微软的工具和技术的基础上建立并开发分布式企业系统应用的参考. 一.MSF 9条基本原则 1.推动信息共享与沟通 --把所有信息都保留并公开,讨论要包括所有涉及的角色,决定要公开并告知所有人. 当然,对牵涉到技术机密.安全性等信息要采取必要的保护措施

Android开发艺术探索——第七章:Android动画深入分析

Android开发艺术探索--第七章:Android动画深入分析 Android的动画可以分成三种,view动画,帧动画,还有属性动画,其实帧动画也是属于view动画的一种,,只不过他和传统的平移之类的动画不太一样的是表现形式上有点不一样,view动画是通过对场景的不断图像交换而产生的动画效果,而帧动画就是播放一大段图片,很显然,图片多了会OOM,属性动画通过动态的改变对象的属性达到动画效果,也是api11的新特性,在低版本无法使用属性动画,但是我们依旧有一些兼容库,OK,我们还是继续来看下详细

第九章 前七章总结考试答案

前七章总结测验见附件内容

ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse

ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 提供ROS接口的3D软件比较多,本章以最典型的Gazebo介绍为主,从Player/Stage/Gazebo发展而来,现在独立的机器人仿真开发环境,目前2016年最新版本Gazebo7.1配合ROS(kinetic)使用. 补充内容:http://blo

构建之法第六、七章读后感

第六章 Scrum 是一个用于开发和维持复杂产品的框架 ,是一个增量的.迭代的开发过程.Scrum包括了一系列实践和预定义角色的过程骨架.Scrum中的主要角色包括同项目经理类似的Scrum主管角色负责维护过程和任务,产品负责人代表利益所有者,开发团队包括了所有开发人员. 敏捷流程一共有4步: 第一步:弄懂需求与任务是相互依赖的关系 第二步:想要学会把一个任务从产品层级的描述逐步细化到技术实现层面,那么技术能力和交流能力尤为重要的,根据每个人的能力来分配任务以保证任务的高效完成. 第三步:个人要