目录
1、系列文章:
Retrofit源码学习五:Retrofit中同步、异步请求解析
2、相关视频:
Retrofit网络库https://www.imooc.com/learn/10002https://www.imooc.com/learn/1000第一个视频过于简单
破解Retrofithttps://www.imooc.com/learn/1128https://www.imooc.com/learn/1128
第二个又过于繁琐
这个刚好入门使用
3、简介和流程:
Retrofit 是基于OKhttp网络请求框架的二次封装,本质是OKhttp。所以说Retrofit并不是一个网络框架、它只是一个网络框架封装。
总结:
1、APP应用程序通过Retrofit请求网络,实际上是使用Retrofit接口层封装请求参数,之后由Okhttp完成后续的请求操作
2、在服务端返回数据之后,Okhttp将原始的结果交给Retrofit,Retrofit根据用户的需求对结果进行解析
参数作用:
4、使用:
4.1、添加依赖:
//rxjava
implementation 'io.reactivex:rxjava:1.1.3'
//rxandroid
implementation 'io.reactivex:rxandroid:1.1.0'
//retrofit
implementation 'com.squareup.retrofit2:retrofit:2.0.2'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
implementation 'com.squareup.retrofit2:converter-scalars:2.0.2'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
4.2、代码体现:
4.3.1、HttpbinService.java
package com.test.retro1.test2;
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;
/**
* @author songzi522
* on 2021/9/21
* Description:
*/
public interface HttpbinService {
// https://www.httpbin.org/post xxx=value
@POST("post")
@FormUrlEncoded
Call<ResponseBody> post(@Field("username") String userName, @Field("password") String pwd);
@GET("get")
Call<ResponseBody> get(@Query("username") String userName, @Query("password") String pwd);
}
4.3.2、RetroTest2Activity.java
package com.test.retro1.test2;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import com.test.retro1.R;
import java.io.IOException;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class RetroTest2Activity extends AppCompatActivity {
private static final String TAG = "RetroTest2Activity";
private Retrofit retrofit;
private HttpbinService service;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_retro_test2);
retrofit = new Retrofit.Builder()
.baseUrl("https://www.httpbin.org/")//设置网络请求的URL地址
.build();
service = retrofit.create(HttpbinService.class);
findViewById(R.id.btn_get).setOnClickListener(view -> getQingQiu());
findViewById(R.id.btn_post).setOnClickListener(view -> post());
}
private void getQingQiu() {
retrofit2.Call<ResponseBody> call = service.get("lance", "123");
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
Log.i(TAG, "onResponse: "+response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}
private void post() {
retrofit2.Call<ResponseBody> call = service.post("lance", "123");
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
Log.i(TAG, "onResponse: "+response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}
}
4.2.3、布局文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".test2.RetroTest2Activity">
<TextView
android:id="@+id/tv_mark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RetroTest2Activity"
android:textSize="30sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_get"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_mark"
android:text="get请求"
android:textSize="26sp"
android:textAllCaps="false"
/>
<Button
android:id="@+id/btn_post"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn_get"
android:text="post请求"
android:textSize="26sp"
android:textAllCaps="false"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
4.2.4、打印
get请求打印
RetroTest2Activity: onResponse: {
"args": {
"password": "123",
"username": "lance"
},
"headers": {
"Accept-Encoding": "gzip",
"Host": "www.httpbin.org",
"User-Agent": "okhttp/3.2.0",
"X-Amzn-Trace-Id": "Root=1-6149b2a0-5e21c7f72ef94f3e27651520"
},
"origin": "113.118.106.233",
"url": "https://www.httpbin.org/get?username=lance&password=123"
}
post请求打印:
RetroTest2Activity: onResponse: {
"args": {},
"data": "",
"files": {},
"form": {
"password": "123",
"username": "lance"
},
"headers": {
"Accept-Encoding": "gzip",
"Content-Length": "27",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "www.httpbin.org",
"User-Agent": "okhttp/3.2.0",
"X-Amzn-Trace-Id": "Root=1-6149b36a-2646a65b7e3551205f394e0c"
},
"json": null,
"origin": "113.118.106.233",
"url": "https://www.httpbin.org/post"
}
4.3、总结:
- 1、添加Retrofit库的依赖,添加网络权限
- 2、创建 接收服务器返回数据 的类
- 3、创建 用于描述网络请求 的接口
- 4、创建 Retrofit实例
- 5、创建 网络请求接口实例
- 6、发送网络请求(异步、同步)
- 7、处理服务器返回的数据