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
- Retrofit2.0
- Retrofit2.0
- Retrofit2.0使用详解
- Retrofit2.0使用
- Retrofit2.0的使用
- Retrofit2.0源码分析
- Retrofit2.0使用
- Retrofit2.0 的使用
- Retrofit2.0使用详解
- Retrofit2.0使用详解
- Retrofit2.0实践记录
- Retrofit2.0使用详解
- Retrofit2.0使用详解
- Retrofit2.0使用详解
- 初识Retrofit2.0
- Retrofit2.0基础用法
- Retrofit2.0详解
- retrofit2.0 翻译
- 联想电脑安装虚拟机出现不可恢复的错误
- C语言练习11.12
- 常见15个C语言的标准库
- Android Service 线程
- 并发工具类(二)同步屏障CyclicBarrier
- Retrofit2.0
- android锁屏唤醒并解锁屏幕
- [NOIP2017]蒟蒻翻车记
- matlab自带的分类器的使用实例
- Comparator long类型的比较bug实录
- 飞机调度,白书P325LA3211(2-SAT算法, 二分查找“最小值尽量大”)
- MySQL事务初识
- shell基础,命令历史,别名,通配符,输入输出重定向
- ubuntu16.04搭建ss服务器