Création de NSURLRequest à l'aide de la string de requête dans ios

J'ai créé un formulaire de request d'user dans ios. J'utilise php comme server. J'ai construit une string de requête comme ci-dessous dans IOS

http://www.mydomain.in/androidmail_enquiry.php?name=Vinoth Kumar&phone=04259280244&[email protected]&address=Coimbatore&comments=Sample Enquiry&mobile=xxxxxxxx 

Code:

 -(void)sendEnquiryDetails { cmttextview.text = @"Sample Enquiry"; NSSsortingng *siteurl = @"http://www.mydomain.in/androidmail_enquiry.php?"; NSSsortingng *name = txtName.text; NSSsortingng *phone = txtPhone.text; NSSsortingng *email = txtEmail.text; NSSsortingng *address = txtAddress.text; NSSsortingng *comments = cmttextview.text; NSSsortingng *mobile = txtMobile.text; NSSsortingng *enquiryurl = [NSSsortingng ssortingngWithFormat:@"%@name=%@&phone=%@&email=%@&address=%@&comments=%@&mobile=%@",siteurl,name,phone,email,address,comments,mobile]; NSLog(enquiryurl); NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithSsortingng:enquiryurl]]; NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; } - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { //NSLog(@"didReceiveResponse"); [self.responseData setLength:0]; } -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [self.responseData appendData:data]; } -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"%@",[NSSsortingng ssortingngWithFormat :@"didfailwitherror: %@", [error description]]); } -(void)connectionDidFinishLoading: (NSURLConnection *)connection{ NSLog(@"Success Code:%@",self.responseData); } 

Mais quand je soumets ceci en employant NSURLRequest obtenant l'erreur comme l'url invalide (erreur formasortingce d'URL) dans la méthode de didFailWithError.

Assurez-vous que vous avez ajouté ssortingngByAddingPercentEscapesUsingEncoding , car dans votre URL il y a un espace dans le nom, donc dans le browser il est remplacé par% 20 que vous devez append par programmation dans le code,

Essaye ça

 -(void)sendEnquiryDetails { cmttextview.text = @"Sample Enquiry"; NSSsortingng *siteurl = @"http://www.mydomain.in/androidmail_enquiry.php?"; NSSsortingng *name = txtName.text; NSSsortingng *phone = txtPhone.text; NSSsortingng *email = txtEmail.text; NSSsortingng *address = txtAddress.text; NSSsortingng *comments = cmttextview.text; NSSsortingng *mobile = txtMobile.text; NSSsortingng *enquiryurl = [NSSsortingng ssortingngWithFormat:@"%@name=%@&phone=%@&email=%@&address=%@&comments=%@&mobile=%@",siteurl,name,phone,email,address,comments,mobile]; NSLog(enquiryurl); NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithSsortingng:[enquiryurl ssortingngByAddingPercentEscapesUsingEncoding:NSUTF8SsortingngEncoding]]]; NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; } 

Vous devez extraire les caractères réservés. Si rien d'autre, vous devez replace ces espaces par + (ou %20 ).

Malheureusement, le standard ssortingngByAddingPercentEscapesUsingEncoding n'est pas à la hauteur du travail, car il laisse certains caractères inchangés. Votre échantillon n'en comprend aucun, mais si le nom de la personne a été entré comme "Bill & Melinda Gates" ou "Bill + Melinda Gates", ssortingngByAddingPercentEscapesUsingEncoding ne le ssortingngByAddingPercentEscapesUsingEncoding pas correctement. Vous devriez vraiment utiliser CFURLCreateSsortingngByAddingPercentEscapes pour échapper les valeurs, par exemple en utilisant cette catégorie:

 @implementation NSSsortingng (URLEncode) - (NSSsortingng *)ssortingngForHTTPRequest { NSSsortingng *result = CFBridgingRelease(CFURLCreateSsortingngByAddingPercentEscapes(kCFAllocatorDefault, (CFSsortingngRef)self, (CFSsortingngRef)@" ", (CFSsortingngRef)@":/?@!$&'()*+,;=", kCFSsortingngEncodingUTF8)); return [result ssortingngByReplacingOccurrencesOfSsortingng:@" " withSsortingng:@"+"]; } @end 

Cela permet d'échapper correctement tous les caractères réservés, mais remplace les espaces par des caractères + (ce que vous devriez faire si votre type de requête est application/x-www-form-urlencoded ).

Alternativement, vous pouvez également replace les espaces avec %20 comme ceci:

 - (NSSsortingng *)ssortingngForHTTPRequest { return CFBridgingRelease(CFURLCreateSsortingngByAddingPercentEscapes(kCFAllocatorDefault, (CFSsortingngRef)self, NULL, (CFSsortingngRef)@":/?@!$&'()*+,;=", kCFSsortingngEncodingUTF8)); } 

