1. 基本使用
Retrofit
网络请求的工作本质上是OkHttp
完成,而Retrofit
仅负责 网络请求接口的封装。- App应用程序通过
Retrofit
请求网络,实际上是使用Retrofit
接口层封装请求参数、Header
、Url 等信息,之后由OkHttp
完成后续的请求操作 - 在服务端返回数据之后,
OkHttp
将原始的结果交给Retrofit
,Retrofit
根据用户的需求对结果进行解析。
Retrofit是采用注解形式的高层封装。
基本使用步骤
- 创建网络请求返回结果的数据类
data class Info(
var name: String,
var url: String,
var picurl: String,
var artistsname: String
)
- 创建用于描述网络请求的接口(采用注解的形式)
Retrofit
将Http
请求 抽象成 Java接口:采用注解
描述网络请求参数 和配置网络请求参数。
Retrofit
动态的将接口的注解翻译为一个Http请求,最后执行。接口中每个方法的参数都需要使用注解标注。
interface Api {
@GET("api/rand.music")
fun getJsonData(@Query("sort") sort: String, @Query("format") format: String): Call<Data<Info>>
}
- 创建
Retrofit
实例, 创建网络请求接口实例并配置网络请求参数
val retrofit = Retrofit.Builder()
.baseUrl("https://api.uomg.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val api = retrofit.create(Api::class.java)
val callData = api.getJsonData("新歌榜", "json")
- 同步或者异步发送请求
callData.enqueue(object : Callback<Data<Info>> {
override fun onResponse(call: Call<Data<Info>>, response: Response<Data<Info>>) {
mBinding.text.setText(Gson().toJson(response.body()))
}
override fun onFailure(call: Call<Data<Info>>, t: Throwable) {
mBinding.text.setText(t.message)
}
})
完整代码
class MainActivity : AppCompatActivity() {
private lateinit var mBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
mBinding.buttonSend.setOnClickListener {
sendRequest()
}
mBinding.buttonClear.setOnClickListener {
mBinding.text.setText("")
}
}
fun sendRequest() {
val retrofit = Retrofit.Builder()
.baseUrl("https://api.uomg.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val api = retrofit.create(Api::class.java)
val callData = api.getJsonData("新歌榜", "json")
callData.enqueue(object : Callback<Data<Info>> {
override fun onResponse(call: Call<Data<Info>>, response: Response<Data<Info>>) {
mBinding.text.setText(Gson().toJson(response.body()))
}
override fun onFailure(call: Call<Data<Info>>, t: Throwable) {
mBinding.text.setText(t.message)
}
})
}
请求结果