Retroift初探
文章目录
retrofit 初探
引用
maven
1<dependency>
2 <groupId>com.squareup.retrofit2</groupId>
3 <artifactId>retrofit</artifactId>
4 <version>2.1.0</version>
5</dependency>
gradle
1 api 'com.squareup.retrofit2:retrofit:2.1.0'
github
个人意见
其实,最适合使用 retrofit 的是 rest 请求类的交互,如果具体的请求参数是以 url 区分业务逻辑,请求参数通过 json 进行的,那其实 retrofit 不太适用
俗话说,demo 是最好的学习 先来看看怎么定义业务逻辑
1public interface GitHubService {
2 @GET("users/{user}/repos")
3 Call<List<Repo>> listRepos(@Path("user") String user);
4}
这里的{user}是一个会在实际使用时会被动态改变的,会根据 String user 中的变量而改变
1public class RetrofitDemo {
2 private static OkHttpClient client;
3
4 static {
5 client = new OkHttpClient.Builder()
6 .addInterceptor(new HttpInterceptor())
7 .build();
8 }
9
10 public static void main(String[] args) throws IOException {
11 Retrofit retrofit = new Retrofit.Builder()
12 .baseUrl("http://127.0.0.1:32001")
13 .addConverterFactory(GsonConverterFactory.create())
14 // .addConverterFactory(StringConverterFactory.create())
15 .client(client)
16 .build();
17
18 RequestServer requestServer = retrofit.create(RequestServer.class);
19 TestEntity bean = new TestEntity();
20 bean.setTest("text1");
21 Call<ResponseEntity> call = requestServer.post("ping", "test", bean);
22 Response<ResponseEntity> response = call.execute();
23 ResponseEntity body = response.body();
24 System.out.println(body.toString());
25 }
26}
在上述的代码中
访问的 url 是 http://127.0.0.1:32001/ping/test
请求的方式是post
返回值是Call<ResponseEntity>
这里的具体访问是框架实现的
框架会将请求的 Bean 转换成 Json Post 请求到指定的 url
然后返回值也会被转化成对应的类型
这里依赖的是ConverterFactory
这里的使用的GsonConverterFactory
是官方 Demo 中的一个converter
用于实现 bean 到 json 的转化,再将回包转化成 bean 返回
看下GsonConverterFactory
的实现
这里其实就 4 个关键方法
1 @Override
2 public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
3 Retrofit retrofit) {
4 TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
5 return new GsonResponseBodyConverter<>(gson, adapter);
6 }
7
8 @Override
9 public Converter<?, RequestBody> requestBodyConverter(Type type,
10 Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
11 TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
12 return new GsonRequestBodyConverter<>(gson, adapter);
13 }
1@Override public RequestBody convert(T value) throws IOException {
2 Buffer buffer = new Buffer();
3 Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8);
4 JsonWriter jsonWriter = gson.newJsonWriter(writer);
5 adapter.write(jsonWriter, value);
6 jsonWriter.close();
7 return RequestBody.create(MEDIA_TYPE, buffer.readByteString());
8 }
1 @Override public T convert(ResponseBody value) throws IOException {
2 JsonReader jsonReader = gson.newJsonReader(value.charStream());
3 try {
4 return adapter.read(jsonReader);
5 } finally {
6 value.close();
7 }
8 }
前两个方法用于生成 Converter
后面的是 Converter 中的方法 用于将 bean 转化成 RequestBody 和将 ResponseBody 转化成 bean
仿照这个自己写一个 Factory StringConverterFactory
1public final class StringConverterFactory extends Converter.Factory {
2
3 public static StringConverterFactory create() {
4 return new StringConverterFactory();
5 }
6
7 private StringConverterFactory() {
8 }
9
10 @Override
11 public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
12 return new StringResponseBodyConverter();
13 }
14
15 @Override
16 public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
17 return new StringRequestBodyConverter();
18 }
19}
StringRequestBodyConverter
1final class StringRequestBodyConverter implements Converter<String, RequestBody> {
2
3 StringRequestBodyConverter() {
4 }
5
6 @Override
7 public RequestBody convert(String s) throws IOException {
8 return RequestBody.create(MediaType.parse("text/json"), s);
9 }
10}
StringResponseBodyConverter
1final class StringResponseBodyConverter implements Converter<ResponseBody, String> {
2
3 StringResponseBodyConverter() {
4 }
5
6 @Override
7 public String convert(ResponseBody value) throws IOException {
8
9 try {
10 return value.string();
11 } finally {
12 value.close();
13 }
14 }
15}
其实就是 Factory 中的两个方法控制使用哪个转化器转化 两个 Convert 控制怎么转化