基于接口编程的restful客户端 retrofit

retrofit demo

涉及技术

springboot + retrofit + swegger2

测试地址:http://localhost:8080/doc.html

Retrofit简介

Retrofit is a REST Client for Java and Android. It makes it relatively easy to retrieve and upload JSON (or other structured data) via a REST based webservice. In Retrofit you configure which converter is used for the data serialization. Typically for JSON you use GSon, but you can add custom converters to process XML or other protocols. Retrofit uses the OkHttp library for HTTP requests.

Retrofit是Java和Android的REST客户端。 它使通过基于REST的webService和JSON(或其他结构化数据)变得相对容易。 在Retrofit中,您可以配置用于数据序列化的转换器。 通常对于JSON使用GSon,但您可以添加自定义转换器来处理XML或其他协议。 Retrofit使用OkHttp库进行HTTP请求。

  • retrofit 更类似于 spring 的restTemplate 对已有网络请求libary 再次封装,更像是一种增强类似lombok
  • retrofit 基于okHttp ,这两个libary 都是Square Open Source 维护,对于已经使用okHttp的项目可以平滑迁移
  • retrofit 诞生的意义:把Url 和 http请求解耦、打散,针对接口编程、简化代码、增加易读性

OkHttp简介

OkHttp 是类似于 jdk HttpUrlConnection、apache httpclient 的网络http client libary,常见于安卓和java平台

支持httpClient 已有的特性,同步请求、异步回调请求、http2.0、https、自动重试等

retrofit的特性

  1. 支持多种反序列化工具: To convert to and from JSON: Gson: com.squareup.retrofit:converter-gson Jackson: com.squareup.retrofit:converter-jackson Moshi: com.squareup.retrofit:converter-moshi To convert to and from Protocol Buffers: Protobuf: com.squareup.retrofit:converter-protobuf Wire: com.squareup.retrofit:converter-wire To convert to and from XML: Simple XML: com.squareup.retrofit:converter-simplexml
  2. 支持自定义反序列化
  3. 支持请求适配器(java 平台暂时没用 ,andorid-RxJava)
  4. 解耦

为什么使用retrofit

  1. 基于接口编程,解耦,各个http请求之间无关联。修改影响小、容易扩展
  2. 基于目前平台的现状:都使用不同的http网络请求封装,可读性一般、不方便后期维护

Retrofit使用

maven依赖

    <dependency>
     <groupId>com.squareup.retrofit2</groupId>
     <artifactId>retrofit</artifactId>
     <version>2.5.0</version>
    </dependency>
    <dependency>
     <groupId>com.squareup.okhttp3</groupId>
     <artifactId>okhttp</artifactId>
     <version>3.14.1</version>
    </dependency>
    <dependency>
     <groupId>com.squareup.okhttp3</groupId>
     <artifactId>logging-interceptor</artifactId>
     <version>3.14.1</version>
    </dependency>
    <dependency>
     <groupId>com.squareup.retrofit2</groupId>
     <artifactId>converter-jackson</artifactId>
     <version>2.5.0</version>
    </dependency>

retrofit初始化

“`Java
// Retrofit 依赖okHttp 设置okHttp 参数

OkHttpClient.Builder builder = new OkHttpClient.Builder();

OkHttpClient okHttpClient = builder.addInterceptor(new TestInterceptor())

.connectTimeout(connectTimeOut, TimeUnit.MILLISECONDS).readTimeout(readTimeOut, TimeUnit.MILLISECONDS)

.addInterceptor(testInterceptor).addInterceptor(httpLoggingInterceptor).build();


// 反序列化Convert

ObjectMapper mapper = new ObjectMapper();

// 过滤对象的null属性.

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

// 实例化 Retrofit

Retrofit retrofit = new Retrofit.Builder().baseUrl(basicUrl)

.addConverterFactory(JacksonConverterFactory.create(mapper)).client(okHttpClient).build();

“`

Retrofit 方法注解

注解代码请求格式
@GETGET请求
@POSTPOST请求
@DELETEDELETE请求
@HEADHEAD请求
@OPTIONSOPTIONS请求
@PATCHPATCH请求
@HeadersHead 头信息

常用参数注解

注解描述使用结果url
@Pathrestful 替换路径中{},和Spring @PathVariable一样Java @GET("/server/get/{name}") Call<Map<String, Object>> get(@Path("name") String name);Content-Type: text/plain;charset=UTF-8 GET /server/get/name
@Queryurl中拼接参数 在?后Java @POST("/server/query") Call<Map<String, Object>> query(@Query("name") String req);http://localhost:8080/server/query?name=111
@QueryMap:url中拼接参数 在?后Java @POST("/server/queryMap") Call<Map<String, Object>> queryMap(@QueryMap Map<String, Object> req);/server/queryMap?a=111&b=222
@FormUrlEncoded @FieldMap @Field用表单数据提交 @FieldMap form 多参数,@Filed 单参数Java @FormUrlEncoded @POST("/server/form") Call<ResponseBody> form(@FieldMap Map<String, Object> req);Content-Type: application/x-www-form-urlencoded POST /server/form?key1=value1&key2=value2
@Multipart @Part @PartMap@Multipart 表示文件传输 和 @Part(单文件)、@PartMap(多文件) 搭配使用Java @Multipart @POST("/server/upload") Call<ResponseBody> upload(@Part MultipartBody.Part body);以流的方式传输文件
@Bodypost 请求中body 是jsonJava @POST("/server/post") Call<Map<String, Object>> header(@Body Map<String, Object> req);/server/post,body {“name”:”yu”}
Java @POST("/server/mutil/{path}") Call<Map<String, Object>> mutil(@Path("path") String path, @Query("name") String req, @Body Map<String,Object> map);Content-Type: application/json; charset=UTF-8 POST http://localhost:8080/server/mutil/123?name=321 {“test”:”123″}

相关资料:

retrofit官方地址

github地址

retrofit学习视频

okhttp官方地址

github demo