Retrofit сейчас является популярной платформой сетевых запросов. Ее можно понимать как расширенную версию okhttp с инкапсуляцией Okhttp внизу.
Если быть точным,Retrofit — это пакет инфраструктуры сетевых запросов RESTful http.。потому чтосеть Запрос на работу по существу выполняетсяokhttpзавершить,Retrofit отвечает за инкапсуляцию интерфейса запроса.
https://square.github.io/retrofit/
Добавить сетевые разрешения
<uses-permission android:name="android.permission.INTERNET"/>
Добавить зависимости
implementation ("com.squareup.retrofit2:retrofit:2.9.0")
implementation ("com.squareup.retrofit2:converter-gson:2.9.0")
Retrofit использует много аннотаций для упрощения запросов.,Модернизация абстрагирует запросы okhttp в интерфейсы.,Используйте аннотацию для настройки и описания параметров сетевого запроса.
Метод запроса аннотации | иллюстрировать |
---|---|
@GET | получить запрос |
@POST | отправить запрос |
@PUT | разместить запрос |
@DELETE | удалить запрос |
@PATCH | запрос на исправление,Данный запрос является дополнением к запросу на ссылку,Используется для обновления локальных ресурсов. |
@HEAD | главный запрос |
@OPTIONS | запрос опций |
@HTTP | проходитьаннотация,Могу заменить все вышеперечисленные аннотации,Он имеет три атрибута: метод, путь, hasBody. |
Запросить аннотацию заголовка | иллюстрировать |
---|---|
@Headers | Используется для добавления фиксированных заголовков запроса.,Вы можете добавить несколько,Заголовки запросов, передаваемые этой аннотацией, не перезаписывают друг друга.,но сосуществование |
@Header | Переданный как параметр метода, используемый для добавления нефиксированных заголовков, он обновит существующие заголовки запросов. |
Аннотация параметров запроса | иллюстрировать |
---|---|
@Body | В основном он используется для запросов Post для отправки невыразительных данных. В соответствии с методом преобразования объект экземпляра преобразуется в соответствующую строку для передачи параметров. Например, при использовании Post для отправки данных Json добавление GsonConverterFactory преобразует тело в объект. json-строка для передачи. |
@Filed | Чаще всего он используется для передачи параметров в методе Post. Его необходимо использовать в сочетании с @FromUrlEncoded, то есть параметры передаются в виде формы. |
@FiledMap | В основном используется для полей формы в запросах Post и должен использоваться вместе с @FromUrlEncoded. |
@Part | для полей формы,Part и PartMap используются совместно с @multipartannotation.,Подходящий Загрузка Ситуация с файлом |
@PartMap | для полей формы,Тип приемки по умолчанию:Map<String,RequestBody>,Может использоваться для достижения многократной Загрузки файла. |
@Path | Используется для заполнителей в URL-адресе. |
@Query | Параметры, используемые в запросах Get |
@QueryMap | Аналогично запросу, используется для неопределенных параметров формы. |
@Url | Укажите путь запроса |
Аннотация класса тега | иллюстрировать |
---|---|
@FormUrlEncoded | Указывает на запрос на отправку закодированных данных формы.,Каждая пара ключ-значение должна использовать @Filedannotation. |
@Multipart | Указывает на запрос на отправку данных в формате form_encoded (используется в Загрузке). файласцена),Каждая пара ключ-значение должна использовать @Part для аннотации имени ключа.,Последующие объекты должны предоставлять значения. |
@Streaming | Указывает, что ответ возвращается в виде потока байтов.,Если не использовать аннотацию,По умолчанию все данные будут загружены в память.,Аннотация особенно полезна при загрузке больших файлов. |
@GET("user")
Call<ResponseBody> getData2(@Query("id") long idLon, @Query("name") String nameStr);
@GET("user")
Call<ResponseBody> getData3(@QueryMap Map<String, Object> map);
@FormUrlEncoded
@POST("user/emails")
Call<ResponseBody> getPostData2(@Field("name") String nameStr, @Field("sex") String sexStr);
@FormUrlEncoded
@POST("user/emails")
Call<ResponseBody> getPsotData3(@FieldMap Map<String, Object> map);
@POST("user/emails")
Call<ResponseBody> getPsotDataBody(@Body RequestBody body);
@GET("orgs/{id}")
Call<ResponseBody> getPathData(@Query("name") String nameStr, @Path("id") long idLon);
@Multipart
@POST("user/followers")
Call<ResponseBody> getPartData(@Part("name") RequestBody name, @Part MultipartBody.Part file);
вызов
//Тип объявления, здесь тип текста
MediaType textType = MediaType.parse("text/plain");
//Создаем RequestBody согласно объявленному типу, который преобразуется в объект RequestBody
RequestBody name = RequestBody.create(textType, «Вот текст, который вам нужно написать: Лю Ифэй»);
//Создаем файл, вот демонстрация загрузки изображения
File file = new Файл("Путь к файлу");
if (!file.exists()) {
file.mkdir();
}
//Преобразуем файл в объект RequestBody
//Необходимо выполнить Загрузку в виде файл, вам нужно использовать этот формат: multipart/form-data
RequestBody imgBody = RequestBody.create(MediaType.parse("image/png"), file);
//Преобразуем файл в MultipartBody.Part
//Первый параметр: ключ загружаемого файла; второй параметр: имя файла; третий параметр: объект RequestBody;
MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", file.getName(), imgBody);
Call<ResponseBody> partDataCall = retrofit.create(Api.class).getPartData(name, filePart);
@Multipart
@POST("user/followers")
Call<ResponseBody> getPartMapData(@PartMap Map<String, MultipartBody.Part> map);
вызов
File file1 = new Файл("Путь к файлу");
File file2 = new Файл("Путь к файлу");
if (!file1.exists()) {
file1.mkdir();
}
if (!file2.exists()) {
file2.mkdir();
}
RequestBody requestBody1 = RequestBody.create(MediaType.parse("image/png"), file1);
RequestBody requestBody2 = RequestBody.create(MediaType.parse("image/png"), file2);
MultipartBody.Part filePart1 = MultipartBody.Part.createFormData("file1", file1.getName(), requestBody1);
MultipartBody.Part filePart2 = MultipartBody.Part.createFormData("file2", file2.getName(), requestBody2);
Map<String,MultipartBody.Part> mapPart = new HashMap<>();
mapPart.put("file1",filePart1);
mapPart.put("file2",filePart2);
Call<ResponseBody> partMapDataCall = retrofit.create(Api.class).getPartMapData(mapPart);
Если мы хотим запросить
https://www.psvmc.cn/userlist.json
import java.util.List;
public class ResultListVo<T> {
private int code;
private String msg;
private List<T> obj;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public List<T> getObj() {
return obj;
}
public void setObj(List<T> obj) {
this.obj = obj;
}
}
пользователь
public class UserVo {
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface UserApi {
//получить запрос
@GET("userlist.json")
Call<ResultListVo<UserVo>> getUserList();
}
//Создаем экземпляр модификации
Retrofit retrofit = new Retrofit.Builder()
//Устанавливаем адрес BaseUrl сети запроса
.baseUrl("https://www.psvmc.cn/")
//Устанавливаем парсер данных
.addConverterFactory(GsonConverterFactory.create())
.build();
//создаватьсетьпросить Экземпляр объекта интерфейса
UserApi userApi = mRetrofit.create(UserApi.class);
//Инкапсулируем запрос на отправку
Call<ResultListVo<UserVo>> resultCall = userApi.getUserList();
Вызов синхронизации
//Синхронный запрос
Response<ResultListVo<UserVo>> data= resultCall.execute();
асинхронный вызов
//Асинхронный запрос
resultCall.enqueue(new Callback<ResultListVo<UserVo>>() {
//запрос обратного вызова при успешном выполнении
@Override
public void onResponse(Call<ResultListVo<UserVo>> call, Response<ResultListVo<UserVo>> response) {
ResultListVo<UserVo> body = response.body();
}
//Запросить обратный вызов при ошибке
@Override
public void onFailure(Call<ResultListVo<UserVo>> call, Throwable t) {
}
});
Новая версия Retrofit уже может облегчить использование сопрограмм Kotlin.
Добавьте ключевое слово приостановки,Тип возвратаResponse<T>
import com.xhkjedu.xh_control_appstore.model.ResultListVo
import com.xhkjedu.xh_control_appstore.model.UserVo
import retrofit2.Response
import retrofit2.http.GET
interface UserApi {
//получить запрос
@GET("userlist.json")
suspend fun getUserList(): Response<ResultListVo<UserVo>>
}
GlobalScope.launch {
var result = ApiManager.userApi.getUserList().body()
Log.i("API", Gson().toJson(result))
}
BaseViewModel
import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
open class BaseViewModel : ViewModel() {
var zIsShowMsg = mutableStateOf(false)
var zShowMsgContent = mutableStateOf("")
fun mLaunch(block: suspend () -> Unit) {
viewModelScope.launch(Dispatchers.IO) {
try {
block()
} catch (e: Exception) {
withContext(Dispatchers.Main){
zIsShowMsg.value = true
zShowMsgContent.value = «Запрос интерфейса не выполнен»
}
}
}
}
}
UserViewModel
import android.util.Log
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.ViewModel
import com.google.gson.Gson
import com.xhkjedu.xh_control_appstore.api.ApiManager
import com.xhkjedu.xh_control_appstore.model.UserVo
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class UserViewModel : BaseViewModel() {
val userList = mutableStateListOf<UserVo>()
fun loadData() {
mLaunch {
Log.i("API2", Thread.currentThread().name)
val result = ApiManager.userApi.getUserList().body()
withContext(Dispatchers.Main) {
result?.let {
if (result.code == 0) {
userList.addAll(result.obj)
zIsShowMsg.value = false
} else {
zIsShowMsg.value = true
zShowMsgContent.value = result.msg
}
}
}
}
}
}
Проверять