OkHttp+ Retrofit使用从0开始(二)

前言

经过前一章的介绍,相信已经对这个框架的使用有了大概的了解。本章我们主要探讨使用过程中具体的细节部分:

  • Retrofit中ConvertFactory
  • 如何添加header
  • 同步和异步分别如何实现
  • @Query、@Path、@Field等,分别代表什么含义

Retrofit中的ConvertFactory

上章中我们手动创建了ScreenConvert类,需要在convert()方法自己获取到string,并解析成module对象。但通过官方提供的库,可以将这个过程直接省略,这里我用官方推荐的Gson举列子。

OkHttp+ Retrofit使用从0开始(二)_第1张图片

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

你可能感兴趣的:(框架,异步,retrofit)