Avec cela, vous pouvez modifier cette ligne de code qui construit la string URL:

 NSSsortingng *enquiryurl = [NSSsortingng ssortingngWithFormat:@"%@name=%@&phone=%@&email=%@&address=%@&comments=%@&mobile=%@", siteurl, [name ssortingngForHTTPRequest], [phone ssortingngForHTTPRequest], [email ssortingngForHTTPRequest], [address ssortingngForHTTPRequest], [comments ssortingngForHTTPRequest], [mobile ssortingngForHTTPRequest]]; 

Selon les docs, si un object NSURL est initialisé avec une string, la string doit être conforme à la RFC 2396 (voir les documents Apple officiels URLWithSsortingng ).

La RFC la plus récente est cependant RFC 3986 qui obsolète RFC 2396.

Mise en garde:

Ni Cocoa ni Core Foundation n'auront une fonction qui renvoie une string URL correctement codée conformément à la RFC 2396 ou à la RFC 3986.

Les différents composants d'une URL ont des exigences de encoding en pourcentage variables.

Modifier:

Afin de transmettre des parameters structurés dans un composant de requête non structuré d'une URL, un schéma de encoding égal à l' algorithm de encoding application / x-www-form-urlencoded peut être appliqué au composant de requête.

Une fonction d'aide qui code le nom ou la valeur et qui est conforme à cet enencoding peut être implémentée comme:

 static NSSsortingng* urlformdata_encode(NSSsortingng* s) { CFSsortingngRef charactersToLeaveUnescaped = CFSTR(" "); CFSsortingngRef legalURLCharactersToBeEscaped = CFSTR("!$&'()+,/:;=?@~"); NSSsortingng *result = CFBridgingRelease(CFURLCreateSsortingngByAddingPercentEscapes( kCFAllocatorDefault, (__bridge CFSsortingngRef)s, charactersToLeaveUnescaped, legalURLCharactersToBeEscaped, kCFSsortingngEncodingUTF8)); return [result ssortingngByReplacingOccurrencesOfSsortingng:@" " withSsortingng:@"+"]; } 

(Remarque: ce code dépend de l'implémentation en cours de CFURLCreateSsortingngByAddingPercentEscapes , en particulier son échappement par CFURLCreateSsortingngByAddingPercentEscapes ceux-ci changent, le code peut ne pas implémenter correctement l'algorithm.)

Selon la RFC 3986, le composant de query de l'URL est traité comme un stream octet codé en pourcentage non structuré contenant uniquement des caractères ASCII.

A l'origine, le schéma de encoding "application / x-www-form-urlencoded" a été défini pour transmettre des données de formulaire d'un browser à un server qui devient la charge utile d'un corps. Autrement dit, le context est totalement différent de celui des URL. Néanless, même ce schéma de encoding n'est pas défini dans la RFC 3986, il est finalement compatible avec le schéma de encoding d'URL.

Avertissements

Le schéma de encoding "application / x-www-form-urlencoded" peut produire des pourcentages d'échappement pour les caractères qui sont maintenant dans le jeu de caractères "Unreserved" selon la RFC 3986, à savoir le caractère tilde ~ . Les caractères du jeu de caractères "Non réservé" n'ont pas besoin d'être échappés. Plus ssortingctement, en raison des implications dans les implémentations de comparaison d'URI, RFC 3986 fait cette recommandation:

"Pour la cohérence, les octets codés en pourcentage dans les plages d'ALPHA (% 41-% 5A et% 61-% 7A), DIGIT (% 30-% 39), trait d'union (% 2D), point (% 2E), trait de soulignement ( % 5F), ou tilde (% 7E) ne devrait pas être créé par les producteurs URI " .

Afin de ne pas échapper le tilde ~ dans les parameters de requête, on peut supprimer le tilde ~ de l'set des caractères d'URL légaux à échapper à legalURLCharactersToBeEscaped :

 CFSsortingngRef legalURLCharactersToBeEscaped = CFSTR("!$&'()+,/:;=?@"); 

Ne pas échapper au tilde ne devrait pas causer de problèmes, même si ce n'est pas ssortingct selon l'algorithm "application / x-www-form-encoded encoding".

Différences avec les autres algorithms suggérés pour cette question:

Comme l'algorithm de déencoding "application / x-www-form-urlencoded" décode toute séquence de caractères décodée en pourcentage dans son unité de code Unicode correspondante, les différences dans l'set de legalURLCharactersToBeEscaped spécifiés dans CFURLCreateSsortingngByAddingPercentEscapes cours du encoding peuvent éventuellement donner des strings égales.

(Edit: fonctions auxiliaires supprimées qui codent les composants d'une URL, qui ne sont pas pertinentes lorsqu'une string de requête doit être codée via application / x-www-form-urlencoded )