
Partager:
Abdul est défenseur des développeurs chez Vonage. Il a travaillé dans le domaine des produits de consommation en tant qu'ingénieur iOS. Pendant son temps libre, il aime faire du vélo, écouter de la musique et conseiller ceux qui commencent leur parcours dans la technologie.
Comment envoyer des SMS avec Swift et Vapor en utilisant Async/Await
Temps de lecture : 4 minutes
Swift 5.5 introduit la fonctionnalité de langage async/await pour aider à améliorer la lisibilité du code concurrent Swift en supprimant le besoin de gestionnaires d'achèvement. Ce billet sera très similaire à Comment envoyer des SMS avec Swift, Vapor et Vonage sur notre blog. Ce billet utilisera l'API Messages API V1 plutôt que l'API SMS, mais ce sera un bon moyen d'illustrer les améliorations apportées par l'utilisation d'async/await.
Si vous connaissez l'article de blog original, vous pouvez passer directement à la section "Envoyer le SMS".
Conditions préalables
Vonage API Account
To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.
Xcode 13 et Swift 5.5 ou supérieur.
La boîte à outils Boîte à outils Vapor installée sur votre machine.
Créer un projet vapeur
Vous pouvez créer un projet Vapor en utilisant la commande new project vapor new AsyncTextMessage dans votre terminal. Il vous demandera d'abord si vous souhaitez utiliser Fluent (appuyez sur n pour passer), puis si vous souhaitez utiliser Leaf. Leaf est un langage de template que vous utiliserez pour générer des pages HTML dynamiques, donc appuyez sur y pour l'inclure. Une fois la commande terminée, changez de répertoire dans le dossier qu'elle a créé pour vous en utilisant cd AsyncTextMessage.
Vous devrez également créer un fichier .env pour stocker les informations d'identification de votre compte API Vonage. Dans votre terminal, utilisez la commande suivante pour créer le fichier remplaçant X et Y par votre clé API et votre secret, respectivement :
echo "APIKEY=X \nAPISECRET=Y" > .env
Vous pouvez maintenant ouvrir le projet dans Xcode à l'aide de la commande vapor xcode pour ouvrir le projet dans Xcode. Une fois Xcode ouvert, il commencera à télécharger les dépendances de Vapor à l'aide du Swift Package Manager (SPM). Pour voir les dépendances, vous pouvez ouvrir le fichier Package.swift fichier.
Par défaut, Xcode exécute votre application à partir d'un répertoire local aléatoire. Comme vous allez charger des ressources locales, vous devez définir un répertoire de travail personnalisé. Allez dans Produit > Schéma > Modifier le schéma... et définissez le répertoire de travail comme étant le dossier racine de votre projet.

