是时候来了解一波Retrofit2了。
来源:互联网 发布:战锤全面战争优化补丁 编辑:程序博客网 时间:2024/05/21 06:37
之前的网络请求一直是用的okhttp,这段时间了解了一下retrofit2,发现比自己封装的okhttp灵活很多,他的所有请求方式都是用接口实现,不像okhttp那样,万一想获取一个新的callback,又得重新封装一个方法。
由于retrofit2默认用okhttp请求网络,所以已经不需要再导入okhttp了。
如果返回的类型是Call,那么就响应OkHttp的callback
可以配合RxJava使用,返回的类型设置为Oservable。
导包:
compile 'io.reactivex:rxjava:1.1.3' compile 'io.reactivex:rxandroid:1.1.0' compile 'com.squareup.retrofit2:retrofit:2.0.2' compile 'com.squareup.retrofit2:converter-gson:2.0.2' compile 'com.squareup.retrofit2:converter-scalars:2.0.2' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2' compile 'com.jakewharton:butterknife:7.0.1'
在这里遇到一些坑,如果下面三个少一个,返回他不支持的结果时,就会崩溃,这也是上面为什么会导那么多包的原因。
private static Retrofit getRetrofit(String url) { return new Retrofit.Builder().baseUrl(url) //增加返回值为String的支持 .addConverterFactory(ScalarsConverterFactory.create()) //增加返回值为Gson的支持(以实体类返回) .addConverterFactory(GsonConverterFactory.create()) //增加返回值为Oservable<T>的支持 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); }
GET请求:
http://wthrcdn.etouch.cn/weather_mini?city=深圳
public interface IWeather { @GET("/weather_mini") Observable<Weather> getWeather(@Query("city") String city);}
public static final String url_weather = "http://wthrcdn.etouch.cn"; public static IWeather getIWeather() { return getRetrofit(url_weather).create(IWeather.class); }
HttpUtil.getIWeather().getWeather("深圳") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<Weather>() { @Override public void call(Weather weather) { tv.setText(weather.getData().getGanmao()); } });
Post请求:
根据后台,Multipart或FormUrlEncoded,如果不知道最好两种都试一下,我在这里也是遇了大坑,如果方式错了,根本就post不上去。。
Multipart(这个是用的自己的服务器,后面的人看到这篇博客可能这个api就用不了了)
http://122.114.38.95:8857
参数是 action , 如果action=banner就可以返回正确结果否则错误结果
@Multipart @POST("/") Observable<String> getBanner(@Part("action") String action);
public static final String url_bannertest = "http://122.114.38.95:8857";public static IBannerTest getBanner() { return getRetrofit(url_bannertest).create(IBannerTest.class); }
HttpUtil.getBanner().getBanner("banner") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<String>() { @Override public void call(String s) { tv.setText(s); } });
FormUrlEncoded:(借用了w3c的教程里的url)
http://www.w3school.com.cn/ajax/demo_post2.asp
参数 fname,lname
@FormUrlEncoded @POST("/ajax/demo_post2.asp") Observable<String> postW3c(@Field("fname") String fname, @Field("lname") String lname);
public static final String w3c_url = "http://www.w3school.com.cn"; public static IW3c getIW3C() { return getRetrofit(w3c_url).create(IW3c.class); }
HttpUtil.getIW3C().postW3c("Long","Hoyn") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<String>() { @Override public void call(String s) { tv.setText(s); } });
post上传图片:
在这里是用了image++的接口。
http://apicn.imageplusplus.com/analyze?
参数:api_key,api_secret, img
@Multipart @POST("/analyze") Observable<String> upLoadImage( @Part("api_key") String api_key, @Part ("api_secret") String api_secret,@Part MultipartBody.Part file );
public static final String imagepp_url = "http://apicn.imageplusplus.com"; public static IImagePP getIImagePP() { return getRetrofit(imagepp_url).create(IImagePP.class); } public static MultipartBody.Part postFileParams(String key, File file) { RequestBody fileBody = RequestBody.create(MediaType.parse("image/*"), file); return MultipartBody.Part.createFormData(key, file.getName(), fileBody); }
File file = new File(Environment.getExternalStorageDirectory()+"/123.png"); HttpUtil.getIImagePP().upLoadImage("c1a2b3ab56a2f218aed9b2ab3c16ce88","be8318b73cef1c2bcafb6c8a77922436",HttpUtil.postFileParams("img", file)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<String>() { @Override public void call(String s) { tv.setText(s); } });
private static Retrofit getRetrofit(String url) { return new Retrofit.Builder().baseUrl(url) .addConverterFactory(ScalarsConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); }
上面说到了Retrofit加入了3句。
ScalarsConverterFactory是支持返回String类型
GsonConverterFactory是支持返回实体类。
RxJavaCallAdapterFactory是支持返回rxJava的Observable。
上面的例子Get请求用到了GsonConverterFactory和RxJavaCallAdapterFactory。
Post用到了ScalarsConverterFactory和RxJavaCallAdapterFactory
少一个都会蹦,所以大家用retrofit需要注意这一点。
- 是时候来了解一波Retrofit2了。
- Android OkHttp完全解析 是时候来了解OkHttp了
- Android OkHttp完全解析 是时候来了解OkHttp了
- Android OkHttp完全解析 是时候来了解OkHttp了
- Android OkHttp完全解析 是时候来了解OkHttp了
- Android OkHttp完全解析 是时候来了解OkHttp了
- Android OkHttp完全解析 是时候来了解OkHttp了
- Android OkHttp完全解析 是时候来了解OkHttp了
- Android OkHttp完全解析 是时候来了解OkHttp了
- Android OkHttp完全解析 是时候来了解OkHttp了
- Android OkHttp完全解析 是时候来了解OkHttp了
- Android OkHttp完全解析 是时候来了解OkHttp了
- Android OkHttp完全解析 是时候来了解OkHttp了
- Android OkHttp完全解析 是时候来了解OkHttp了
- Android OkHttp完全解析 是时候来了解OkHttp了
- Android OkHttp完全解析 是时候来了解OkHttp了
- Android OkHttp完全解析 是时候来了解OkHttp了
- Android OkHttp完全解析 是时候来了解OkHttp了
- IOS开发-自动布局Autoresizing和Autolayout
- C++作业5
- oracle 多表联合查询总结归纳
- MathType使用中的四个小技巧
- 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加MIME映射
- 是时候来了解一波Retrofit2了。
- CBATTRequest 学习笔记
- MFC Cbutton添加文本,获取文本
- [一起学Hive]之二–Hive函数大全-完整版
- LeetCode 25. Reverse Nodes in k-Group
- linux cat命令详解
- Objective-C的属性和成员变量用法及关系浅析
- VMware 虚拟机迁移
- Android开发记录