[JAVA] Comment interagir avec un serveur qui ne plante pas l'application

introduction

Lors de la création d'une application native sur Android ou iOS, je pense que la plupart du temps, elle communique avec une sorte de serveur via API. Cependant, si vous ne gérez pas correctement les données de l'API, Il plante ou est considéré comme une application instable qui fonctionne étrangement. Cette fois, nous allons résumer les plantages / dysfonctionnements que nous avons rencontrés jusqu'à présent et introduire des mesures pour les empêcher de planter.

Leçons tirées des erreurs rencontrées

Assurez-vous d'écrire le traitement en cas d'erreur de serveur / d'erreur d'analyse

crash

Commentaire

Le serveur ne renvoie pas toujours 200 (système normal). Si vous envoyez une demande frauduleuse, elle retournera 404 ou 422, Si le serveur est sur-accédé et en panne, il renverra une erreur. Il ne renvoie rien et peut expirer.

À ce moment-là, si la considération de «que faire si une valeur d'erreur est renvoyée» est omise, elle peut tomber en raison d'une erreur d'analyse, ou diverses valeurs peuvent commencer à se déplacer dans l'état de valeur nulle ou initiale, conduisant à un fonctionnement anormal.

Contre-mesures

Veillez à ajouter la gestion des erreurs lorsqu'une erreur de série 400 ou 500 est renvoyée. De plus, si l'analyse échoue, elle sera traitée comme une erreur et l'utilisateur sera averti qu'il y a une erreur de communication.

Je ne pense pas que "la valeur de XX soit toujours sur le serveur"

crash

--Crash car la valeur de 〇〇 n'est pas dans les anciennes informations utilisateur ――La valeur de 〇〇 était toujours présente au moment de l'implémentation, mais il fut un temps où ce n'était pas une réparation côté serveur et ça plantait.

Commentaire

Lors du choix des spécifications avec le développeur côté serveur Il se peut que l'on vous dise: "Cette valeur n'existe pas lorsqu'elle est nulle, vous n'avez donc pas besoin de vérifier la valeur null." Ne croyez pas ces mots. La personne n'a pas toujours une compréhension complète des spécifications des données, ** Ce n'est peut-être pas la personne qui réparera la pièce plus tard **

Contre-mesures

Supposons que toutes les réponses peuvent être nulles

Puisque nous ne savons pas quand null sera renvoyé, toutes les classes de données qui reçoivent la réponse doivent être Nullable et String.

UserApiData.kt


data class UserApiData(
  val id : String?,
  val name : String?,
  val age : String?,
  val birthDay : String?
)

(Écrit en Kotlin)

Cependant, si vous le faites, vous devrez effectuer une vérification Null et une conversion de type à chaque fois que vous l'utiliserez dans l'application, et le code deviendra très compliqué. pour cette raison, ① Classe de données qui reçoit la réponse ② Classe de données utilisée dans l'application Créez-en deux et créez une méthode de conversion qui crée ① en ②.

User.kt


data class User(
  val id : String,
  val name : String,
  val age : Int,
  val birthDay : Date
)

UserConverter.kt


class UserConverter(){
    fun convert(data: UserApiData): User {
        if (data.id == null) throw IllegalArgumentException("user_id is null")
        return User(
                data.id,
                data.name ?: "",
                data.age?.toIntOrNull() ?: 0,
                parseData(data.birthDay)
        )
    }
}

Dans cette méthode de conversion, la vérification Null est effectuée et la valeur est entrée sous la forme NonNull. Si vous êtes coincé dans le contrôle nul

  1. Entrez la valeur par défaut de la valeur d'affichage
  2. Étant donné que l'ID affecte le traitement ultérieur, générez une exception et affichez une boîte de dialogue d'erreur.

Selon le cas, nous utiliserons la correspondance telle que. Ensuite, vous pouvez ** effectuer une vérification Null en un seul endroit tout en recevant correctement la réponse du serveur **.

Int = 0, boolean = false n'ont aucune signification

Mauvais fonctionnement

--La boîte de dialogue qui s'affiche uniquement lorsque false est toujours affichée. --Processus qui ne sont toujours exécutés que lorsque l'état de l'utilisateur est 0

Commentaire

Cela conduit à un bug lors de la définition des exigences. En Java, int et boolean sont initialement définis sur 0 et false, respectivement, et ne sont pas nuls. Il est implémenté en supposant qu'une valeur différente de 0 provient de l'api, et si la valeur ne vient pas, le processus sera exécuté avec 0 tel quel.

Contre-mesures

Vous pouvez le définir sur String de la même manière que ↑, ou vous pouvez le recevoir avec la classe wrapper Int, Boolean au lieu du type primitif int, boolean.

