Retrofit2.0

来源:互联网 发布:淘宝店铺复核秒过技术 编辑:程序博客网 时间:2024/05/17 08:35

Retrofit2.0使用

根据需要添加依赖

//retrofit2compile 'com.squareup.retrofit2:retrofit:2.1.0'//okhttpcompile 'com.squareup.okhttp3:okhttp:3.9.0'//Gson convertercompile 'com.squareup.retrofit2:converter-gson:2.1.0'//RxJava2 Adaptercompile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

在AndroidManifest.xml中添加权限

<!-- 允许程序打开网络套接字 --><uses-permission android:name="android.permission.INTERNET" />

开始!

1 定义接口
1.1
GET方式

// 没有参数的GET请求public interface HttpService {@GET(".")Call<ResponseBody> getPermission();}

说明:GET中的” “填写与下方的baseUrl拼接的path构成完整的URL地址
若没有内容,则填写“.” 或者”/” (但是我测试的时候只有填写 “.” 才正确)
填写”/”提示 NullPointException
< ResponseBody >为默认的请求主体,是OKHttp3的


1.2
当然 GET中也可以带有内容 如带有路径

@GET("路径名") //baseUrl与路径名构成完整路径Call<ResponseBody> getPermission();

1.3
带有变量

@GET("路径名/{变量名}") //baseUrl与路径名构成完整路径Call<ResponseBody> getPermission(@Path("变量名"), 变量类型);

1.4
POST方式

 // 要加上这个  表示请求体是一个表单@FormUrlEncoded// POST方式 如果带参数与baseUrl构成地址 @POST("access_token?")       //通过@Field来指定key,后面跟上value        Call<ResponseBody> getAccessToken(          @Field("client_id") String client_id,@Field("client_secret") String client_secret,          @Field("grant_type") String grant_type,@Field("redirect_uri") String redirect_uri,          @Field("code") String code          );

一定要写至少一个的@Field 否则会报错 Form-encoded method must contain at least one @Field.
field与field之间是原网址的&
并且自动加上key=value的=


call< >这个里面的是得到的返回的类型,默认为OKhttp的ResponseBody类型,当然可以自定义为自己的javaBean类 再通过GSON解析
call<> 方法(@Body )这个Body则是自己的类,通过该类传递数值给方法


2 创建Retrofit实例
创建一个RetrofitUtil类

//创建Retrofit实例Retrofit retrofit = new Retrofit.Builder().baseUrl("http://45.32.72.80/test/lastTime/") // // 基础的url地址 并且结尾一定要以/结尾!.client(builder.build()).build();

结尾要以/结尾,否则会抛出java.lang.IllegalArgumentException: baseUrl must end in /:异常
若你的网址不能以/结尾,那可以截取网址中有/的部分 然后剩下的放在GET(“”)中就可以了


3 用Retrofit创建一个HttpService的代理对象

 //用retrofit创建HttpService对象        HttpService httpService = retrofit.create(HttpService.class);

4 接口调用

Call<ResponseBody> call = service.getPermission(); 

5 异步请求

// 用法和OkHttp的call如出一辙,// 不同的是如果是Android系统回调的OnResponse和OnFailure执行在主线程call.enqueue(new Callback<ResponseBody>() {        @Override        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {            try {            String str=response.body().string();               Log.i("onresponse",str);            } catch (IOException e) {                e.printStackTrace();            }        }        @Override        public void onFailure(Call<ResponseBody> call, Throwable t) {            Log.i("onfailure","onfailure");            t.printStackTrace();        }    });

至此,一个简单的网络请求就做好了!


retrofit注解:
请求方法:

这里写图片描述

①HTTP注解则可以代替以上方法中的任意一个注解
有3个属性:method、path、hasBody

method 表示请求的方法,区分大小写
path表示路径
hasBody表示是否有请求体


标记类
这里写图片描述


参数类

这里写图片描述

1 @GET //当有URL注解时,这里的URL就省略了
Call testUrlAndQuery(@Url String url, @Query(“showAll”) boolean showAll);
@query也类似于Field 只是用于url上

 @GET //当有URL注解时,这里的URL就省略了 (但是没有参数要加("/")或者(".")        Call<ResponseBody> testUrlAndQuery(@Url String url, @Query("showAll") boolean showAll);

完整代码参考:
https://github.com/ikidou/Retrofit2Demo/blob/master/client/src/main/java/com/github/ikidou/Example05.java

2 @Field与@FieldMap和@FormUrlEncoded结合用
将传入的name值赋予username 将传入的age值赋予age

 @POST("/form")@FormUrlEncoded  Call<ResponseBody> testFormUrlEncoded1(@Field("username") String name, @Field("age") int age);   @POST("/form")/** * Map的key作为表单的键 */ Call<ResponseBody> testFormUrlEncoded2(@FieldMap Map<String, Object> map);

3@part和@partMap与@Multipart一起用

 @POST("/form")        @Multipart        Call<ResponseBody> testFileUpload1(@Part("name") RequestBody name, @Part("age") RequestBody age, @Part MultipartBody.Part file);

2,3 具体完整代码参考:
https://github.com/ikidou/Retrofit2Demo/blob/master/client/src/main/java/com/github/ikidou/Example03.java


4 @Headers和@Header
完整代码参考:
https://github.com/ikidou/Retrofit2Demo/blob/master/client/src/main/java/com/github/ikidou/Example04.java


Converter
默认情况下Retrofit只支持将HTTP的响应体转换换为ResponseBody,
而Converter是Retrofit为我们提供用于将ResponseBody转换为我们想要的类型

通过GsonConverterFactory为Retrofit添加Gson支持
1 添加gson库

compile 'com.squareup.retrofit2:converter-gson:2.0.2'

2 配置GSON

Gson gson = new GsonBuilder()      .setDateFormat("yyyy-MM-dd hh:mm:ss")      .create(); 

3 创建retrofit并添加对应的Converter

Retrofit retrofit = new Retrofit.Builder()      .baseUrl("http://localhost:4567/")      //可以接收自定义的Gson,当然也可以不传      .addConverterFactory(GsonConverterFactory.create(gson))      .build();

4 修改接口

public interface BlogService {        @POST("blog")        // 这里的<>里面是参数类型 为Blog        Call<Result<Blog>> createBlog(@Body Blog blog);    }

被@Body注解的的Blog将会被Gson转换成RequestBody发送到服务器

5 创建BlogService的代理对象

BlogService service = retrofit.create(BlogService.class);

6 创建Blog对象 给Blog赋值

Blog blog = new Blog();blog.content = "新建的Blog";blog.title = "测试";blog.author = "怪盗kidou";

7 接口调用

// 类型也是BlogCall<Result<Blog>> call = service.createBlog(blog);

8 call内部具体实现

call.enqueue(new Callback<Result<Blog>>() {            @Override            public void onResponse(Call<Result<Blog>> call, Response<Result<Blog>> response) {                // 在参数中已经将其转换为想要的类型了                Result<Blog> result = response.body();                System.out.println(result);            }            @Override            public void onFailure(Call<Result<Blog>> call, Throwable t) {                t.printStackTrace();            }        });

java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.String okhttp3.ResponseBody.string()’ on a null object reference


Rxjava
上文的Converter是对于Call< T >中T的转换,而CallAdapter则可以对Call转换,这样的话Call中的Call也是可以被替换的,而返回值的类型就决定你后续的处理程序逻辑,同样Retrofit提供了多个CallAdapter,这里以RxJava的为例,用Observable代替Call
Rxjava2学习:http://blog.csdn.net/weixin_37577039/article/details/78555208
Rxjava+retrofit2+OKHttp+GSON实践:
http://blog.csdn.net/weixin_37577039/article/details/78556296


参考链接:http://www.jianshu.com/p/308f3c54abdd

原创粉丝点击