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

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(转载)

    本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5350861.html retrofit:一套RESTful架构的Android(Java)客户端实现. 好处: ...

  2. 第七章 springboot + retrofit

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

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

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

  4. 精通Web Analytics 2.0 (9) 第七章:失败更快:爆发测试与实验的能量

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第七章:失败更快:爆发测试与实验的能量 欢迎来到实验和测试这个棒极了的世界! 如果Web拥有一个超越所有其他渠道的巨大优势,它就 ...

  5. 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...

  6. 《Entity Framework 6 Recipes》中文翻译系列 (41) ------ 第七章 使用对象服务之标识关系中使用依赖实体与异步查询保存

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-7  标识关系中使用依赖实体 问题 你想在标识关系中插入,更新和删除一个依赖实体 ...

  7. Java语言程序设计(基础篇) 第七章 一维数组

    第七章 一维数组 7.2 数组的基础知识 1.一旦数组被创建,它的大小是固定的.使用一个数组引用变量,通过下标来访问数组中的元素. 2.数组是用来存储数据的集合,但是,通常我们会发现把数组看作一个存储 ...

  8. objective-c第七章课后练习2

    题:改变第七章例子中print方法,增加bool参数,判断如果是YES则对分数进行约简 @interface Fraction : NSObject { //int num,den; } @prope ...

  9. 读《编写可维护的JavaScript》第七章总结

      第七章 事件处理 7.1 典型用法 作者首先给了个我们一个处理事件的方法.看起来也没啥俩样,不过后来给出的优化方法很值得学习: // 不好的写法 function handleClick(even ...

  10. 第七章 LED将为我们闪烁:控制发光二极管

     第七章 LED将为我们闪烁:控制发光二极管 本章我们将会看到一个完整的linux驱动程序,通过linux驱动程序控制LED的四个小灯,通俗的说就是通过向linux驱动程序来控制LED小灯的开关.用到 ...

随机推荐

  1. qt——QT中QWidget、QDialog及QMainWindow的区别

    QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标.键盘和其它事件,并且在屏幕上绘制自己.每一个窗口部件都是矩形的,并且它们按Z轴顺序排列.一个窗口部件 ...

  2. python-面向对象-09_类属性和类方法

    类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...

  3. redis连接池的标准用法:

    from .conf import HOST, PORT, POOL_NAME import redis redis_pool = redis.ConnectionPool(host=HOST, po ...

  4. VB.net 与线程

    Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1 ...

  5. jmeter 测试websocket接口(一)

    jmeter 测试websocket接口时,需要对jmeter添加测试websocket的jar包. 下载地址: https://download.csdn.net/download/qq_14913 ...

  6. iOS 常用小功能 总结

    常用小功能 iOS中的很多小功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信等 打电话 方法一(不被采用): 拨号之前会弹框询问用户是否拨号,拨完后能自动回到原应用 NSUR ...

  7. Leetcode: Binary Tree Level Order Transversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  8. AOAPC I: Beginning Algorithm Contests -- Training Guide (Rujia Liu) Chapter 3. Data Structures Fundamental Data Structures

    10410 这题说的是给了一棵多叉树的 bfs遍历轨迹 和dfs 遍历 轨迹 在父节点向叶子节点扩展的时候优先遍历编号较小的节点.我还原出这课树特殊判定 根据bfs的顺序来建立这课树,用一个队列安排要 ...

  9. Excel脱拽或者下拉公式时, 保持公式里单元格数字不变

    绝对引用 可以选中B1 用F4快捷键自己就给加绝对引用符号了 然后回车 复制或者拖拽

  10. 借助IDE到处Runnable JAR 的步骤

    1. 选择项目,右键,export,选择Java目录下的Runnable JAR file , next 2. Lanch configuration 中选择启动类 3. Export destina ...