Retrofit2简单使用
一、Retrofit是什么?
确切的讲,Retrofit是对okhttp的进一步封装,是一个现在比较火的网络请求框架。
二、使用步骤
1.引入库
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
2.创建一个interface,我们将这个interface取名为HttpBinService
代码如下(示例):
package hk.hkiot.okhttp;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
public interface HttpBinService {
@POST("post")
@FormUrlEncoded
Call<ResponseBody> startPost(@Field("username") String username, @Field("pwd") String pwd);
@GET("get")
Call<ResponseBody> startGet(@Query("username") String username, @Query("pwd") String pwd);
}
我们定义了startPost和startGet方法,其返回类型为retrofit的Call类型,尖括号里是okhttp的ResponseBody类型,@GET/@POST 注解的作用是声明采用GET/POST的方法进行网络请求。
startGet方法中添加参数在方法括号内添加@Query,后面是参数类型和参数字段,Retrofit会把两个字段拼接到接口中,追加到"/get"后面。比如:baseUrl为https://www.httpbin.org/,那么拼接网络接口注解中的地址后变为:https://www.httpbin.org/get,我们需要传入的username=testusername,pwd=123456,那么拼接参数后就是完整的请求地址:https://www.httpbin.org/get?username=testusername&pwd=123456。
startPost方法则需要在头部添加@FormUrlEncoded注解,表示请求实体是一个From表单,每个键值对需要使用@Field注解,使用@Field添加参数,这是发送Post请求时,提交请求的表单字段,必须要添加的。
3.接下来就可以就可以进行网络请求了
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button getAsynBtn;
private Button postAsynBtn;
private Retrofit retrofit;
private HttpBinService httpBinService;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
retrofit = new Retrofit.Builder().baseUrl("https://www.httpbin.org/").build();
httpBinService = retrofit.create(HttpBinService.class);
getAsynBtn = findViewById(R.id.getAsynBtn);
postAsynBtn = findViewById(R.id.postAsynBtn);
getAsynBtn.setOnClickListener(this);
postAsynBtn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.getAsynBtn:
retrofit2.Call<ResponseBody> call = httpBinService.get("hangge", "6666666");
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
try {
Log.e(TAG,response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {
}
});
break;
case R.id.postAsynBtn:
retrofit2.Call<ResponseBody> call1 = httpBinService.post("testusername", "123456");
call1.enqueue(new retrofit2.Callback<ResponseBody>() {
@Override
public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
try {
Log.e(TAG,response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {
}
});
break;
}
}
}