J'ai trouvé l'application iOS de Reddit meilleure que la version Web, j'ai donc pensé à vérifier la rapidité avec laquelle elle charge les données. Voici le démontage de l'application iOS de Reddit.
Voici quelques points saillants :
- Il utilise une authentification basée sur des jetons.
- Il utilise les API GraphQL pour presque tout, de la configuration et des expériences à la publication d'informations.
- Il surveille les performances de son système API telles qu'elles sont vécues par ses utilisateurs à l'aide d'une API nommée w3-reporting.
- Dans la plupart des appels d'API GraphQL, seul le nom de l'opération est transmis sans variables. Je suppose qu'ils utilisent un middleware pour extraire la configuration des variables du front-end. Un service back-end renseigne les informations en fonction du nom de l'opération.
- Reddit utilise Web Socket pour la fonctionnalité de commentaires en direct.
Voici le démontage détaillé des appels d'API. J'ai utilisé l'application de bureau de Requestly pour intercepter l'application iOS de Reddit, les instructions de configuration sont fournies ici .
Technologie utilisée
L'application Reddit est créée avec
- L'application iOS de Reddit utilise les API GraphQL pour charger tout le contenu.
- L’authentification basée sur des jetons est utilisée pour valider les utilisateurs.
- Surveillance des performances en signalant les performances de l'API côté utilisateur.
- Les commentaires en direct sont pris en charge via WebSocket.
- Configuration dynamique pour contrôler à distance le comportement des applications sans déployer de nouvelles versions.
- Expériences dynamiques pour contrôler les expériences à distance, sans nécessiter de nouveau déploiement pour modifier le statut d'une expérience.
Meilleure expérience utilisateur grâce au préchargement
La principale question que je me posais était de savoir comment l'application fonctionnait si rapidement. La réponse a été trouvée en vérifiant la réponse de l'API FeedPostDetailsByIds . Cette API est appelée sur l'écran d'accueil avec les identifiants des publications affichées et est accompagnée d'informations détaillées qui s'affichent après avoir cliqué sur la publication. Ce préchargement des publications les plus populaires a permis d'afficher instantanément l'écran des détails de la publication sans aucun chargeur.
- Les messages de préchargement sont affichés dans le flux.
- Le temps de réponse des API est également très rapide.
Sécurité des API GraphQL
Les requêtes GraphQL se composent des données et de la structure de la réponse requise. Le nom de l'opération est généralement facultatif. La plupart des API Reddit n'ont que des noms d'opération dans les requêtes et les variables ne sont disponibles que lorsqu'il existe des variables/filtres à l'écran comme un flux avec des options de publication populaires et récentes.
Cela donne moins de contrôle aux développeurs front-end pour apporter des modifications de manière indépendante, mais plus de contrôle sur l'utilisation abusive des API pour récupérer des données inutiles après tout son API orientée utilisateur.
Expériences télécommandées
Il est difficile d'exécuter des expériences sur des applications iOS natives. Il faut des redéploiements pour activer ou désactiver les expériences, mais Reddit a configuré l'application de manière à ce que les expériences puissent être contrôlées à distance. Toutes les expériences sont chargées dans une API avec leurs valeurs et leurs statuts. L'application active automatiquement la variante de l'expérience qui lui a été attribuée.
Contrôle des fonctionnalités basées sur les drapeaux
Avec autant d'utilisateurs, d'expériences et de fonctionnalités, il est préférable de les contrôler à distance. Reddit fait un excellent travail en contrôlant ces fonctionnalités à distance.
À chaque lancement de l'application, celle-ci appelle une API de configuration pour charger plus de 400 variables de configuration. Sur la base de ces variables, elle affiche différentes fonctionnalités et variantes de fonctionnalités.
Le secret du karma
L'API avec le nom d'opération GetTopKarmaSubreddits
obtient la liste des meilleurs subreddits avec les points de karma gagnés dans chacun. Cette API révèle le nombre de commentaires et de karma de publication que nous avons gagnés grâce à notre activité dans chaque subreddit. Je n'ai jamais pu trouver ces informations dans l'interface utilisateur Web et mobile de Reddit.
Portée de l'amélioration
En lisant les API pour savoir quel type de données elles apportent, j'ai découvert que l'API SubredditFeedElements
charge le flux du sous-reddit sélectionné, mais qu'à chaque publication, elle contient un JSON imbriqué d'informations détaillées sur le sous-reddit. Ces informations sont redondantes et peuvent être supprimées pour réduire la charge réseau de l'API et améliorer encore ses performances.
Remarque : l'API SubredditFeedElements
est désormais remplacée par l'API SubredditFeedSdui
et le problème est résolu.
Utiliser l'IA pour obtenir des informations
J'ai essayé d'utiliser ChatGPT pour obtenir des informations sur les API. J'ai donc créé un fichier avec toutes les API avec leur boucle et leurs réponses. J'ai téléchargé ce fichier sur un CustomGPT afin de pouvoir placer n'importe quel type de requête. Il a donné des informations évidentes, comme le type d'utilisation qu'une API pourrait avoir et la structure de la réponse, mais il y avait beaucoup d'hallucinations, probablement à cause du grand nombre d'API ou parce que je ne suis pas un expert en matière d'invite. Quelques-unes des informations fournies par l'IA :
- API
GetAllExperimentVariants
— De nombreuses expériences ont des noms de « variantes » spécifiques, notamment des options telles queenabled
,variant_1
,control_model
etone_feed_ph_bridge_new_users
. Cette segmentation suggère que Reddit teste des fonctionnalités sur des segments d'utilisateurs particuliers pour déterminer leur impact. Par exemple, l'expérienced2x_avatar_in_comments_loggedin
comporte deux variantes,loggedin
etloggedout
, qui testent potentiellement la fonctionnalité en fonction de l'état d'authentification de l'utilisateur. - API
GetAllExperimentVariants
— Les expériences incluenthybrid_video_rollout_android_v2
,active_sales
etgql_google_maps_integration
, qui pointent vers une large gamme de tests de fonctionnalités couvrant la fonctionnalité vidéo, les placements d'annonces, les améliorations de l'interface utilisateur et les intégrations tierces - API
GetAccountDetails
— La réponse de l'API contient divers champs détaillant l'état du compte de l'utilisateur, tels queisSubredditCreationAllowed
,isNameEditable
,isPasswordSet
et l'état de modérateur de l'utilisateur. En outre, elle inclutsuspensionExpiresAt
etisSuspended
, qui indiquent si un compte est actuellement suspendu ou restreint
Liste des API
Voici la liste des API GraphQL que j'ai étudiées pour comprendre le fonctionnement de Reddit. Il y avait également d'autres API comme l'authentification, la création de rapports, etc. Je ne les ai pas incluses dans cette liste.
Écran | API GraphQL | Description |
---|---|---|
Maison | Obtenir toutes les configurations dynamiques | Charge plus de 400 paramètres de configuration en fonction des différentes fonctionnalités de l'application. La configuration est au format clé-valeur typique avec le type de valeur qui peut être un JSON, un float, une chaîne, etc. |
| Obtenir toutes les variantes d'expérience | La requête contient des informations sur l'application et l'appareil pour attribuer des expériences destinées à l'appareil et à la version de l'application. La réponse contient une liste de toutes les expériences avec l'ID, le nom de l'expérience, la version et le statut. |
| Obtenir un compte | Charge tous les détails de l'utilisateur connecté. |
| AccueilFeedSdui | Charge les premiers messages avec un minimum de détails à afficher sur la page d'accueil. |
| FeedPostDetailsByIds | Précharge les publications à l'aide d'identifiants avec tous les détails, au cas où un utilisateur clique sur la publication. |
| DiscoverBarRecommandations | Découvrez les données de la barre. |
| Abonnement UserPremium | Données relatives à l'abonnement premium de l'utilisateur |
| Obtenir l'éligibilité de l'utilisateur | Obtient l'éligibilité publicitaire de l'utilisateur et ses préférences. |
| Nombre de badges | Informations sur les badges gagnés par l'utilisateur. |
| | |
Page de sous-reddit | Canaux Subreddit | Charge tous les détails de base sur la communauté comme la description, les icônes, les compteurs, les types de publication autorisés et les couleurs. |
| SubredditTaxonomieSujets | Charge la catégorie de la communauté et un texte d'affichage comme si je charge la communauté r/software, il affichera #20 dans Logiciels et applications. |
| EstInvitePending | Comme son nom l'indique, vérifiez s'il y a une invitation en attente, mais vous ne savez pas exactement quelle invitation. |
| Canaux Subreddit | Charge les canaux de discussion du sous-reddit, j'ai vérifié de nombreux sous-reddits mais je n'en ai trouvé aucun. |
| Redditeurs bloqués | Apporte des données si l'utilisateur est bloqué. |
| Obtenir des modérateurs | Obtient la liste des mods. |
| RécupérerStructuredStyleAndWidgets | Cette API apporte des informations sur le style, les règles et les détails de la communauté. |
| FetchRelatedRecommandations de la communauté | Cette API rassemble des communautés associées. |
| SubredditMise en sourdine | Vérifie si le sous-reddit est désactivé. |
| Éléments de flux de subreddit | Charge le flux du sous-reddit. Il prend en compte les filtres et les options de mise en page sélectionnés pour le sous-reddit. Il récupère tous les détails sur les publications à afficher dans le flux. |
| PostInfoByIdComments | Cette demande précharge uniquement les commentaires du premier message. |
| | |
Page de publication | Obtenir le statut des emojis personnalisés | Cette API a été appelée avec l'ID du sous-reddit et charge le statut des émojis personnalisés sur le sous-reddit. La raison pour laquelle cette API est appelée n'est pas très claire, mais je l'ai vu à de nombreuses reprises. La réponse était |
| Obtenir le statut SubredditAchievementFlairs | Similaire au statut emoji, il prend l'identifiant du sous-reddit et obtient une réponse du type isEnabled: false . Le but de cette opération ne m'est pas clair. |
| PostInfoByIdComments | Cette API est utilisée pour charger les commentaires de la publication en utilisant l'ID de publication transmis dans la requête. |
| CommentairesPageAnnonces | Charge l'annonce juste au dessus des commentaires. |
| | |
Page de profil | RedditorParNom | Charge les détails du profil de l'utilisateur connecté. |
| Paramètres de PostSet | Nombre de messages à charger. |
| Sous-reddits GetTopKarma | Obtenez la liste des meilleurs subreddits avec des points de karma sur chaque communauté, cette API révèle combien de commentaires et de karma de publication nous avons gagné grâce à notre activité dans chaque sous-reddit. |
| Flux de profils d'utilisateurs | Le flux du profil utilisateur contenant des commentaires et des publications. |
| Trophées UserPublic | Liste des réalisations et trophées gagnés par le nom d'utilisateur passé dans la demande avec identifiant, nom et image à afficher. |
| Profil de basculement migré | Détails sur le profil de pourboire, je n'ai pas beaucoup utilisé cette fonctionnalité. Il affichait un solde de 0 sur mon profil 😄. |
Conclusion
J’aimerais souligner quelques points en conclusion de cette expérience de démolition.
- Les API de Reddit ne sont pas très rapides, elles utilisent plutôt le préchargement pour offrir une meilleure expérience utilisateur.
- Le travail des API n'est jamais terminé, même les ingénieurs de Reddit ont du travail à faire pour l'améliorer encore.
- Conserver les configurations d'applications et d'expériences à distance peut donner un bon contrôle sur l'expérience utilisateur.
- Les ingénieurs de Requestly ont fait un excellent travail en affichant le nom de l'opération avec chaque requête GraphQL, rendant ainsi la vie des développeurs beaucoup plus facile.