Rénovation d'erreur de manipulation
J'ai enveloppé mon Rénovation de code dans une classe comme ci-dessous. Si il n'est pas clair à partir du code que je vais l'afficher c'est de l'interaction avec un service restful avec OAuth.
Ce serait une bonne façon de le faire d'erreur de manipulation? Le RESTE du serveur renvoie un message d'erreur au format json. Je voudrais agir sur ce message en jetant quelques exceptions de ma classe. Je suis en train de faire quelque chose comme ci-dessous. Mais est-ce une bonne conception? Est un mélange de rappels et d'exception jeter une bonne idée? Est-il un meilleur moyen?
Avec l'approche ci-dessous que j'ai pu obtenir i18l des messages à partir de l'intérieur de mon custom exceptions et de pain grillé à l'utilisateur.
public class RestClient implements IRestClient {
private IRestAPI api;
/**
*
* @param accessToken
*/
public RestClient(final String accessToken)
{
RequestInterceptor requestInterceptor = new RequestInterceptor()
{
@Override
public void intercept(RequestFacade request) {
request.addHeader("Authorization", "Bearer " + accessToken);
}
};
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(Config.ENDPOINT)
.setRequestInterceptor(requestInterceptor)
.build();
api = restAdapter.create(IRestAPI.class);
}
@Override
public void requestSomething(final Callback callback) {
api.getSomething(new Callback<Something>() {
@Override
public void success(Something something, Response response) {
callback.success(something, response);
}
@Override
public void failure(RetrofitError error) {
if(error.getMessage().getId().euqals(ACCESS_TOKEN_EXPIRED))
{
throw new AccessTokenExpired();
}
else if(error.getMessage().getId().euqals(USER_NOT_FOUND))
{
throw new UsernamePasswordNotFound();
}
else //something else happened...
{
throw error;
}
}
});
}
@Override
public void deleteSomething(final Callback callback) {
api.deleteSomething(new Callback<Something>() {
@Override
public void success(Something something, Response response) {
callback.success(something, response);
}
@Override
public void failure(RetrofitError error) {
if(error.getMessage().getId().euqals(SOMETHING_NOT_FOUND))
{
...
...
Different exceptions
}
...
}
});
}
}
Naturellement je voudrais créer mon propre retour d'appel de l'interface avec seulement un succès de la méthode.
OriginalL'auteur user672009 | 2014-11-01
Vous devez vous connecter pour publier un commentaire.
Lorsque vous générez le
RestAdapter
, vous pouvez fournir une gestionnaire d'erreur que des cartes à votre custom exceptions, il ignore l'appel àfailure
dans leCallback<T>
sur quoi que ce soit 4xx/5xx. Comme vraiment un exemple artificiel:modifier: ce faisant, toutefois, vous êtes potentiellement de sacrifier une grande raison pourquoi vous voulez utiliser le
Callback
interface pour commencer avec. Si c'est une utilisation courante, vous aurez besoin, il peut être plus judicieux d'utiliser la synchronisation des appels et retour de votre type d'objet. Je n'ai pas connaissance de votre utilisation à dire que c'est nécessaire, mais il semble comme si elle peut être plus approprié.Je ne pense vraiment pas que vous n'avez, pas à ce niveau au moins. Tout service HTTP que vous consommez doit utiliser les codes d'erreur standard (ou avoir une certaine norme pour vous dire pourquoi de l'échec de la demande). Ainsi, dans le
switch
exemple dans ma réponse et à l'aide de votre commentaire comme un modèle, vous serait de la carte409
à votreConflictException
,404
à votreNotFoundException
que le code d'état:l'exception de la cartographie. Lorsque vous appelez quelque chose qui donne une 4xx/5xx - indépendamment de ce qu'il est, vous aurez une norme exception de retour.Accordé, le côté négatif de cette est que vous êtes à sacrifier un peu de la belle nature d'un appel asynchrone en jetant en arrière dans un autre code, si vous attendez que cela soit une chose commune - peut-être à l'aide de la
Callback
interface est pas la bonne approche pour votre utilisation.Eh bien, la chose est que je pourrais obtenir un 404, n'étant pas en mesure de trouver un utilisateur et un article. Mais je veux les différents messages d'erreur. Aussi ce n'est pas seulement sur les codes d'erreur http... en Essayant de supprimer un utilisateur ou un article entraînerait également des codes différents pour les différents cas
Cela dépend vraiment de ce que vous faites. Si vous retournez un
Observable<T>
, alors que la logique est fait dans leonError
méthode de votreSubscriber
, si vous faites des rappels je ne suis pas sûr (je n'ai pas vraiment utilisé ces, j'utilise Rx au lieu de cela), si vous faites de la normeResponse
ou les Classes de Béton, alors vous feriez envelopper le HTTP appel (le cas échéant). par exemple,try { myImplSyncronous.getResource(); } catch (RetrofitError e) { /*handle*/}
OriginalL'auteur nerdwaller