Android использует Retrofit для сетевых запросов и в сочетании с Kotlin
Android использует Retrofit для сетевых запросов и в сочетании с Kotlin

Предисловие

Retrofit сейчас является популярной платформой сетевых запросов. Ее можно понимать как расширенную версию okhttp с инкапсуляцией Okhttp внизу.

Если быть точным,Retrofit — это пакет инфраструктуры сетевых запросов RESTful http.。потому чтосеть Запрос на работу по существу выполняетсяokhttpзавершить,Retrofit отвечает за инкапсуляцию интерфейса запроса.

https://square.github.io/retrofit/

Базовая конфигурация

Добавить сетевые разрешения

Язык кода:javascript
копировать
<uses-permission android:name="android.permission.INTERNET"/>

Добавить зависимости

Язык кода:javascript
копировать
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

Указывает, что ответ возвращается в виде потока байтов.,Если не использовать аннотацию,По умолчанию все данные будут загружены в память.,Аннотация особенно полезна при загрузке больших файлов.

Пример параметра

Параметры URL-адреса

Язык кода:javascript
копировать
@GET("user")
Call<ResponseBody> getData2(@Query("id") long idLon, @Query("name") String nameStr);

@GET("user")
Call<ResponseBody> getData3(@QueryMap Map<String, Object> map);

Разместить запрос-Форма формы

Язык кода:javascript
копировать
@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);

Опубликовать запрос – форма JSON

Язык кода:javascript
копировать
@POST("user/emails")
Call<ResponseBody> getPsotDataBody(@Body RequestBody body);

Заполнитель в URL

Язык кода:javascript
копировать
@GET("orgs/{id}")
Call<ResponseBody> getPathData(@Query("name") String nameStr, @Path("id") long idLon);

Загрузка файла

Язык кода:javascript
копировать
@Multipart
@POST("user/followers")
Call<ResponseBody> getPartData(@Part("name") RequestBody name, @Part MultipartBody.Part file);

вызов

Язык кода:javascript
копировать
//Тип объявления, здесь тип текста
 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);

много Загрузка файла

Язык кода:javascript
копировать
@Multipart
@POST("user/followers")
Call<ResponseBody> getPartMapData(@PartMap Map<String, MultipartBody.Part> map);

вызов

Язык кода:javascript
копировать
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

Добавить объект

Язык кода:javascript
копировать
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;
    }
}

пользователь

Язык кода:javascript
копировать
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;
    }
}

Запросить класс интерфейса

Язык кода:javascript
копировать
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;

public interface UserApi {
    //получить запрос
    @GET("userlist.json")
    Call<ResultListVo<UserVo>> getUserList();
}

Создать экземпляр модификации

Язык кода:javascript
копировать
//Создаем экземпляр модификации
Retrofit retrofit = new Retrofit.Builder()
        //Устанавливаем адрес BaseUrl сети запроса
        .baseUrl("https://www.psvmc.cn/")
        //Устанавливаем парсер данных
        .addConverterFactory(GsonConverterFactory.create())
        .build();

Экземпляр объекта интерфейса

Язык кода:javascript
копировать
//создаватьсетьпросить Экземпляр объекта интерфейса
UserApi userApi = mRetrofit.create(UserApi.class);
//Инкапсулируем запрос на отправку
Call<ResultListVo<UserVo>> resultCall = userApi.getUserList();

вызов

Вызов синхронизации

Язык кода:javascript
копировать
//Синхронный запрос
Response<ResultListVo<UserVo>> data= resultCall.execute();

асинхронный вызов

Язык кода:javascript
копировать
//Асинхронный запрос
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) {         
    }
});

Kotlin

Новая версия Retrofit уже может облегчить использование сопрограмм Kotlin.

Сервисный интерфейс

Добавьте ключевое слово приостановки,Тип возвратаResponse<T>

Язык кода:javascript
копировать
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>>
}

вызов

Простой вызов

Язык кода:javascript
копировать
GlobalScope.launch {
    var result = ApiManager.userApi.getUserList().body()
    Log.i("API", Gson().toJson(result))
}

ViewModelсерединавызов

BaseViewModel

Язык кода:javascript
копировать
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

Язык кода:javascript
копировать
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
                    }
                }
            }
        }
    }
}

Прокси-сервер HTTPS не может запросить

Проверять

https://www.psvmc.cn/article/2019-04-03-win-proxy.html

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose