本篇博客转发自: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

<?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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xxx</groupId>
<artifactId>myboot2</artifactId>
<version>1.0-SNAPSHOT</version> <properties>
<java.version>1.8</java.version><!-- 官方推荐 -->
</properties> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.5.RELEASE</version>
</parent> <!-- 引入实际依赖 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 使用swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.2.2</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

1.2、Application.java

package com.xxx.secondboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; import springfox.documentation.swagger2.annotations.EnableSwagger2; @SpringBootApplication
@EnableSwagger2
public class Application implements EmbeddedServletContainerCustomizer{ public static void main(String[] args) {
SpringApplication.run(Application.class, args);
} /**
* EmbeddedServletContainerCustomizer接口的未实现方法
* 指定容器的启动端口,之后再浏览器输入localhost:8081/swagger-ui.html即可
*/
public void customize(ConfigurableEmbeddedServletContainer container) {
container.setPort(8081);
} }

说明:

  • 实现了EmbeddedServletContainerCustomizer接口,并实现了其方法customize(ConfigurableEmbeddedServletContainer container),指定了该服务的启动端口是8081,这样在服务myboot(启动端口:8080)启动时,就不会存在端口冲突问题了.

1.3、Hotel.java

package com.xxx.secondboot.domain;

public class Hotel {
private int id;
private String hotelname; public Hotel() {
} public Hotel(int id, String hotelname) {
this.id = id;
this.hotelname = hotelname;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getHotelname() {
return hotelname;
} public void setHotelname(String hotelname) {
this.hotelname = hotelname;
}
}

1.4、HotelController.java

package com.xxx.secondboot.web;

import java.util.ArrayList;
import java.util.List; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import com.xxx.secondboot.domain.Hotel; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; @RestController
@RequestMapping("/hotel")
@Api("HotelController相关api")
public class HotelController { @ApiOperation("获取酒店Hotel信息:getHotelWithQueryParameter")
@RequestMapping(value="/getHotelWithQueryParameter",method=RequestMethod.GET)
public Hotel getHotelWithQueryParameter(@RequestParam("hotelname") String hotelname) {
if(hotelname.equals("nana")){
return new Hotel(777, "假日酒店");
}
return new Hotel(1314, "玫瑰酒店");
} @ApiOperation("获取酒店Hotel信息:getHotelList")
@RequestMapping(value="/getHotelList",method=RequestMethod.POST)
public List<Hotel> getHotelList() {
List<Hotel> hotelList = new ArrayList<>();
hotelList.add(new Hotel(1314, "玫瑰酒店"));
hotelList.add(new Hotel(2046, "2046酒店"));
return hotelList;
} @ApiOperation("获取酒店Hotel信息:getHotelListWithBody")
@RequestMapping(value="/getHotelListWithBody",method=RequestMethod.POST)
public List<Hotel> getHotelListWithBody(@RequestBody Hotel hotel) {
List<Hotel> hotelList = new ArrayList<>();
if(hotel.getHotelname().equals("武林酒店")){
hotelList.add(new Hotel(13141, "玫瑰酒店1"));
hotelList.add(new Hotel(20461, "2046酒店1"));
return hotelList;
}
hotelList.add(new Hotel(1314, "玫瑰酒店"));
hotelList.add(new Hotel(2046, "2046酒店"));
return hotelList;
}
}

说明:该类提供了三个方法,也是将来myboot服务远程调用的三个方法。

2、myboot项目基于上一节的结构继续编写

2.1、pom.xml

<!-- retrofit -->
<dependency>
<groupId>com.squareup.retrofit</groupId>
<artifactId>retrofit</artifactId>
<version>1.9.0</version>
</dependency>

说明:引入retrofit1.9.0依赖,与2.0的差别很大。

2.2、RestAdapterConfig.java

package com.xxx.firstboot.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import retrofit.RestAdapter; @Configuration
public class RestAdapterConfig { /**
* 获取RestAdapter单例Bean
* @return
*/
@Bean
public RestAdapter getRestAdapter(){
/**
* setEndpoint("http://localhost:8081"):指定基本的URL,
* API接口中的URL是相对于该URL的路径的,
* 不能少了协议名,例如写成:localhost:8081就不行
*/
RestAdapter adapter = new RestAdapter.Builder()
.setEndpoint("http://localhost:8081")
.build();
return adapter;
} }

说明:

