Forest Client est un cadre API RESTful flexible et extensible construit sur URLSession et URLSessionTask . Il comprend déjà des mappeurs d'objets réseau de JSON aux types de données les plus couramment utilisés. En raison de sa simple approche de codage / décodage de données et d'architecture extensible, vous pouvez facilement ajouter vos mappeurs d'objets réseau personnalisés. Forest fournit toutes les fonctionnalités nécessaires pour construire un client robuste pour vos services backend.
Vous pourriez demander pourquoi ne pas obtenir un autre cadre de réseautage éprouvé? Bien sûr, vous obtiendrez un meilleur adapté à vos besoins et à vos préférences de style, mais il est toujours bon d'avoir des options. Voici la liste des fonctionnalités que je voulais de la couche de mise en réseau de niveau supérieur et mise en œuvre dans Forest Client:
Decodable pod 'Forest'Ajoutez des extensions de support Protobufs:
pod 'Forest/Protobuf'Pour utiliser le service d'accessibilité:
pod 'Forest/Reachability'Et n'oubliez pas d'importer le cadre:
import Forest Il suffit de mettre les fichiers des répertoires Core et Protobuf quelque chose dans votre projet. Pour utiliser les extensions Protobuf, vous devez en outre intégrer le framework SwiftProtobuf dans votre projet.
La classe de base qui gère la tâche du réseau est ServiceTask . ServiceTask comprend des méthodes d'usine aidant à configurer les paramètres de demande et de réponse et les gestionnaires. Si vous avez besoin de plus de contrôle sur le processus de demande de demande et de gestion de la réponse, vous pouvez utiliser la délégation et implémenter le protocole ServiceTaskRetrofitting et modifier le comportement des tâches via Retrofitter. Vous pouvez également sous-classer ServiceTask , il est construit pour cela.
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 ( )Envoyer et recevoir des données à l'aide d'objets conformes au protocole codable:
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 ( )Téléchargez simplement un fichier:
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 ( )Téléchargez le contenu codé des données de formulaire multiparte:
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
}
Envoyer et recevoir des messages Protobuf (Grpc sur 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]
La forêt est disponible sous la licence du MIT. Voir le fichier de licence pour plus d'informations.