当前位置: 移动技术网 > IT编程>移动开发>Android > Android网络请求框架Retrofit详解

Android网络请求框架Retrofit详解

2019年07月24日  | 移动技术网IT编程  | 我要评论

邪神魔掌,常州装潢,混战博物馆

介绍:

retrofit 是square公司开发的一款针对android网络请求的框架,retrofit2底层基于okhttp实现的,okhttp现在已经得到google官方认可,大量的app都采用okhttp做网络请求。本文使用retrofit2.0.0版本进行实例演示。

使用retrofit可以进行get,post,put,delete等请求方式。

同步请求:需要在子线程中完成,会阻塞主线程。

response response = call.execute().body();

异步请求:请求结果在主线程中回调,可以在onresponse()回调方法进行更新ui。

call.enqueue(callback callback)

使用步骤:

(1) 创建工程,添加jar:

compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0' //这两个jar版本要一致,否则会有冲突

(2) 创建业务请求接口,具体代码如下

/**
 * 创建业务请求接口
 */

public interface iuserservice {
 /**
  * get请求
  */
 @get("servlet/userservlet")
 call<user> getuser(@query("email") string email);

 /**
  * post请求
  */
 @formurlencoded
 @post("userservlet")
 call<user> postuser(@field("name") string name, @field("email") string email);
}


解释说明:

@get注解表示get请求,@query表示请求参数,将会以key=value(@query注解参数名称为key,调用传进来的值为value)的方式拼接在url后面.

@post注解表示post请求,@formurlencoded将会自动将请求参数的类型设置为application/x-www-form-urlencoded,@formurlencoded注解不能用于get请求。@field注解将每一个请求参数都存放至请求体中,还可以添加encoded参数,该参数为boolean型,具体的用法为:
@field(value = "password", encoded = true) string pwd
encoded参数为true的话,key-value-pair将会被编码,即将中文和特殊字符进行编码转换.

(3)创建retrofit对象

retrofit retrofit = new retrofit.builder()
    .baseurl(constant.base_url)
    .addconverterfactory(gsonconverterfactory.create())
    .build();
iuserservice iuserservice = retrofit.create(iuserservice.class);


解释说明:

baseurl()方法制定网络请求的固定绝对地址,一般包括请求协议(如http)、域名或ip地址、端口号。
创建retrofit实例时,若没有配置addconverterfactory(gsonconverterfactory.create())将会回调出json字符串,配置了将会回调实体对象。

支持的json解析库:

gson: compile ‘com.squareup.retrofit2:converter-gson:2.0.1'
jackson: compile ‘com.squareup.retrofit2:converter-jackson:2.0.1'
moshi: compile ‘com.squareup.retrofit2:converter-moshi:2.0.1'
protobuf: compile ‘com.squareup.retrofit2:converter-protobuf:2.0.1'
wire: compile ‘com.squareup.retrofit2:converter-wire:2.0.1'
simple xml: compile ‘com.squareup.retrofit2:converter-simplexml:2.0.1'
scalars (primitives, boxed, and string): compile ‘com.squareup.retrofit2:converter-scalars:2.0.1'

(4) 调用请求方法,并得到call实例

call<responsebody> call = iuserservice.getuser(xing-java@foxmail.com);

(5) 使用call实例完成同步或异步请求

/**
  * 发送get请求
  */
 private void getrequest() {
  retrofit retrofit = new retrofit.builder()
    .baseurl(constant.base_url)
    .addconverterfactory(gsonconverterfactory.create())
    .build();
  iuserservice iuserservice = retrofit.create(iuserservice.class);
  call<user> call = iuserservice.getuser("xing-java@foxmail.com");
  call.enqueue(new callback<user>() {
   @override
   public void onresponse(call<user> call, response<user> response) {

    log.i("mainactivity", "response = " + response);
    user user = response.body();
    restxtview.settext(user.tostring());
   }

   @override
   public void onfailure(call<user> call, throwable t) {

   }
  });
 }


请求方式:

(1)get 请求:

get 请求返回 json 字符串:

这里写图片描述

get 请求返回实体对象:

这里写图片描述

(2) post发送表单:

 /**
  * 发送post请求
  */
 private void postrequest() {
  retrofit retrofit = new retrofit.builder()
    .baseurl(constant.base_url)
    .addconverterfactory(gsonconverterfactory.create())
    .build();
  iuserservice iuserservice = retrofit.create(iuserservice.class);
  call<user> call = iuserservice.postuser("star.tao", "xing-java@foxmail.com");
  call.enqueue(new callback<user>() {
   @override
   public void onresponse(call<user> call, response<user> response) {
   }

   @override
   public void onfailure(call<user> call, throwable throwable) {

   }
  });


服务端接收到的结果:

这里写图片描述

(3)文件上传:

private void uploadfile() {
  retrofit retrofit = new retrofit.builder()
    .addconverterfactory(gsonconverterfactory.create())
    .baseurl(constant.base_url)
    .build();
  iuserservice iuserservice = retrofit.create(iuserservice.class);
  file file = new file("/sdcard/s.png");
  requestbody filerequestbody = requestbody.create(mediatype.parse("multipart/form-data"), file);
  multipartbody.part multipartbody = multipartbody.part.createformdata("upload_file", file.getname(), filerequestbody);
  string desc = "this is file description";
  requestbody descrequestbody = requestbody.create(mediatype.parse("multipart/form-data"), desc);
  call<responsebody> call = iuserservice.uploadfile(descrequestbody, multipartbody);
  call.enqueue(new callback<responsebody>() {
   @override
   public void onresponse(call<responsebody> call, response<responsebody> response) {
    log.i("debug", "upload success");
   }

   @override
   public void onfailure(call<responsebody> call, throwable t) {

   }
  });

 }


这里写图片描述

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网