  • 使用 @Configuration+@Bean 构建RestAdapter单例。
  • 在构建的过程中,一定要有setEndpoint("http://localhost:8081")方法,该方法指定了基本的URL(即:指定协议+IP+port)

2.3、HotelAPI.java

package com.xxx.firstboot.retrofit.api;

import java.util.List;

import com.xxx.firstboot.domain.Hotel;

import retrofit.http.Body;
import retrofit.http.GET;
import retrofit.http.POST;
import retrofit.http.Query; public interface HotelAPI { /**
* GET请求带查询参数
*/
@GET("/hotel/getHotelWithQueryParameter")
public Hotel getHotelWithQueryParameter(@Query("hotelname") String hotelname); /**
* POST请求
*/
@POST("/hotel/getHotelList")
public List<Hotel> getHotelList(); /**
* POST请求,带参数JavaBean
*/
@POST("/hotel/getHotelListWithBody")
public List<Hotel> getHotelListWithBody(@Body Hotel hotel); }

说明:

  • 该接口指定了调用远程服务的方法的基本路径与参数以及返回值等
  • 路径都是相对路径,相对于setEndpoint("http://localhost:8081")指定的路径
  • 方式有@GET/@POST/@PUT/@DELETE等
  • 传递参数在get方式中可以直接将参数连到URL上去
  • 传递参数使用@Query(服务被调用方使用@RequestParam接收),路径中的传递参数使用@Path(Restful风格),还可以直接传递一个对象@Body(服务被调用方使用@RequestBody接收),参数在请求头中@Header(服务被调用方使用@RequestHeader接收)
  • 依旧要建一个Hotel类,最好与myboot2中的相同,不同也没关系

2.4、HotelAPIConfig.java

package com.xxx.firstboot.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import com.xxx.firstboot.retrofit.api.HotelAPI; import retrofit.RestAdapter; @Configuration
public class HotelAPIConfig {
@Autowired
private RestAdapter adapter; @Bean
public HotelAPI getHotelAPI(){
return adapter.create(HotelAPI.class);
}
}

说明:

  • 使用 @Configuration+@Bean 构建HotelAPI单例。
  • HotelAPI接口实例是由RestAdapter来构建的,所以需要注入了RestAdapter

经过以上步骤后,之后就可以直接在其他类中注入HotelAPI实例来像普通的bean进行操作了。

2.5、UserService.java

@Autowired
private HotelAPI hotelApi; public Hotel getHotelFromMyboot2WithQueryParameter(String hotelname){
return hotelApi.getHotelWithQueryParameter(hotelname);
} public List<Hotel> getHotelFromMyboot2List(){
return hotelApi.getHotelList();//测试post请求
} public List<Hotel> getHotelFromMyboot2ListWithBody(Hotel hotel){
return hotelApi.getHotelListWithBody(hotel);//测试post请求
}

说明:

  • service中注入了HotelAPI实例,使用该实例调用接口方法
  • 其实,retrofit的接口的注入和使用与mybatis的注解方式的mapper接口的使用相似

2.6、UserController.java

@Autowired
private UserService userService; @ApiOperation("获取酒店信息,测试GETWithQueryParameter")
@RequestMapping(value="/getHotelWithQueryParameter",method=RequestMethod.GET)
public Hotel getHotel(@RequestParam("hotelname") String hotelname) {
return userService.getHotelFromMyboot2WithQueryParameter(hotelname);
} @ApiOperation("获取酒店信息,测试POST")
@RequestMapping(value="/getHotelList",method=RequestMethod.GET)
public List<Hotel> getHotelList() {
return userService.getHotelFromMyboot2List();
} @ApiOperation("获取酒店信息,测试POST")
@RequestMapping(value="/getHotelListWithBody",method=RequestMethod.GET)
public List<Hotel> getHotelListWithBody() {
return userService.getHotelFromMyboot2ListWithBody(new Hotel(888, "武林酒店"));
}

测试:

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

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

参考自:

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

第七章 springboot + retrofit(转载)的更多相关文章

  1. 第七章 springboot + retrofit