Appuyez sur CMD+R pour compiler et exécuter. Une fois la compilation terminée, vous trouverez votre page web à l'adresse localhost:8080.
Créer une page web
Maintenant que votre projet est en place, vous allez créer une interface permettant de saisir un numéro de téléphone et un message pour le SMS. Ouvrez le fichier index.leaf sous Ressources/Vues et mettez-le à jour :
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Send a text message</title>
</head>
<body>
<h1>Send a text message using the Vonage Messages API</h1>
#if(messageId):
<p> Successful SMS ID: #(messageId)</p>
#endif
<form action="/send" method="post">
<p>
<label>Phone number E.g. 447000000000</label><br>
<input type="text" name="to">
</p>
<p>
<label>Text message</label><br>
<textarea name="text"> </textarea>
</p>
<button type="submit">Send text</button>
</form>
</body>
</html>
Le code ci-dessus ajoute un formulaire avec des entrées pour un numéro de téléphone et un message, et une fois que le formulaire est soumis, il envoie une POST à /send. Remarquez le bloc Leaf qui commence par #if(messageId):. Il vérifie la présence d'une valeur pour la variable messageId et, si c'est le cas, il ajoute le texte à la page. Si vous compilez et exécutez (CMD + R), vous verrez votre page mise à jour.
Créer les structures du modèle
L'un des avantages de l'utilisation de Vapor est que vous pouvez vous appuyer sur la sécurité des types du langage Swift. Vous pouvez modéliser les entrées et sorties de votre serveur en utilisant des éléments conformes au protocole Codable Vapor dispose d'un protocole Content pour cela.
Créer une structure appelée Input qui se conforme à Content au bas du fichier routes.swift du fichier :
struct Input: Content {
let to: String
let text: String
let from = "SwiftText"
let channel = "sms"
let messageType = "text"
private enum CodingKeys: String, CodingKey {
case to
case text
case from
case channel
case messageType = "message_type"
}
}L'API Messages de Vonage s'attend à ce que les champs soient en casse serpent, les structures ont donc l'énumération CodingKeys pour faire correspondre leurs noms de propriété à leur équivalent en casse serpent. Sous la structure Input, créez une autre structure pour la réponse attendue de l'API Messages :
struct Response: Content {
let messageId: String
private enum CodingKeys: String, CodingKey {
case messageId = "message_uuid"
}
} Envoyer le SMS
Pour envoyer le SMS, vous devez faire un appel à l'API Messages de Vonage. Pour ce faire, vous devez définir l'itinéraire /send utilisée par le formulaire web, analyser les données du formulaire, puis effectuer la demande. Commencez par définir le nouvel itinéraire dans la fonction routes fonction :
app.post("send") { req async throws -> View in
do {
let input = try req.content.decode(Input.self)
}
}
Notez que la méthode utilise req async throws -> View in. Cela signifie que la fonction est asynchrone et qu'elle peut provoquer des erreurs. D'où le bloc do à l'intérieur, qui décode les champs du formulaire web dans une Input struct. La fermeture renvoie un View. Cela diffère de ce qui se faisait auparavant, où vous deviez retourner un futur qui aurait finalement été résolu en un View.
Ensuite, vous utiliserez la fonction Client de Vapor, qui vous permet de faire des appels HTTP externes, pour appeler l'API Messages. Ajoutez l'appel à la route d'envoi :
app.post("send") { req async throws -> View in
do {
let input = try req.content.decode(Input.self)
let clientResponse = try await req.client.post("https://api.nexmo.com/v1/messages") { req in
try req.content.encode(input, as: .json)
let auth = BasicAuthorization(
username: Environment.get("APIKEY")!,
password: Environment.get("APISECRET")!
)
req.headers.basicAuthorization = auth
}
let messageResponse = try clientResponse.content.decode(Response.self)
return try await req.view.render(
"index",
["messageId": "\(messageResponse.messageId)"]
)
}
}
Le code ci-dessus attendra le résultat de l'appel à l'API Messages, qui utilise les informations d'identification de l'API pour l'autorisation, puis clientResponse sera mis à jour avec le résultat. Cela vous permet d'écrire du code comme s'il était synchrone. De plus, comme le code se trouve dans un bloc do s'il y a une erreur, elle sera simplement lancée et gérée automatiquement ou vous pouvez ajouter un bloc catch pour les gérer vous-même.
La ligne suivante décode la réponse de l'API Messages, qui est ensuite utilisée pour le rendu de la page. Encore une fois, cette ligne utilise try awaitde sorte que lorsque req.view.render se termine, il retournera soit une instance View ou lèvera une erreur.
Essayez-le
Construisez et exécutez (CMD + R) le projet, ouvrez localhost:8080 dans votre navigateur, puis remplissez un numéro de téléphone et un message.

En cliquant sur le bouton d'envoi, les données seront envoyées à la route que vous avez définie plus tôt, l'appel à l'API Messages de Vonage sera effectué et, en cas de succès, l'ID du message sera affiché.

Quelle est la prochaine étape ?
Vous pouvez trouver le projet terminé sur GitHub.
Vous pouvez faire plus avec l'API Messages, notamment envoyer des messages sur Whatsapp et Facebook Messenger. Découvrez-le sur notre plateforme pour les développeurs.
Partager:
Abdul est défenseur des développeurs chez Vonage. Il a travaillé dans le domaine des produits de consommation en tant qu'ingénieur iOS. Pendant son temps libre, il aime faire du vélo, écouter de la musique et conseiller ceux qui commencent leur parcours dans la technologie.
