Forest Client es un marco de cliente API relajante flexible y extensible construido sobre URLSession y URLSessionTask . Ya incluye mapeadores de objetos de red de JSON a los tipos de datos más utilizados. Debido a su simple enfoque de codificación/decodificación de datos y arquitectura extensible, puede agregar fácilmente sus mapeadores de objetos de red personalizados. Forest proporciona todas las características necesarias para construir un cliente robusto para sus servicios de backend.
¿Podría preguntar por qué no obtener ningún otro marco de red probado? Claro, obtendrá uno mejor adecuado para sus necesidades y preferencia de estilo, pero siempre es bueno tener opciones. La siguiente es la lista de características que quería de la capa de red de nivel superior e implementadas en el cliente forestal:
Decodable pod 'Forest'Agregar protobufs de soporte de extensiones:
pod 'Forest/Protobuf'Para utilizar el servicio de accesibilidad:
pod 'Forest/Reachability'Y no olvides importar el marco:
import Forest Simplemente coloque los archivos de los directorios Core y Protobuf SOMETERE en su proyecto. Para utilizar las extensiones de ProtoBuf, debe integrar adicionalmente el marco SwiftProTobuf en su proyecto.
La clase central que maneja la tarea de red es ServiceTask . ServiceTask incluye métodos de fábrica que ayudan a configurar los parámetros y manejadores de solicitudes y respuesta. Si necesita más control sobre el proceso de hacer solicitud y manejo de la respuesta, puede usar delegación e implementar el protocolo ServiceTaskRetrofitting y modificar el comportamiento de la tarea a través del retrofitador. También puede subclase ServiceTask , está construido para eso.
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 ( )Enviar y recibir datos utilizando objetos que se ajustan al protocolo codible:
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 ( )Simplemente descargue algún archivo:
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 ( )Sube contenido codificado de datos de formulario multipart:
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
}
Enviar y recibir mensajes ProtoBuf (GRPC sobre 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]
Forest está disponible bajo la licencia MIT. Consulte el archivo de licencia para obtener más información.