J'utilise Apollo Client sur Android pour utiliser des services GraphQL avec une autorisation.
Lorsque cette authentifie a expiré, une erreur affiche: techniquement parle, cela devrait exécuter < Code> onsuccess code> mais est-ce lié à un http 400 code> au lieu de l'erreur du serveur actuel: p>
HasErrors code> au lieu du
OnFailure code>. p>
CustomType Code>? P> P>
3 Réponses :
Si vous utilisez RETOROFIT, vérifiez le code ci-dessous
@Parcel public class ApiError { @SerializedName("statusCode") public int statusCode; @SerializedName("statusMessage") public String statusMessage; @SerializedName("error") public String error; @SerializedName("error_description") public String description; public ApiError() { } }
Merci pour le commentaire. Comme indiqué sur la question, j'utilise graphql . Donc, fondamentalement, je ne sais pas comment puis-je faire ça ...
Ne peut pas voir comment cela répond à la question.
@azizbekian Apollo et Releformement utilisent les deux classes de requête et de réponse OKHTTP. Sur l'affaire d'erreur API Parse Corps d'erreur avec ma réponse et chèque ci-dessus.
En réalité, Apollo est assez similaire à la rénovation où les deux utilisent retourne true si le code est dans [200..300], ce qui signifie que la demande était
reçu avec succès, compris et accepté. p>
blockQuote>
dans Apollo, cela signifie que le code d'état n'est pas compris entre 200-300, il sera Le seul moyen de faire entrer le code Entrez émetchcsess code> fonction qui détermine le rappel du succès: p>
OnFailure CODE> Rappel (dans votre cas, vous l'avez eu à cause de
http 400 code>). p>
Onsuccess code> Callback consiste à attraper l'exception sous le côté de la vérification et à envoyer
http 200 code> avec le message d'erreur, au lieu de
Http 400 code>. Mon équipe a fait cela et ça marche. P>
D'accord. Merci. Mais y a-t-il une autre façon de faire cela? Et si je n'ai pas accès au backend? Peut-être avec un intercepteur ou quelque chose de similaire? Merci en avance.
@ AMG91, j'ai bien peur que nous ne puissions pas utiliser l'intercepteur pour cela. L'intercepteur est plus approprié pour un cas où nous devons mettre par exemple. Clé API dans toutes les demandes. La seule solution de contournement est d'attraper apolloexception code>, puis de mapper manuellement le
e.message code> à un objet d'erreur ou
réponse
@ AMG91 aussi je crois que je t'ai fourni la meilleure réponse. S'il vous plaît laissez-moi savoir s'il y a autre chose que je peux aider :)
Le système fait ce qu'il est censé. Un HTTP 400 est em> une erreur. Par conséquent, le transmettre à travers les rappels d'erreur est entièrement dans la raison. P> La meilleure solution serait de traiter avec l'erreur em>. P> tente peut-être automatiquement d'obtenir un nouveau jeton d'accès avec votre jeton de rafraîchissement. Si cela échoue, demandez à l'utilisateur de vous connecter à nouveau avec un signe unique sur. P> Si vous voulez absolument que tous les messages d'erreur HTTP 400 doivent être dirigés vers votre chemin qui réussit, vous pouvez Modifiez toujours vos demandes de le faire. P> Je n'ai pas testé ce qui suit, mais cela devrait faire ce que vous voulez faire. p> L'intercepteur exécute l'appel. Il vérifie le code de résultat de l'appel. Si cet appel est 400, nous générons une nouvelle réponse basée sur la réponse précédente. Cette nouvelle réponse est modifiée pour envoyer un code de résultat réussi. P> Solution potentielle h1>
val okHttpClient = OkHttpClient.Builder()
.addInterceptor {
val response = it.call().execute()
val updatedResponse = if (response.code() == 400) {
response.newBuilder()
.code(200)
.build()
} else {
response
}
updatedResponse
}
...
.build()
val apollo = ApolloClient.builder()
.okHttpClient(okHttpClient)
...
.build()
Je reçois java.lang.illegalstateException: déjà exécuté code>. Est parce que j'ai un autre intercepteur ayant le porteur d'ormité ».
Vous pouvez toujours mettre le chèque à l'intérieur de cet intercepteur.