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

前言

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

  • 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值