Forest Client - это гибкая и расширяемая клиентская структура API Restful, построенная на вершине URLSession и URLSessionTask . Он уже включает в себя групп сетевых объектов от JSON до наиболее часто используемых типов данных. Из -за простого подхода/декодирования кодировки данных и расширяемой архитектуры вы можете легко добавить свои пользовательские картины сетевых объектов. Forest предоставляет все функции, необходимые для создания надежного клиента для ваших бэкэнд -услуг.
Вы могли бы спросить, почему не получить какую -либо другую проверенную сетевую структуру? Конечно, вы получите один наилучший подходящий для ваших потребностей и предпочтений в стиле, но всегда полезно иметь варианты. Ниже приведен список функций, которые я хотел от сетевого уровня более высокого уровня и реализован в лесном клиенте:
Decodable протоколу pod 'Forest'Добавить Protobufs, поддерживающие расширения:
pod 'Forest/Protobuf'Для использования службы достижимости:
pod 'Forest/Reachability'И не забудьте импортировать структуру:
import Forest Просто поместите файлы из каталогов Core и Protobuf в ваш проект. Чтобы использовать расширения Protobuf, вам нужно дополнительно интегрировать платформу SwiftProtobuf в ваш проект.
Основной класс, который обрабатывает сетевую задачу, является ServiceTask . ServiceTask включает заводские методы, помогающие настроить параметры запроса и ответа и обработчики. Если вам нужно больше контроля над процессом выполнения запроса и обработки ответа, вы можете использовать протокол делегирования и реализовать протокол ServiceTaskRetrofitting и изменить поведение задачи через ретробеттер. Кроме того, вы можете подклассно ServiceTask , что он построен для этого.
ServiceTask ( )
. url ( " https://host.com/path/to/endpoint " )
. method ( . GET )
. query ( [ " param " : value ] )
// Expecting valid JSON response
. json { ( object , response ) in
print ( " JSON response received: ( object ) " )
}
. error { ( error , response ) in
print ( " Error occurred: ( error ) " )
}
. perform ( )Отправить и получать данные, используя объекты, соответствующие кодируемому протоколу:
struct NameRequest : Encodable {
let name : String
}
struct NameResponse : Decodable {
let isValid : Bool
}
ServiceTask ( )
// Set base url and HTTP method
. endpoint ( . POST , " https://host.com " )
// Add path to resource
. path ( " /path/to/resource " )
// Serialize our Codable struct and set body
. body ( codable : NameRequest ( " some " ) )
// Expect response with the object of 'NameResponse' type
. codable { ( object : NameResponse , response ) in
print ( " Name valid: ( object . isValid ) " )
}
// Otherwise will fail with error
. error { ( error , response ) in
print ( " Error occured: ( error ) " )
}
. perform ( )Просто загрузите немного файла:
ServiceTask ( )
. headers ( [ " Authorization " : " Bearer ( token ) " ] )
. method ( . PUT )
. url ( " https://host.com/file/12345 " )
. body ( text : " 123456789 " )
. file { ( url , response ) in
print ( " Downloaded: ( url ) " )
// Remove temp file
try ? FileManager . default . removeItem ( at : url )
}
. error { ( error , response ) in
print ( " Error occured: ( error ) " )
}
// When download destination not provided, content will be downloaded and saved to temp file
. download ( )Загрузите кодированное содержание данных Multipart Form:
do {
// Create new form data builder
var formDataBuilder = FormDataBuilder ( )
// Filename and MIME type will be obtained automatically from URL. It can be provided explicitly too
formDataBuilder . append ( . file ( name : " image " , url : * url * ) )
// Generate form data in memory. It also can be written directly to disk or stream using encode(to:) method
let formData = try formDataBuilder . encode ( )
ServiceTask ( )
. endpoint ( . POST , " https://host.com/upload " )
. body ( data : formData , contentType : formDataBuilder . contentType )
. response ( content : { ( response ) in
switch response {
case . success :
print ( " Done! " )
case . failure ( let error ) :
print ( " Failed to upload: ( error ) " )
}
} )
. perform ( )
}
catch {
print ( " ( error ) )
return
}
Отправить и получать сообщения ProToBuf (GRPC над HTTP):
ServiceTask ( )
. endpoint ( . POST , " https://host.com " )
// Create and configure request message in place
. body { ( message : inout Google_Protobuf_StringValue ) in
message . value = " something "
}
// Expecting Google_Protobuf_Empty message response
. proto { ( message : Google_Protobuf_Empty , response ) in
print ( " Done! " )
}
. error { ( error , response ) in
print ( " Error occured: ( error ) " )
}
. perform ( )
// Or another version of the code above with explicitly provided types
ServiceTask ( )
. endpoint ( . POST , " https://host.com " )
// Create and configure request message in place
. body ( proto : Google_Protobuf_SourceContext . self ) { ( message ) in
message . fileName = " file.name "
}
// Expecting Google_Protobuf_Empty message response
. response ( proto : Google_Protobuf_Empty . self ) { ( response ) in
switch response {
case . success ( let message ) :
print ( " Done! " )
case . failure ( let error ) :
print ( " Error occured: ( error ) " )
}
}
. perform ( ) NATAN ZALKIN [email protected]
Лес доступен по лицензии MIT. Смотрите файл лицензии для получения дополнительной информации.