前言
经过前一章的介绍,相信已经对这个框架的使用有了大概的了解。本章我们主要探讨使用过程中具体的细节部分:
- Retrofit中ConvertFactory
- 如何添加header
- 同步和异步分别如何实现
- @Query、@Path、@Field等,分别代表什么含义
Retrofit中的ConvertFactory
上章中我们手动创建了ScreenConvert类,需要在convert()方法自己获取到string,并解析成module对象。但通过官方提供的库,可以将这个过程直接省略,这里我用官方推荐的Gson举列子。
1.在build.gradle里面添加”com.squareup.retrofit2:converter-goon”;
2.按照图上的说明,把前篇文章中的ScreenConvert.FACTOYR替换成上图中GsonConverterFactory.create();
3.这个时候需要我们创建moudle(Gson包会自动把返回的数据转换成对象);
public class ScreenBean{
private String title;//title和size需要和服务器返回的字段一致
private String size;
public String getTitle(){return title;}
public String getSize(){return size;}
}
4.在CallBack的回调中,通过response.body()可以获取到module对象。
添加header
添加header,添加可以分为两种方式.
第一种在call的头部添加
@Headers({ "Accept: application/vnd.github.v3.full+json", "User-Agent: Retrofit-Sample-App" }) @GET("users/{username}") Call<User> getUser(@Path("username") String username);
第二种在Interceptor中添加
private Interceptor mInterceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Response response = chain.proceed(request); if(TextUtils.isEmpty(token)){ return response.newBuilder() .build(); }else{ return response.newBuilder() .header("Bear",token) .removeHeader("Pragma") .build(); } } }; OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(mInterceptor) .build();
同步和异步分别如何实现
定义Service的函数时候决定
异步
定义的部分
public interface DemoService { Call<ScreenBean> getLogin( @Field("title") String ucode, @Field("size") String password; }
引用部分
mDemoService.getLogin(UCode,password,clientCode,PUUID,POS).enqueue(new Callback<LoginModel>()
同步
定义的部分
public interface DemoService { @GET("/user/{id}/photo") Photo getUserPhoto(@Path("id") int id); }
调用部分
mDemoService.getLoginModule
@Query、@Path、@Field等,分别代表什么含义
- Query
query会把文件添加到路径的后面。
interface QueryGET{ @GET("/sheet") String getString(@Query("name")String name,@Query("age") int age,@QueryMap(encodeNames=true) Map<String, String> filters); }
实际的访问网址:…/sheet?name=laiqurufeng&age=22&gender=male&address=sz
引用部分:
encodeNames=true表示对url的query进行url编码,同理还有encodeValues. 这2个的值默认都是true的
如果上面的代码换成 map.put(“性别”,”男”) ,然后更改@QueryMap(encodeNames=false )
那么实际访问的url变成了…/sheet?name=laiqurufeng&age=22&性别=%E7%94%B7&address=sz (可以看到key没有进行url编码,value进行了url编码).
@Path
看名字,就知道是替换的意思;Field和Part
post请求的时候发送form-data,表单数据要使用@FormUrlEncoded注解. 每一对键值对都要用@Field进行注解, 包括名字和value对象的值.
@FormUrlEncoded @POST("/user/edit") User updateUser(@Field("first_name") String first, @Field("last_name") String last);
用@Multipart注解来发送multipart-data,每一个part用@part注解.
@Multipart @PUT("/user/photo") User updateUser(@Part("photo") TypedFile photo, @Part("description") TypedString description);
参考文档:
http://square.github.io/retrofit/
http://www.cnblogs.com/laiqurufeng/p/4484889.html