0
votes

Récupérer l'objet d'erreur au lieu de http 400 sur Android

J'utilise Apollo Client sur Android pour utiliser des services GraphQL avec une autorisation.

Lorsque cette authentifie a expiré, une erreur affiche: http 400 au lieu de l'erreur du serveur actuel: xxx

techniquement parle, cela devrait exécuter < Code> onsuccess mais HasErrors au lieu du OnFailure . xxx

est-ce lié à un CustomType ?


0 commentaires

3 Réponses :


-1
votes

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() {
    }
}


3 commentaires

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.



0
votes

En réalité, Apollo est assez similaire à la rénovation où les deux utilisent okhttp pour gérer la réponse. La manière dont Apollo Manipulez les réponses HTTP suit les règles et le comportement OKHTTP. Selon OKHTTP DOCS , le émetchcsess fonction qui détermine le rappel du succès:

retourne true si le code est dans [200..300], ce qui signifie que la demande était reçu avec succès, compris et accepté.

dans Apollo, cela signifie que le code d'état n'est pas compris entre 200-300, il sera TOUJOURS ENTER OnFailure Rappel (dans votre cas, vous l'avez eu à cause de http 400 ).

Le seul moyen de faire entrer le code Entrez Onsuccess Callback consiste à attraper l'exception sous le côté de la vérification et à envoyer http 200 avec le message d'erreur, au lieu de Http 400 . Mon équipe a fait cela et ça marche.


3 commentaires

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 , puis de mapper manuellement le e.message à 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 :)



0
votes

Préface

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>

Solution potentielle h1>

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>

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()


2 commentaires

Je reçois java.lang.illegalstateException: déjà exécuté . 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.