Si vous le faites, la valeur initiale sera nulle, donc si la valeur initiale ne change pas involontairement, un plantage ou une erreur se produira au lieu d'une opération illégale.

Je veux également éviter les plantages / erreurs, mais c'est encore mieux car il est inclus dans Crashlytics et est plus facile à détecter lors des tests.

Résumé

En fait, certaines mesures ne peuvent pas être prises en ajustant le temps de montage et les spécifications, mais je pense que ce serait bien si nous pouvions prendre des mesures autant que possible pour créer une application stable.

Recommended Posts

Comment interagir avec un serveur qui ne plante pas l'application
Comment résoudre le problème qu'Aptana Studio ne démarre pas
Comment vérifier avant d'envoyer un message au serveur avec Spring Integration
[Erreur] Comment résoudre le phénomène selon lequel l'écran ne passe pas après l'édition
Comment exécuter l'application SpringBoot en tant que service
Organisé comment interagir avec le JDK par étapes
Comment faire une capture d'écran avec l'émulateur Android Studio
Comment obtenir le journal lorsque install4j ne démarre pas
Comment déployer une application qui référence un pot local à heroku
Comment identifier le chemin sur lequel il est facile de se tromper
Comment gérer le type auquel j'ai pensé en écrivant un programme Java pendant 2 ans
Une application Java autonome qui envoie des journaux à CloudWatch Logs avec slf4j / logback
[Mémo personnel] Comment interagir avec le générateur de nombres aléatoires en Java
Exécutable serveur avec Spring gradle Comment créer JAR et WAR
[Rails] Comment appliquer le CSS utilisé dans l'application principale avec Administrer
Comment créer une application avec un mécanisme de plug-in [C # et Java]
Comment faire fonctionner @Transactional qui ne fonctionne pas si vous ne l'utilisez pas correctement
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
Comment déployer un système réalisé avec Java (démarrage Wicket-Spring) sur le serveur du campus
Comment créer une classe qui hérite des informations de classe
Connexion SSH au serveur d'applications avec heroku
Une histoire qui a souffert d'un espace qui ne disparaît pas même s'il est taillé avec Java La cause est BOM
Que faire quand est invalide car il ne commence pas par un "-"
Comment tester une classe qui gère application.properties avec SpringBoot (requête: signalée)
Comment créer un serveur Jenkins avec un conteneur Docker sur CentOS 7 de VirtualBox et accéder au serveur Jenkins à partir d'un PC local
Comment déployer des conteneurs distants VSCode dans un projet docker-compose qui comprend à la fois l'API et l'application frontale
[Swift] Comment décrire simplement le rejet qui n’a pas été enseigné dans le livre d’introduction
MockMVC renvoie 200 même si je fais une demande vers un chemin qui n'existe pas
Comment enregistrer des fichiers avec l'extension spécifiée sous le répertoire spécifié en Java dans la liste
[Docker] Comment voir le contenu des volumes. Démarrez un conteneur avec les privilèges root.
Que faire si l'annotation JSON Hint ne fonctionne pas avec Lombok et JSONIC
Comment supprimer des éléments enfants associés à un élément parent en même temps
Comment gérer les erreurs dans Rails? Impossible de trouver un runtime JavaScript.
Comment changer l'action avec plusieurs boutons d'envoi
Comment pousser une application développée avec Rails vers Github
Comment supprimer un objet new_record construit avec Rails
Comment générer manuellement un JWT avec Knock in Rails
Je souhaite utiliser le mode sombre avec l'application SWT
[Comment insérer une vidéo dans un hameau avec Rails]
Connexion HTTPS avec Java au serveur de certificats auto-signé
Accro au Webpacker fourni en standard avec Rails 6
Comment faire un MOD pour Slay the Spire
[Java] Comment rompre une ligne avec StringBuilder
[Java] Traitement de la situation où le programme qui écrit dans le flux de sortie du processus ne se termine pas même si waitFor
L'histoire qui a conduit à résoudre l'erreur car postgres n'a pas commencé avec docker-compose up
[Résolution d'erreur] Comment résoudre l'erreur "Impossible de trouver un runtime JavaScript." Apparaît après la mise à niveau de Catalina!
Que faire si vous avez installé Ruby avec rbenv mais que la version ne change pas
Comment charger une bibliothèque à partir d'un fichier JAR avec VSCode << Comment ne pas utiliser Maven / Gradle >>
Mémo qui passe à l'écran de connexion si vous n'êtes pas connecté avec l'appareil
Comment réduire même un peu la charge du programme lors de la combinaison de caractères avec JAVA
Comment demander un fichier CSV au format JSON avec jMeter