HTTPHeader d'une NSURLRequest -> WebView

Bonjour,



J'ai un petit soucis. Je crée une NSUrlRequest à  partir d'une NSURL, et j'utilise la requête pour charger une UIWebView.






<br />
[color=#7034a9]NSURL[/color] *url = [[color=#7034a9]NSURL[/color] [color=#3f1281]URLWithString[/color]:[[color=#7034a9]NSString[/color] [color=#3f1281]stringWithFormat[/color]:[color=#cb2321]@&quot;http://%@:%@/wa/r/%@?OutputMap=%@&quot;[/color], app_url, app_port, app_name, app_theme]];<br />
[color=#108704]<br />
[color=#000000]    [/color]// Load URL[/color][color=#3f1281]<br />
[color=#000000]    [/color][color=#7034a9]NSURLRequest[/color][color=#000000] *requestObj = [[/color][color=#7034a9]NSURLRequest[/color][color=#000000] [/color]requestWithURL[color=#000000]:url [/color]cachePolicy[color=#000000]:[/color]NSURLRequestUseProtocolCachePolicy[color=#000000] [/color]timeoutInterval[color=#000000]:[/color][color=#340ed7]60.0[/color][color=#000000]];[/color][/color][color=#108704]<br />
// iosWV -&gt; webview[/color]<br />
    [[color=#548187]iosWV[/color] [color=#3f1281]loadRequest[/color]:requestObj];<br />
<br />
    [color=#3f1281]NSLog[/color]([color=#cb2321]@&quot;HTTPMethod %@&quot;[/color], [requestObj [color=#3f1281]HTTPMethod[/color]]);<br />
    [color=#3f1281]NSLog[/color]([color=#cb2321]@&quot;URL %@&quot;[/color], [requestObj [color=#3f1281]URL[/color]]);<br />
    [color=#3f1281]NSLog[/color]([color=#cb2321]@&quot;mainDocumentURL %@&quot;[/color], [requestObj [color=#3f1281]mainDocumentURL[/color]]);<br />
[color=#cb2321]<br />
[color=#000000]    [/color][color=#3f1281]NSLog[/color][color=#000000]([/color]@&quot;allHTTPHeaderFields %@&quot;[color=#000000], [requestObj [/color][color=#3f1281]allHTTPHeaderFields[/color][color=#000000]]);[/color][/color]<br />
    [color=#3f1281]NSLog[/color]([color=#cb2321]@&quot;HTTPBody %@&quot;[/color], [requestObj [color=#3f1281]HTTPBody[/color]]);[color=#cb2321]<br />
[color=#000000]    [/color][color=#3f1281]NSLog[/color][color=#000000]([/color]@&quot;HTTPShouldHandlePipelining %@&quot;[color=#000000], [requestObj [/color][color=#3f1281]HTTPShouldUsePipelining[/color][color=#000000]]);[/color][/color]<br />








Mon problème est que la requête semble "vide", la web view se charge comme il faut, mais les éléments de la NSURLRequest sont null.






2012-05-21 15:26:11.236 Genero[3112:f803] HTTPMethod GET

2012-05-21 15:26:11.238 Genero[3112:f803] URL http://localhost:6363/wa/r/gwc-demo?OutputMap=DUA_HTML5

2012-05-21 15:26:11.238 Genero[3112:f803] mainDocumentURL (null)

2012-05-21 15:26:11.239 Genero[3112:f803] allHTTPHeaderFields (null)

2012-05-21 15:26:11.239 Genero[3112:f803] HTTPBody (null)

2012-05-21 15:26:11.240 Genero[3112:f803] HTTPShouldHandlePipelining (null)






Je ne sais pas trop quoi faire.



Merci !

Réponses

  • BaardeBaarde Membre
    à‰videmment que le corps et les entêtes de la requête sont vides : la requête correspond aux données que tu envoies au serveur web. Les données retournées par le serveur sont stockées dans une NSHTTPURLResponse.
  • StephSteph Membre
    Effectivement, il te faut récupérer la valeur de retour, là  tu ne fais pas un initWithContentOfURL, donc ça ne charge pas !
  • Ok, merci !



    Et comment je peux avoir accès à  la réponse ? (NSHTTPURLResponse)
  • 'Steph' a écrit:


    Effectivement, il te faut récupérer la valeur de retour, là  tu ne fais pas un initWithContentOfURL, donc ça ne charge pas !




    utiliser ça à  la place du request ?





    NSURLRequest *requestObj = [/color][color=#7034a9]NSURLRequest[/color][color=#000000] [/color]alloc[color=#000000 initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
  • zoczoc Membre
    'Steph' a écrit:


    Effectivement, il te faut récupérer la valeur de retour, là  tu ne fais pas un initWithContentOfURL, donc ça ne charge pas !


    Certes, mais à  la base c'est la WebView qui s'en charge. Faire un initWithContentOfURL aura donc pour conséquence de charger une seconde fois les données... Pas très optimal [1]


    'Baarde' a écrit:


    à‰videmment que le corps et les entêtes de la requête sont vides : la requête correspond aux données que tu envoies au serveur web. Les données retournées par le serveur sont stockées dans une NSHTTPURLResponse.


    Réponse qui est malheureusement inaccessible depuis UIWebView. Donc dans l'état, il est impossible de récupérer le contenu de la réponse.



    [1]: Mais du coup sans doute la seule méthode valable...

  • zoczoc Membre
    mai 2012 modifié #7
    'Geoffrey' a écrit:


    utiliser ça à  la place du request ?





    NSURLRequest *requestObj = [/color][color=#7034a9]NSURLRequest[/color][color=#000000] [/color]alloc[color=#000000 initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];




    Ca, c'est strictement identique à  ce qu'il a écrit, à  la différence près que lui utilise un constructeur de commodité qui fait exactement ce que tu as écris, mais en plus "commode" (et qui ne risque pas de leaker s'il n'y a pas de release et qu'il n'utilise pas ARC).
  • BaardeBaarde Membre
    mai 2012 modifié #8
    Pour récupérer le résultat d'une requête :


    [NSURLConnection sendAsynchronousRequest:request<br />
                                       queue:[NSOperationQueue mainQueue]<br />
                           completionHandler:^(NSHTTPURLResponse *response, NSData *data, NSError *error) {<br />
    <br />
        if ( &#33; error ) {<br />
            // Utilisation de la réponse et des data<br />
        }<br />
    }];<br />
    
  • Et en subclassant UIWebView ? Y'a pas moyen de faire en sorte de ne pas charger 2 fois les données ?



    Sinon le initWithContentOfUrl je le fais sur quel objet ?
  • Non, UIWebView ne permet pas de récupérer le résultat de la requête. Pourquoi souhaites tu faire cela ?
  • StephSteph Membre
    Déjà  ouais, la webView c'est pour charger la requête à  l'intérieur et afficher la page en gros, donc je ne comprends pas pourquoi tu veux récupérer le résultat si le but final c'est de la charger dans ta webView ...
  • zoczoc Membre
    'Geoffrey' a écrit:


    Et en subclassant UIWebView ?


    UIWebView n'expose aucune méthode permettant d'y avoir accès. Par conséquent, cela suppose la surcharge de méthode(s) privée(s), ce qui aura sans nul doute pour conséquence le rejet de l'application.


  • Non, UIWebView ne permet pas de récupérer le résultat de la requête. Pourquoi souhaites tu faire cela ?













    En fait la boite pour laquelle je bosse propose un env de dév et de déploiement d'appli business, et l'idée c'était de proposer un template xcode pour permettre à  nos client d'accéder aux applis développées avec notre langage sur iOS. Sachant que les applications sont proposées comme des pages web via un serveur d'application.



    La première idée était simplement de faire une webview qui charge l'url souhaitée. Mais il y a plusieurs soucis liés au comportement de la webview :

    - lorsque l'application est en background, il n'y a plus de javascript qui passe, et donc pas de keepAlive (sur Android il n'y a pas ce soucis). C'est pour ça que j'essaye d'avoir le contenu du header pour obtenir une certaine URL qui me permettrait de faire un faux keepAlive

    - les popup ne s'ouvrent pas, il faut faire un traitement dans shouldStartLoadWithRequest
  • 'zoc' a écrit:


    UIWebView n'expose aucune méthode permettant d'y avoir accès. Par conséquent, cela suppose la surcharge de méthode(s) privée(s), ce qui aura sans nul doute pour conséquence le rejet de l'application.




    Ca se serait pas trop grave, nos clients feraient du déploiement in-house.
  • Je pourrais pas, plutôt que de donner directement l'url pour charger la webview, gérer la connection moi-même, et ensuite donner les infos à  la webview sous forme de NSdata ?
  • zoczoc Membre
    - (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)baseURL ?
    




    (des fois, la doc, ça sert de la lire)
  • Bon j'ai un peu avancé avec votre aide mais je coince toujours.



    Je n'arrive toujours pas à  avoir accès à  la réponse.



    En fait :

    iPhone ---- URL ----> Serveur Web

    Serveur Web --- page web dynamique + URL avec hash ----> iPhone

    et ensuite la connexion reste et en fonction des interactions de l'utilisateur, des données transitent et la page web est mise à  jour



    Ce que je fais maintenant :



    Dans le viewDidLoad :

    - je crée l'url initiale : myURL

    - je crée la requête : myRequest

    - j'initialise un mutabledata : myData

    - j'initialise one connection :
    [color=#548187]myConnection[/color][color=#000000] = [[[/color][color=#7034a9]NSURLConnection[/color][color=#000000] [/color]alloc[color=#000000]] [/color]initWithRequest[color=#000000]:[/color][color=#548187]myRequest[/color][color=#000000] [/color]delegate[color=#000000]:[/color][color=#b615a2]self[/color][color=#000000] [/color]startImmediately[color=#000000]:[/color][color=#b615a2]YES[/color][color=#000000]];[/color]
    




    Ensuite j'utilise des delegate de UIWebView et NSURLConnection :




    [color=#75482c]<br />
    #pragma mark UIWebView delegate[/color]<br />
    - ([color=#b615a2]void[/color])webViewDidStartLoad:([color=#7034a9]UIWebView[/color] *)webView {[color=#cb2321]<br />
    [color=#000000]    [/color][color=#3f1281]NSLog[/color][color=#000000]([/color]@&quot;webViewDidStartLoad&quot;[color=#000000]);[/color][/color]<br />
    }<br />
    <br />
    - ([color=#b615a2]void[/color])webViewDidFinishLoad:([color=#7034a9]UIWebView[/color] *)webView {[color=#cb2321]<br />
    [color=#000000]    [/color][color=#3f1281]NSLog[/color][color=#000000]([/color]@&quot;webViewDidFinishLoad&quot;[color=#000000]);[/color][/color]<br />
    }<br />
    <br />
    -([color=#b615a2]BOOL[/color])webView:([color=#7034a9]UIWebView[/color] *)webView shouldStartLoadWithRequest:([color=#7034a9]NSURLRequest[/color] *)request navigationType:([color=#7034a9]UIWebViewNavigationType[/color])navigationType {<br />
        [color=#3f1281]NSLog[/color]([color=#cb2321]@&quot;Request : %@&quot;[/color], [request [color=#3f1281]HTTPBody[/color]]);[color=#cb2321]<br />
    [color=#000000]    [/color][color=#3f1281]NSLog[/color][color=#000000]([/color]@&quot;MyRequest : %@&quot;[color=#000000], [[/color][color=#548187]myRequest[/color][color=#000000] [/color][color=#3f1281]HTTPBody[/color][color=#000000]]);[/color][/color][color=#b615a2]<br />
    [color=#000000]    [/color]return[color=#000000] [/color]YES[color=#000000];[/color][/color]<br />
    }<br />
    <br />
    - ([color=#b615a2]void[/color])webView:([color=#7034a9]UIWebView[/color] *)webView didFailLoadWithError:([color=#7034a9]NSError[/color] *)error {[color=#cb2321]<br />
    [color=#000000]    [/color][color=#3f1281]NSLog[/color][color=#000000]([/color]@&quot;didFailLoadWithError&quot;[color=#000000]);[/color][/color]<br />
    <br />
    }<br />
    [color=#75482c]<br />
    #pragma mark NSURLConnection delegate[/color]<br />
    <br />
    - ([color=#b615a2]void[/color])connection:([color=#7034a9]NSURLConnection[/color] *)connection didReceiveResponse:([color=#7034a9]NSURLResponse[/color] *)response{[color=#cb2321]<br />
    [color=#000000]    [/color][color=#3f1281]NSLog[/color][color=#000000]([/color]@&quot;didReceiveResponse&quot;[color=#000000]);[/color][/color]<br />
    <br />
        [color=#548187]myData[/color] = [[[color=#7034a9]NSMutableData[/color] [color=#3f1281]alloc[/color]] [color=#3f1281]init[/color]];<br />
    }<br />
    -([color=#b615a2]void[/color])connection:([color=#7034a9]NSURLConnection[/color] *)connection didReceiveData:([color=#7034a9]NSData[/color] *)data{[color=#cb2321]<br />
    [color=#000000]    [/color][color=#3f1281]NSLog[/color][color=#000000]([/color]@&quot;didReceiveData&quot;[color=#000000]);[/color][/color]<br />
    <br />
        [[color=#548187]myData[/color] [color=#3f1281]appendData[/color]:data];<br />
    }<br />
    <br />
    -([color=#b615a2]void[/color])connectionDidFinishLoading:([color=#7034a9]NSURLConnection[/color] *)connection{[color=#cb2321]<br />
    [color=#000000]    [/color][color=#3f1281]NSLog[/color][color=#000000]([/color]@&quot;connectionDidFinishLoading&quot;[color=#000000]);[/color][/color]<br />
    [color=#3f1281]<br />
    [color=#000000]    [[/color][color=#548187]iosWV[/color][color=#000000] [/color]loadData[color=#000000]:[/color][color=#548187]myData[/color][color=#000000] [/color]MIMEType[color=#000000]: [/color][color=#cb2321]@&quot;text/html&quot;[/color][color=#000000] [/color]textEncodingName[color=#000000]: [/color][color=#cb2321]@&quot;UTF-8&quot;[/color][color=#000000] [/color]baseURL[color=#000000]:[/color][color=#548187]myURL[/color][color=#000000]];[/color][/color]<br />
    }<br />
    




    Ma webview se charge, mais je n'arrive pas à  accéder aux échanges de données entre le serveur et l'iphone. Est ce que c'est parce que l'url change ?



    Exemple d'URL initiale : http://10.192.50.1:6363/wa/r/gwc-demo?OutputMap=DUA_HTML5

    Exemple d'URL réelle (request URL dans le leader du POST HTML) : http://10.192.50.1:6363/wa/sua/c19c7dcf31e5e7d5f65d45a6f39508a0/1/1
  • J'arrive à  avoir l'allier (le GET) mais pas le retour (le POST) :/
  • AliGatorAliGator Membre, Modérateur
    Heu quel rapport entre le GET ou le POST et l'aller (envoi de ta requête) ou le retour (réception de la réponse) ?

    Ce sont deux choses qui n'ont rien à  voir...
  • Je vais essayer de m'expliquer différemment.



    D'un coté un iPhone (avec une webview), de l'autre un serveur web qui expose des applications.



    L'iPhone se connecte à  une URL spécifique sur le serveur web, le serveur web retourne une page HTML dynamique.

    Dès qu'il y a une interaction sur l'iPhone (par exemple saisie de texte dans un champ texte, ajout d'une ligne dans un tableau, ...), l'iPhone envoie l'information au serveur web.

    Le serveur web ensuite envois une nouvelle page HTML qui remplace la page précédente (enfin cela fonctionne de manière dynamique en AJAX, toute la page n'est pas rechargée).

    Et ainsi de suite.



    Et j'aimerais dans mon programme iOS tracer ce flux.



    Pour l'instant, j'arrive seulement à  tracer la toute première étape -> l'iphone reçoit la page web initiale et l'affiche.



    Et je suis coincé.
Connectez-vous ou Inscrivez-vous pour répondre.