IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Robospice, 418 I'm a teapot


Sujet :

Android

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Points : 50
    Points
    50
    Par défaut Robospice, 418 I'm a teapot
    Bonjour,

    je doit réaliser une application communiquant avec un service web, classique. Et j'ai décidé d'utiliser Robospice pour la communication.

    Mon souci est qu'a chaque exécutions de ma requête (extends SpringAndroidSpiceRequest) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    @Override
    public User loadDataFromNetwork() throws Exception { 		
    	Map<String, String> parameters = new HashMap<String, String>();
    	parameters.put("email", email);
    	parameters.put("password", password);
    	parameters.put("firstname", firstName);
    	parameters.put("birthday", birthday);
    	parameters.put("sex", sex);
     
    	return getRestTemplate().postForObject("https://*******", null, User.class, parameters);
    }
    J'ai une exception HttpClientErrorException : 418 I'm teapot. Apparemment c'est une blague mais je vous avoue que je ne l'a comprend pas et que ça commence a me fatiguer .

    Je ne sais pas si ça joue mais je doit outre-passer la verification du certificat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    public static void unTrustSLL(){
    	try {
    		HttpsURLConnection.setDefaultSSLSocketFactory(getSSLSocketFactory());
    	} catch (KeyManagementException e) {
    		Log.e(Tool.class.getSimpleName(), e.getLocalizedMessage());
    	} catch (NoSuchAlgorithmException e) {
    		Log.e(Tool.class.getSimpleName(), e.getLocalizedMessage());
    	}
    }
     
    private static SSLSocketFactory getSSLSocketFactory() throws NoSuchAlgorithmException, KeyManagementException{
        final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
     
    			@Override
    			public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType)
    					throws CertificateException {}
     
    			@Override
    			public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType)
    					throws CertificateException {}
     
    			@Override
    			public java.security.cert.X509Certificate[] getAcceptedIssuers() {
    				return null;
    			}    	    
    		}
        };
     
        final SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init( null, trustAllCerts, new java.security.SecureRandom());
     
        return sslContext.getSocketFactory();
    }
    (Je sais c'est sale et ça rend vulnérable à une attaque HDM...)


    En tout cas, je remercie tous ceux qui prendrons la peine de lire mon post

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Points : 50
    Points
    50
    Par défaut
    Finalement faux problème.

    J'ai contacté le webmaster et en fait, lorsque le service web rencontre un problème (par exemple "email inconnu"), il envoie systématiquement l’erreur HTTP 418 (qui n'en n'ai pas vraiment une finalement...) ainsi que la nature de l'erreur dans du JSON (un code).

    Le souci est que lorsque l'application reçoit une erreur HTTP, il arrête tout traitement et lève une exception (normal..).

    Et voici comment je l'ai résolu/contourné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class MyDefaultReponseErrorHandler extends DefaultResponseErrorHandler {    
     
        @Override
        protected boolean hasError(HttpStatus statusCode){    
            if(statusCode.value()==418) return false;
     
            return super.hasError(statusCode);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class MyRequest extends SpringAndroidSpiceRequest<Result> {
     
        public ForgotRequest() {
            super(Result.class);
        }
     
        @Override
        public ForgotResult loadDataFromNetwork() throws Exception {
            /* something... */
            getRestTemplate.setErrorHandler(new MyDefaultReponseErrorHandler());
                    /* something... */
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @JsonIgnoreProperties(ignoreUnknown=true)
    @JsonAutoDetect(fieldVisibility=Visibility.NONE)
    public abstract class Result {
        private int error=Error.SUCCESS;
     
        public int getError() {
            return error;
        }
     
        @JsonProperty("error")
        public void setError(String error) {
            this.error=Integer.parseInt(error);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    private class Listener implements RequestListener<Result>{
     
            @Override
            public void onRequestFailure(SpiceException arg0) {
     
            }
     
            @Override
            public void onRequestSuccess(Result result) {
     
                switch (result.getError()) {
                case Error.SUCCESS:
     
                    break;
                default:
     
                    break;
                }        
            }
        }
    Qu'en pensez-vous ?

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo