出国作品集,扬州热线棋牌中心,exo鹿晗吸毒
retrofit是一个okhttp网络请求框架的封装库,retrofit通过注解配置网络参数,可以按照我们的规则去构造实际的http请求,能够灵活设置url、头部、请求体、返回值等,是目前最优雅的一个网络框架。
implementation 'com.squareup.retrofit2:retrofit:2.2.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'//添加对rxjava的支持 implementation 'com.squareup.retrofit2:converter-gson:2.1.0' //添加json数据的支持 <uses-permission android:name="android.permission.internet"/>//网络请求必要的权限
retrofit retrofit = new retrofit.builder() .baseurl("http://id1.option****.cc:***1/")//retrofit2 的baseulr 必须以 /(斜线) 结束 .build(); retrofitservice service = retrofit.create(retrofitservice.class);//创建接口的代理对象
public interface retrofitservice { @get("/pursuit/getpursuitinfo") call<responsebody> getblog(@query("id") int id); @get("/pursuit/getpursuitinfo/{id}") call<responsebody> getblog2(@path("id") string id); }
//异步的回调 call<responsebody> call = service.getblog(123); call.enqueue(new callback<responsebody>() { @override public void onresponse(call<responsebody> call, retrofit2.response<responsebody> response) { try { log.i("返回信息",response.body().string()+"");//打印返回信息 } catch (ioexception e) { e.printstacktrace(); } } @override public void onfailure(call<responsebody> call, throwable t) { t.printstacktrace();//错误信息 } }); /*同步的回调,如果不是在一个activity或者一个fragment中去执行,那么也就意味着,你可以不需要开启子线程去执行网络请求。如果是在主线程,就必须开启子线程来进行同步请求 使用call.execute()同步请求,只能调用一次。如果要多次使用这个方法,需要 call.clone()重新生成新的call实例*/ new thread(new runnable() { @override public void run() { try { retrofit2.response<responsebody> response = call.execute(); response.body(); } catch (ioexception e) { e.printstacktrace(); } } });
get: 请求指定的页面信息,以?分割url和传输数据,参数之间以&相连,最多只能是1024字节,并返回实体主体,该操作用于获取信息而非修改信息
head: 只请求页面的首部。
post: post表示可能修改变服务器上的资源的请求,.post的安全性要比get的安全性高
put: 从客户端向服务器传送的数据取代指定文档的内容。
需要理解并灵活搭配使用
responsebody是retrofit网络请求回来的原始数据类。get方式可以在url后面串联
@path注解用于替换请求参数,@query注解相当于url后面的串联,他们可以同时使用
请看下面第三种表达式:
@get("/pursuit/getpursuitinfo?id=123") call<responsebody> getcall(); @post("/pursuit/getpursuitinfo") call<responsebody> getblog(@query("id") int id); @get("/pursuit/getpursuitinfo/{id}") call<responsebody> getblog2(@path("id") string id);
需要用到@http注解
/* method:网络请求的方法,注意大小写 * path:网络请求地址路径 * hasbody:是否有请求体 * {id} 表示是一个变量*/ @http(method = "get", path = "/pursuit/getpursuitinfo/{id}", hasbody = false) call<responsebody> getcall(@path("id") int id);
@body是post方式提交非form的表单
@post("/pursuit/getpursuitinfo") observable<string> getpursuitinfo(@body user user);
如果请求的form表单,需要用@formurlencoded标注,@field注解用于表单字段,它和@fieldmap都需要@formurlencoded配合使用
@field和@query都是表单字段,@fieldmap和@query都是批量增加表单的提交域。区别如上图,一个拼接在url上适用于get方式,一个体现在请求体上试用于post方式,区分好使用场景。
@post("/pursuit/getpursuitinfo")
@formurlencoded
call<responsebody> testformurlencoded1(@field("username") string name, @field("age") int age);
两种请求头的,@header用于添加不固定的请求头,作用于方法的参数。@headers用于添加固定的请求头,作用于方法
@headers("authorization: authorization") @get("/pursuit/getpursuitinfo") call<responsebody> getuser(); @get("/pursuit/getpursuitinfo") call<responsebody> getuser(@header("authorization") string authorization);
用@url替换已经设置的baseurl
@get public call<responsebody> profilepicture(@url string url);
@post("user/updateavatar.do") @multipart call<responsebody> upload(@part("upload1\"; filename=\"image1.jpg\"") requestbody imgs );
发送form-encoded的数据,用于有文件上传的场景时要用 @multipart 注解,@part和@partmap适用于有文件上传的情况
@post("mobile/upload") @multipart call<responsebody> upload(@part multipartbody.part file);
※以上就是所有参数注解的用法,需要实践灵活试用。
retrofit retrofit = new retrofit.builder() .baseurl("http://id1.option****.cc:***1/")//retrofit2 的baseulr 必须以 /(斜线) 结束 .addconverterfactory(gsonconverterfactory.create())//添加对gson的支持 .build();
public interface postroute { @headers({"content-type: application/json","accept: application/json"})//需要添加头 @post("api/flyroute/add") call<flyroutebean> postflyroute(@body requestbody route);//传入的参数为requestbody }
flyroutebean flyroutebean=new flyroutebean(); flyroutebean=initdata(flyroutebean);//根据bean类初始化一个需要提交的数据类 gson gson=new gson(); string route= gson.tojson(flyroutebean);//通过gson将bean转化为json字符串形式
requestbody body=requestbody.create(okhttp3.mediatype.parse("application/json; charset=utf-8"),route); //将json转换成requestbody请求体 call<flyroutebean> call=postroute.postflyroute(body);//提交
compile 'io.reactivex.rxjava2:rxjava:2.1.0' compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
retrofit retrofit = new retrofit.builder() .baseurl("http://id1.option****.cc:***1/")//retrofit2 的baseulr 必须以 /(斜线) 结束 .addconverterfactory(gsonconverterfactory.create())//添加对gson的支持 .addcalladapterfactory(rxjava2calladapterfactory.create())//添加对rxjava的支持 .build();
@get("top250") observable<movieentity> gettopmovie(@query("start") int start, @query("count") int count);
observable<string> observable =service.gettopmovie(0, 10) .subscribeon(schedulers.io()) .observeon(androidschedulers.mainthread()) .subscribe(new observer<responsebody>() { @override public void onsubscribe(disposable d) { } @override public void onnext(responsebody responsebody) { } @override public void onerror(throwable e) { } @override public void oncomplete() { } });
-dontwarn retrofit.** -keep class retrofit.** { *; } -keepattributes signature -keepattributes exceptions
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Android studio开发小型对话机器人app(实例代码)
Android通过Java sdk的方式接入OpenCv的方法
Android 通过cmake的方式接入opencv的方法步骤
Android Studio finish()方法的使用与解决app点击“返回”(直接退出)
Android 进度条 ProgressBar的实现代码(隐藏、出现、加载进度)
网友评论