    retrofit:一套RESTful架构的Android(Java)客户端实现. 好处: 基于注解 提供JSON to POJO,POJO to JSON,网络请求(POST,GET,PUT,DELE ...

  2. 第五章 springboot + mybatis(转载)

    本编博客转发自:http://www.cnblogs.com/java-zhao/p/5350021.html springboot集成了springJDBC与JPA,但是没有集成mybatis,所以 ...

  3. 第三章 springboot + jedisCluster(转载)

    本编博客转发自:http://www.cnblogs.com/java-zhao/p/5347703.html 如果使用的是redis2.x,在项目中使用客户端分片(Shard)机制. 如果使用的是r ...

  4. 第六章 springboot + 事务(转载)

    本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5350106.html 在实际开发中,其实很少会用到事务,一般情况下事务用的比较多的是在金钱计算方面. myba ...

  5. 第四章 springboot + swagger(转载)

    此篇博客转发自:http://www.cnblogs.com/java-zhao/p/5348113.html swagger用于定义API文档. 好处: 前后端分离开发 API文档非常明确 测试的时 ...

  6. 第十六章 springboot + OKhttp + String.format

    模拟浏览器向服务器发送请求四种方式: jdk原生的Http包下的一些类 httpclient(比较原始,不怎么用了):第一章 HttpClient的使用 Okhttp(好用,推荐) retrofit( ...

  7. 7第七章联接和APPLY运算符(转载)

    7第七章联接和APPLY运算符 原文链接 本文由豆约翰博客备份专家远程一键发布

  8. Linux Shell 示例精解(第七章 gawk编程)转载

    第七章 gawk功能:gawk编程 7.1.1 数字和字符串常量     初始化和类型强制  在awk中,变量不需要定义就可以直接使用,使用一个变量就是对变量的定义.变量的类型可以试数字.字符串,或者 ...

  9. [Effective Java]第七章 方法

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

随机推荐

  1. 阅读{django-restframework}源码[generics.py]学习笔记

    首先django-restframework是基于django的一个框架.   mixins.py中开头是这样写的: Basic building blocks for generic class b ...

  2. ubuntu下 too many file open 异常

    后台高并发或者多线程的情况下,无论是操作数据库还是操作文件,应用报出 too many file open 异常,其原因是受宿主系统文件数的限制.问题解决方式如下: 第一步:检查所在系统的文件数限制 ...

  3. c语言自定义BOOL函数

    C语言中没有BOOL类型变量,它是C++独有的,由于使用BOOL类型可以使代码更具有可读性,很多编程者都在C中自己定义了类似的应用,一般方法有两种: 第一种:采用宏定义方式 typedef int B ...

  4. 转 LoadRunner 技巧之THML 与 URL两种录制模式分析

    Loadrunner的Virtual User Generator 提供人脚本的录制功能,对于初学者来说,这大大的降低了编写脚本的门槛,loadrunner提供两种录制脚本的方式:Html_based ...

  5. IDEA springMVC - hello world

    记录所学,防忘记... ide用IDEA,用maven管理依赖包 1.建立一个maven-webapp项目:File->New->Project 2.pom.xml <project ...

  6. CVPR 2011 Global contrast based salient region detection

    Two salient region detection methods are proposed in this paper: HC AND RC HC: Histogram based contr ...

  7. 如何将Console application的Program函数变成支持async的?

    如何将Console application的Program函数变成支持async的?   class Program { static void Main(string[] args) { Task ...

  8. linux 学习 13 系统管理

    第十三讲 Linux系统管理 13.1.1进程管理-进程查看 13.1.2进程管理-终止进程 .2工作管理 .3系统资源查看 .4系统定时任务 13.1.1进程管理-进程查看 .进程简介 进程是正在 ...

  9. MySql的连接查询

    类似于oracle的连接查询,mysql连接查询也有左外连接.右外连接.内连接查询.但是,不同的是没有直接 的全外连接查询. 这里介绍MySql的连接查询: 这里已两张表为例:STUDENT 表 和 ...

  10. scrapy爬虫框架入门实例(一)

    流程分析 抓取内容(百度贴吧:网络爬虫吧) 页面: http://tieba.baidu.com/f?kw=%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB&ie=ut ...