Forest Client ist ein flexibler und erweiterbarer Rastful -API -Client -Rahmen, der auf URLSession und URLSessionTask aufgebaut ist. Es enthält bereits Netzwerke -Mapper von JSON zu den am häufigsten verwendeten Datentypen. Aufgrund seines einfachen Datencodierungs-/Dekodierungsansatzes und seiner erweiterbaren Architektur können Sie Ihre benutzerdefinierten Mapper für Netzwerkobjekte problemlos hinzufügen. Forest bietet alle Funktionen zur Verfügung, um einen robusten Kunden für Ihre Backend -Dienste aufzubauen.
Sie könnten fragen, warum nicht ein anderes bewährtes Networking -Framework erhalten? Sicher, Sie werden einen für Ihre Bedürfnisse und Stilpräferenzen am besten geeignet, aber es ist immer gut, Optionen zu haben. Im Folgenden finden Sie die Liste der Funktionen, die ich gewünscht und im Forest Client implementiert und implementiert wurde:
Decodable Protokoll entsprechen pod 'Forest'Fügen Sie Protobufs hinzu, die Erweiterungen unterstützen:
pod 'Forest/Protobuf'Um den Erreichbarkeitsservice zu nutzen:
pod 'Forest/Reachability'Und vergessen Sie nicht, den Rahmen zu importieren:
import Forest Setzen Sie einfach die Dateien aus Core und Protobuf -Verzeichnissen in Ihrem Projekt. Um Protobuf -Erweiterungen zu verwenden, müssen Sie zusätzlich SwiftProtobuf -Framework in Ihr Projekt integrieren.
Die Kernklasse, die die Netzwerkaufgabe übernimmt, ist ServiceTask . ServiceTask enthält Fabrikmethoden, die zur Konfiguration von Anforderungs- und Antwortparameten und Handlern helfen. Wenn Sie mehr Kontrolle über den Prozess der Anforderung und zur Bearbeitung der Antwort benötigen, können Sie Delegation verwenden und ServiceTaskRetrofitting -Protokoll implementieren und das Aufgabenverhalten über Retrofitter ändern. Außerdem können Sie ServiceTask unterklassen, es ist dafür gebaut.
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 ( )Senden und empfangen Sie Daten mithilfe von Objekten, die dem codablen Protokoll entsprechen:
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 ( )Laden Sie einfach eine Datei herunter:
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 ( )Upload Multipart Form Data Codierte Inhalte:
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
}
Senden und Empfangen Sie Protobuf -Nachrichten (GRPC über 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]
Der Wald ist im Rahmen der MIT -Lizenz erhältlich. Weitere Informationen finden Sie in der Lizenzdatei.