Question

Dans mon application iOS, j'utilise un UIWebView et un protocole personnalisé (avec ma propre implémentation de NSURLProtocol). Je suis assez prudent de faire en sorte que chaque fois que je charge une url, je charge ce quelque chose comme dans mon UIWebView:

myprotocol: // myserver / monchemin

et dans ma mise en œuvre NSURLProtocol, je prends une copie mutable du NSURLRequest, convertir l'URL http:. Et envoyer cela à mon serveur

Tout fonctionne pour les requêtes HTTP GET. La rencontre I problème est avec les requêtes POST. Il semble que le UIWebView ne code pas correctement les données de formulaire dans le HTTPBody si la demande utilise mon protocole personnalisé.

Un travail autour, depuis que je suis en utilisant le protocole HTTPS pour mes demandes de serveur, est que j'enregistrer mon gestionnaire de protocole pour intercepter http: au lieu de myprotocol et je peux convertir tous les appels vers https: Cette autre question, ici , me fait vers cette solution:

Mais je me demande s'il y a une solution de rechange et / ou de meilleure façon d'accomplir ce que je veux.

Était-ce utile?

La solution

Au lieu d'essayer d'utiliser les requêtes POST, un travail autour de continuer à utiliser les requêtes GET pour les URL de myprotocol://, mais les transformer dans votre mise en œuvre de NSURLProtocol à un http:// et requête POST à ??votre serveur en utilisant la demande chaîne de requête que le corps du POST.

Le souci avec l'utilisation de requêtes GET pour envoyer de grandes quantités de données est que quelque part le long de la chaîne de demande, la ligne de demande peut tronqués. Cela semble ne pas être un problème, cependant, avec des protocoles mis en œuvre localement.

J'ai écrit une application de test court Cordova à expérimenter et je trouve que j'ai pu envoyer par un peu plus de 1 Mo de données sans problème au service faisant écho à la requête HTTP http://http-echo.jgate.de/

Voici mon implémentation de startLoading:

- (void)startLoading {
    NSURL *url = [[self request] URL];
    NSString *query = [url query];
    // Create a copy of `url` without the query string.
    url = [[[NSURL alloc] initWithScheme:@"http" host:@"http-echo.jgate.de" path:[url path]] autorelease];
    NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:url];
    [newRequest setHTTPMethod:@"POST"];
    [newRequest setAllHTTPHeaderFields:[[self request] allHTTPHeaderFields]];
    [newRequest addValue:@"close" forHTTPHeaderField:@"Connection"];
    [newRequest addValue:@"application/x-www-form-urlencoded;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
    [newRequest setHTTPBody:[query dataUsingEncoding:NSUTF8StringEncoding]];
    urlConnection = [[NSURLConnection alloc] initWithRequest:newRequest delegate:self];
    if (urlConnection) {
        receivedData = [[NSMutableData data] retain];
    }
}

I puis mis en œuvre les méthodes de protocole NSURLConnection de transmettre à la méthode de NSURLProtocolClient appropriée, mais la construction de données de réponse dans le cas de Transfer-Encoding:chunked (comme cela est le cas pour des réponses http://http-echo.jgate.de/ ).

Autres conseils

Malheureusement, il semble que les demandes de régime de http: et https: sont traités un peu différemment que les autres (y compris sur mesure) par des programmes-cadre Fondation. Il est évident que les appels HTTPBody et HTTPBodyStream sur le rendement des NSURLRequest toujours pertinentes pour nil anciens. Ceci est déjà décidé appel préalable [NSURLProtocol canInitWithRequest] donc la mise en œuvre personnalisée NSURLProtocol n'a aucun moyen d'influencer que (il est trop tard).

Il semble que différentes classes de NSURLRequest est utilisé pour http: et https: que «un par défaut. Par défaut GnuStep mise en œuvre de cette classe retourne toujours nil des appels de HTTPBody et HTTPBodyStream. Par conséquent mises en œuvre particulières (par exemple un sous PhoneGap, probablement partie du cadre Fondation) choisissent NSURLRequest-type de classe fondé sur un schéma conseil avant que, avec NSURLProtocol. Pour les régimes personnalisés, vous obtenez NSURLRequest que les rendements nil pour les HTTPBody et HTTPBodyStream qui utilisent efficacement désactive la méthode POST (et d'autres méthodes avec le corps) dans le gestionnaire de schéma d'URI personnalisé.

Peut-être il y a un moyen d'influencer la façon dont la décision classe NSURLRequest est effectivement utilisé, mais il est actuellement inconnu pour moi.

Pour contourner ce problème, vous pouvez toujours utiliser schéma de http: ou https: et décider dans [NSURLProtocol canInitWithRequest] en fonction d'autres critères (par exemple le nom d'hôte).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top