Retrofit⽹络请求详解以及Content-Type简介
1、application/x-www-form-urlencoded:最常使⽤的类型(默认也是这种类型),主要⽤于提交不带⽂件的post数据。
2、multipart/form-data:需要结合boundary使⽤,提交⽂件时必须使⽤这种类型,当不只包含⽂件或者不只⼀个⽂件时,使⽤boundary分割。
介绍:
Retrofit 是Square公司开发的⼀款针对Android⽹络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官⽅认可,⼤量的app都采⽤OkHttp做⽹络请求。本⽂使⽤Retrofit2.0.0版本进⾏实例演⽰。
使⽤Retrofit可以进⾏GET,POST,PUT,DELETE等请求⽅式。
同步请求:
同步请求:需要在⼦线程中完成,会阻塞主线程。
Response response = ute().body();
异步请求:请求结果在主线程中回调,可以在onResponse()回调⽅法进⾏更新UI。
异步请求:
使⽤步骤:
android retrofit(1) 创建⼯程,添加jar:
compile 'fit2:retrofit:2.0.0'
compile 'fit2:converter-gson:2.0.0'//这两个jar版本要⼀致,否则会有冲突
(2) 创建业务请求接⼝,具体代码如下
/**
* 创建业务请求接⼝
*/
publicinterfaceIUserService {
/**
* 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 = newRetrofit.Builder()
.baseUrl(Constant.BASE_URL)
.ate())
.build();
IUserService iUserService = ate(IUserService.class);
解释说明:
baseUrl()⽅法制定⽹络请求的固定绝对地址,⼀般包括请求协议(如Http)、域名或IP地址、端⼝号。
创建Retrofit实例时,若没有配置ate())将会回调出JSON字符串,配置了将会回调实体对象。
⽀持的JSON解析库:
Gson: compile ‘fit2:converter-gson:2.0.1'
Jackson: compile ‘fit2:converter-jackson:2.0.1'
Moshi: compile ‘fit2:converter-moshi:2.0.1'
Protobuf: compile ‘fit2:converter-protobuf:2.0.1'
Wire: compile ‘fit2:converter-wire:2.0.1'
Simple XML: compile ‘fit2:converter-simplexml:2.0.1'
Scalars (primitives, boxed, and String): compile ‘fit2:converter-scalars:2.0.1'
(4) 调⽤请求⽅法,并得到Call实例
Call<ResponseBody> call = User(xing-java@foxmail);
(5) 使⽤Call实例完成同步或异步请求
/**
* 发送GET请求
*/
private void getRequest() {
Retrofit retrofit = newRetrofit.Builder()
.baseUrl(Constant.BASE_URL)
.ate())
.build();
IUserService iUserService = ate(IUserService.class);
Call<User> call = User("xing-java@foxmail");
@Override
publicvoidonResponse(Call<User> call, Response<User> response) { Log.i("MainActivity", "response = "+ response);
User user = response.body();
resTxtView.String());
}
@Override
public void onFailure(Call<User> call, Throwable t) {
}
});
}
请求⽅式:
(1)GET 请求:
GET 请求返回 JSON 字符串:
GET 请求返回实体对象:
(2) POST发送表单:
/**
* 发送POST请求
*/
private void postRequest() {
Retrofit retrofit = newRetrofit.Builder()
.baseUrl(Constant.BASE_URL)
.ate())
.build();
IUserService iUserService = ate(IUserService.class);
Call<User> call = iUserService.postUser("star.tao", "xing-java@foxmail");
@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 = newRetrofit.Builder()
.ate())
.baseUrl(Constant.BASE_URL)
.build();
IUserService iUserService = ate(IUserService.class);
File file = newFile("/sdcard/s.png");
RequestBody fileRequestBody = ate(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part multipartBody = ateFormData("upload_file", Name(), fileRequestBody); String desc = "this is file description";
RequestBody descRequestBody = ate(MediaType.parse("multipart/form-data"), desc); Call<ResponseBody> call = iUserService.uploadFile(descRequestBody, multipartBody);
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
Log.i("debug", "upload success");
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论