Retrofit相关依赖
implementation'com.squareup.retrofit2:retrofit:2.9.0'
implementation'com.squareup.retrofit2:converter-gson:2.9.0'
基本使用步骤:
在进行请求之前,要先创建一个接口:
public interface HttpBinService {
//所有的请求都要以注解的方式进行声明
//有两种提方式:FormUrlEncoded(对应key-value形式)或者MulityPart(文件形式)
//@Field("xxx")这里面是传的参数的名字
//https:www.httpbin.org/post xxx=value
//括号后面是拼接在请求BaseUrl后面的,"https://www.httpbin.org/get?username=张三&pwd=456"
//这里是以表单的形式提交的
@POST("post")
@FormUrlEncoded
Call post(@Field("username") String name, @Field("pwd") String password);
//get请求要传参数,使用的就是Query;post请求要传参数,使用的就是Field
@GET("get")
Call get(@Query("username") String username, @Query("pwd") String password);
}
接口创建好之后在对应位置声明成员变量和初始化retrofit和接口实例化对象
private Retrofit retrofit;
private HttpBinService binService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
retrofit = new Retrofit.Builder().baseUrl("https:www.httpbin.org").build();
binService = retrofit.create(HttpBinService.class);
}
1.POST请求
- 请求有同步和异步请求,同步调用excute,异步调用enqueue;区别是同步请求是阻塞执行,在没有收到服务器反馈之前,不会有任何操作,异步请求是不用等待服务器反馈,可以继续执行其他逻辑。
- 1.1 基础请求:
//retrofit中的post请求,基础使用
public void post(View view) {
Call call = binService.post("xxx", "123");
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
try {
Log.i(TAG, "onResponse:"+response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call call, Throwable t) {
}
});
}
- 1.2 以RequestBody方式进行请求
没有添加@FormUrlEncoded注解,但请求返回的形式与之相同
public interface HttpBinService {
//此处没有@FormUrlEncoded注解
@POST("post")
Call postBody(@Body RequestBody body);
}
所以在代码请求时候需要自己来封装
public void postBody(View view) {
//手动封装key-value,请求结果与添加了@FormUrlEncoded注解的形式相同
//相对于添加@FormUrlEncoded来说更加灵活
FormBody formBody = new FormBody.Builder()
.add("a","1").add("b","2").build();
Call bodyCall = binService.postBody(formBody);
bodyCall.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
try {
Log.i(TAG, "onResponse:"+response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call call, Throwable t) {
}
});
}
- 1.3使用Path形式来请求
@Path注解相当于替换,将参数替换并添加到请求地址后面
public interface HttpBinService {
//此时拼接出来的地址形式为: "https://www.httpbin.org/path",
//添加了头部(用于区分android和ios),同时以表单形式提交了用户名和密码
@POST("{id}")
@FormUrlEncoded
Call postInPath(@Path("id") String path
, @Header("os") String os
, @Field("username") String name
, @Field("pwd") String pwd);
}
实际请求如下:
public void usePath(View view) {
Call call = binService.postInPath("post","android","xxxxx","123456");
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
try {
Log.i(TAG, "onResponse:"+response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call call, Throwable t) {
}
});
}
- 1.4使用多个请求头
使用多个请求头的目的一般是用来区分平台或者上传版本号等等
public interface HttpBinService {
//多个头
@Headers({"os:android", "version:1.0.0"})
@POST("post")
Call postWithHeaders();
}
方法调用
public void usePostHeaders(View view) {
Call call = binService.postWithHeaders();
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
try {
Log.i(TAG, "onResponse:"+response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call call, Throwable t) {
}
});
}
- 1.5使用URL请求
public interface HttpBinService {
//url注解,也要加上相关注解POST或者GET,指定的是一个完整的地址,不看BaseUrl,只看传递进来的地址
@POST
Call postInUrl(@Url String url);
}
请求地址要自己指定
public void usePostInUrl(View view) {
// 自己指定请求地址
Call call = binService.postInUrl("https://www.httpbin.org/post");
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
try {
Log.i(TAG, "onResponse:"+response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call call, Throwable t) {
}
});
}
2.GET请求
- 和post请求一样均有同步请求和异步请求,请求方式相同
//retrofit中的get请求,基础使用
public void get(View view) {
Call call = binService.get("bigzing", "456");
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
try {
Log.i(TAG, "onResponse:"+response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call call, Throwable t) {
}
});
}