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

Entr�e/Sortie Java Discussion :

le format de HttpRequest n'est pas constant suivant l�environnement d�ex�cution


Sujet :

Entr�e/Sortie Java

  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    24
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Par d�faut le format de HttpRequest n'est pas constant suivant l�environnement d�ex�cution
    Bonjour,
    J'ai un call � l'URL https://MyUrl1.domain.com/api/property qui fait un redirect vers https://AnUrl2.domain.com/login
    Je traite ce call � l'API avec le code Java suivant:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class MyAPICall { 
    	public static void main(String[] args) 
     
    	String url = "https://MyUrl1.domain.com/api/property";
    	HttpRequestBase req = new HttpGet(url);
     
    	CloseableHttpClient httpClient = HttpClientBuilder.create().addInterceptorFirst(new MyInterceptor()).setRedirectStrategy(new MyRedirectStrategy()).build();
    	HTTPResponseHandler myHttpRespHdl = new HTTPResponseHandler();
    	String content = httpClient.execute(req, myHttpRespHdl, new HttpClientContext());
     
    	System.out.println(content);
    }
    avec
    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
    public class MyInterceptor implements HttpRequestInterceptor {
     
        @Override
        public void process(HttpRequest req, HttpContext ctx) throws HttpException, IOException {
           	HttpClientContext clientCtx = HttpClientContext.adapt(ctx);
            HttpHost targetHost = clientCtx.getTargetHost();
            String host = targetHost.getHostName();
     
            if (host.matches("(.*)domain.com")) {
    			if (req.getRequestLine().getUri().startsWith("/login")) { 
                    if (req.getRequestLine().getMethod().equalsIgnoreCase("get")) {                   
                        Header accept = req.getFirstHeader("Accept");
                        if (accept != null) {
                            if (!accept.getValue().equals("application/json"))                             
                                req.removeHeader(accept);
                                req.addHeader("Accept", "application/json");
                            }
                        } else {
                            req.addHeader("Accept", "application/json");
                        }
                    } 
                }
            }
        }
    }
    et
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    public class MyRedirectStrategy implements RedirectStrategy {
     
        @Override
        public boolean isRedirected(HttpRequest req, HttpResponse res, HttpContext ctx) throws ProtocolException {
            HttpClientContext clientCtx = HttpClientContext.adapt(ctx);
            HttpHost targetHost = clientCtx.getTargetHost();
            String host = targetHost.getHostName();
     
            int returnCode = res.getStatusLine().getStatusCode();
            if (returnCode == 302) { 
            	if (req.getRequestLine().getMethod().equalsIgnoreCase("get")) {
                    return true;
                }
            	else{
            		if (host.matches("(.*)domain.com")) {
    					if (req.getRequestLine().getUri().startsWith("/login")) {                    
                        	if (req.getRequestLine().getMethod().equalsIgnoreCase("post")) {
                            	return true;
                        	} 
                    	}
                    }
            		return false;
            	}                         
            } else {
                if (returnCode == 200) {
                	if (host.matches("(.*)domain.com")) {
                		if (req.getRequestLine().getUri().startsWith("/login")) {                    
                        	if (req.getRequestLine().getMethod().equalsIgnoreCase("get")) {
                            	return true;
                        	} 
                        }
                    }
                }
                return false;
            }
        }
     
        @Override
        public HttpUriRequest getRedirect(HttpRequest req, HttpResponse res, HttpContext ctx) throws ProtocolException {
            HttpClientContext clientCtx = HttpClientContext.adapt(ctx);
            HttpHost targetHost = clientCtx.getTargetHost();
            String host = targetHost.getHostName();
     
            int returnCode = res.getStatusLine().getStatusCode();
            if (returnCode == 302) { 
                Header header = res.getFirstHeader("Location");
                if (header != null) {
                    String location = header.getValue();
                    HttpGet follow = new HttpGet(location);
                    return follow;
                } else {
                    throw new ProtocolException("302 without Location header");
                }
            } else {
                if (returnCode == 200) {
                    if (host.matches("(.*)domain.com")) {
                        if (req.getRequestLine().getUri().startsWith("/login")) {
                            if (req.getRequestLine().getMethod().equalsIgnoreCase("get")) {
                                HttpPost logReq = BuildMyLoginRequest(); //Call that allow me to create a Post call with credentials not detail here
                                return logReq;
                            } else if (req.getRequestLine().getMethod().equalsIgnoreCase("post")) {                            
                                throw new ProtocolException("code 302 expeted here");
                            } else {                            
                                throw new ProtocolException("Request method invalid");
                            }
                        } else {                        
                            throw new ProtocolException("Not a login request");
                        }
                    } else {                    
                        throw new ProtocolException("Not the right logon host");
                    }
                } else {
                    throw new ProtocolException("Unexpected Http code");
                }
            }
        }
    }
    Sur une machine A o� le code fonctionne j'ai le s�quencement suivant:
    1er call � process : req = GET / HTTP/1.1 [Accept: application/json]
    1er call � isRedirected : req = GET /api/property HTTP/1.1 [Accept: application/json, Host: MyUrl1.domain.com, Connection: Keep-Alive, User-Agent: Apache-HttpClient/4.5 (Java/11.0.3), Accept-Encoding: gzip,deflate]
    => host = MyUrl1.domain.com
    => returnCode = 302
    => On a bien une Method Request "GET" -> donc isRedirected = True
    1er call � getRedirect : req = GET /api/property HTTP/1.1 [Accept: application/json, Host: MyUrl1.domain.com, Connection: Keep-Alive, User-Agent: Apache-HttpClient/4.5 (Java/11.0.3), Accept-Encoding: gzip,deflate]
    => host = MyUrl1.domain.com
    => returnCode = 302
    => Location = https://AnUrl2.domain.com/login

    2eme call � process : req = GET /login HTTP/1.1 [Accept: application/json]
    => host = AnUrl2.domain.com
    => req.getRequestLine().getUri() = "/login", donc commence bien par /login
    => l'accept header est d�j� "application/json"
    2eme call � isRedirected : req = GET /login HTTP/1.1 [Accept: application/json, Host: AnUrl2.domain.com, C onnection: Keep-Alive, User-Agent: Apache-HttpClient/4.5 (Java/11.0.3), Accept-Encoding: gzip,deflate]
    => host = AnUrl2.domain.com
    => returnCode = 200
    => req.getRequestLine().getUri() = "/login", donc commence bien par /login
    => On a bien une Method Request "GET" -> donc isRedirected = True
    2eme call � getRedirect : req = GET /login HTTP/1.1 [Accept: application/json, Host: AnUrl2.domain.com, Connection: Keep-Alive, User-Agent: Apache-HttpClient/4.5 (Java/11.0.3), Accept-Encoding: gzip,deflate]
    => host =AnUrl2.domain.com
    => returnCode = 200
    => Location = https://AnUrl2.domain.com/login
    => On a bien une Method Request "GET"
    => Je redirige vers ma Request POST avec les credential pour me logger
    Maintenant le m�me jar lanc� sur une machine B, le code ne fonctionne plus car pour une raison que j'ignore, le format des HttpRequest n'est pas le m�me:
    1er call � process : req = GET /api/property HTTP/1.1 [Accept: application/json]
    1er call � isRedirected : req = GET https://MyUrl1.domain.com/api/property HTTP/1.1
    => host = MyUrl1.domain.com
    => returnCode = 302
    => On a bien une Method Request "GET" -> donc isRedirected = True
    1er call � getRedirect : req = GET https://MyUrl1.domain.com/api/property HTTP/1.1
    => host = MyUrl1.domain.com
    => returnCode = 302
    => Location = https://AnUrl2.domain.com/login

    2eme call � process : req = GET /login HTTP/1.1 [Accept: application/json]
    => host = AnUrl2.domain.com
    => req.getRequestLine().getUri() = "/login", donc commence bien par /login
    => l'accept header est d�j� "application/json"
    2eme call � isRedirected : req = GET https://AnUrl2.domain.com/login HTTP/1.1
    => host = AnUrl2.domain.com
    => returnCode = 200
    => req.getRequestLine().getUri() = "https://AnUrl2.domain.com/login", donc ne commence par "/login"
    => donc isRedirected = False
    Du coup je ne passe pas dans le getRedirect pour faire ma Request POST avec les credential pour me logger

    Je n'arrive pas � comprendre ce qui peut entrainer cette diff�rence de comportement, mais du coup mon JAR n'est pas d�ployable. Je ne vois pas non plus comment debugger ce probl�me.

    D'avance merci pour votre aide.

  2. #2
    Mod�rateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par d�faut
    Hello,

    je soup�onne des versions diff�rentes de la lib Apache HttpClient.

    Il y a quoi dans ton jar, et comment tu fournis le jar de httpclient ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre tr�s actif
    Avatar de ryankarl65
    Homme Profil pro
    Data Engineer
    Inscrit en
    Juillet 2013
    Messages
    104
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (�le de France)

    Informations professionnelles :
    Activit� : Data Engineer

    Informations forums :
    Inscription : Juillet 2013
    Messages : 104
    Par d�faut
    Tu parles du jar apr�s compilation ?
    Moi, je pense au meme probl�me.
    Ton jar embarque les librairies necessaires ?

  4. #4
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    24
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Par d�faut
    Merci pour vos r�ponses et votre aide.
    Je parle du JAR compil�. En l'occurence c'est un BigJar qui embarque tout ce qu'il faut, dont httpclient-4.5.jar.
    Du coup c'est bien la m�me version qui est utilis� dans les 2 cas
    C'est assez incompr�hensible. Je suis bloqu� sur ce probl�me, et je j'ai vraiment pas d'inspiration pour avancer l'analyse.
    Je suis preneur de toute id�e.
    Merci.

  5. #5
    Membre tr�s actif
    Avatar de ryankarl65
    Homme Profil pro
    Data Engineer
    Inscrit en
    Juillet 2013
    Messages
    104
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (�le de France)

    Informations professionnelles :
    Activit� : Data Engineer

    Informations forums :
    Inscription : Juillet 2013
    Messages : 104
    Par d�faut
    Pour le deployment, utilise tu le meme serveur d'application ? avec les memes configuration.

Discussions similaires

  1. R�ponses: 5
    Dernier message: 13/07/2010, 14h35
  2. R�ponses: 2
    Dernier message: 21/05/2010, 11h56
  3. R�ponses: 9
    Dernier message: 26/03/2010, 14h38
  4. [AC-2000] la constante n'est pas valide pour ce type de contr�le
    Par niko8181 dans le forum IHM
    R�ponses: 3
    Dernier message: 20/01/2010, 11h46
  5. R�ponses: 1
    Dernier message: 29/10/2007, 12h59

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