Question

Cet extrait de code ne fonctionne pas, je reçois un « Échec de l'authentification. » réponse du serveur. Toutes les idées?

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] 
                                    initWithURL:
                                    [NSURL URLWithString:@"http://www.tumblr.com/api/write"]];
    [request setHTTPMethod:@"POST"];
    [request addValue:_tumblrLogin forHTTPHeaderField:@"email"];
    [request addValue:_tumblrPassword forHTTPHeaderField:@"password"];
    [request addValue:@"regular" forHTTPHeaderField:@"type"];
    [request addValue:@"theTitle" forHTTPHeaderField:@"title"];
    [request addValue:@"theBody" forHTTPHeaderField:@"body"];

    NSLog(@"Tumblr Login:%@\nTumblr Password:%@", _tumblrLogin, _tumblrPassword);

    [NSURLConnection connectionWithRequest:request delegate:self];

    [request release];

Les deux _tumblrLogin et _tumblrPassword sont exécutés par stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding ailleurs dans mon code. Mon email de connexion est de la forme « address+test@test.com ». Il fonctionne très bien pour se connecter directement à tumblr, mais je me demande si le caractère « + » est à l'origine des problèmes avec l'encodage? Il est pas échappé. Devrait-il être?


Merci à la suggestion de Martin, j'utilise maintenant CFURLCreateStringByAddingPercentEscapes pour échapper à mon login et mot de passe. Je vais avoir toujours la même question, cependant, mon authentification échoue.

Était-ce utile?

La solution

Le problème est que vous ne créez pas une requête HTTP POST appropriée. Une requête POST nécessite un corps codé MIME multipart correctement formaté contenant tous les paramètres que vous souhaitez envoyer au serveur. Vous essayez de définir les paramètres les en-têtes HTTP qui ne fonctionnent pas du tout.

Ce code va faire ce que vous voulez, note en particulier les catégories de NSString qui créent une chaîne MIME multipart valide:

@interface NSString (MIMEAdditions)
+ (NSString*)MIMEBoundary;
+ (NSString*)multipartMIMEStringWithDictionary:(NSDictionary*)dict;
@end

@implementation NSString (MIMEAdditions)
//this returns a unique boundary which is used in constructing the multipart MIME body of the POST request
+ (NSString*)MIMEBoundary
{
    static NSString* MIMEBoundary = nil;
    if(!MIMEBoundary)
        MIMEBoundary = [[NSString alloc] initWithFormat:@"----_=_YourAppNameNoSpaces_%@_=_----",[[NSProcessInfo processInfo] globallyUniqueString]];
    return MIMEBoundary;
}
//this create a correctly structured multipart MIME body for the POST request from a dictionary
+ (NSString*)multipartMIMEStringWithDictionary:(NSDictionary*)dict 
{
    NSMutableString* result = [NSMutableString string];
    for (NSString* key in dict)
    {
        [result appendFormat:@"--%@\r\nContent-Disposition: form-data; name=\"%@\"\r\n\r\n%@\r\n",[NSString MIMEBoundary],key,[dict objectForKey:key]];
    }
    [result appendFormat:@"\r\n--%@--\r\n",[NSString MIMEBoundary]];
    return result;
}
@end


@implementation YourObject
- (void)postToTumblr
{
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] 
                                    initWithURL:
                                    [NSURL URLWithString:@"http://www.tumblr.com/api/write"]];
    [request setHTTPMethod:@"POST"];
    //tell the server to expect 8-bit encoded content as we're sending UTF-8 data, 
    //and UTF-8 is an 8-bit encoding
    [request addValue:@"8bit" forHTTPHeaderField:@"Content-Transfer-Encoding"];
    //set the content-type header to multipart MIME
    [request addValue: [NSString stringWithFormat:@"multipart/form-data; boundary=%@",[NSString MIMEBoundary]] forHTTPHeaderField: @"Content-Type"];

    //create a dictionary for all the fields you want to send in the POST request
    NSDictionary* postData = [NSDictionary dictionaryWithObjectsAndKeys:
                                 _tumblrLogin, @"email",
                                 _tumblrPassword, @"password",
                                 @"regular", @"type",
                                 @"theTitle", @"title",
                                 @"theBody", @"body",
                                 nil];
    //set the body of the POST request to the multipart MIME encoded dictionary
    [request setHTTPBody: [[NSString multipartMIMEStringWithDictionary: postData] dataUsingEncoding: NSUTF8StringEncoding]];
    NSLog(@"Tumblr Login:%@\nTumblr Password:%@", _tumblrLogin, _tumblrPassword);
    [NSURLConnection connectionWithRequest:request delegate:self];
    [request release];
}
@end

Autres conseils

Selon les réponses à cette question , stringByAddingPercentEscapesUsingEncoding: ne fonctionne pas un codage d'échappement complet. Pour une raison quelconque, la version CoreFoundation de cette méthode a toutefois:

[(NSString *) CFURLCreateStringByAddingPercentEscapes(NULL, 
    (CFStringRef)[[self mutableCopy] autorelease], NULL, 
    CFSTR("=,!$&'()*+;@?\n\"<>#\t :/"), kCFStringEncodingUTF8) autorelease];

Vous pouvez également utiliser la méthode de replaceOccurencesOfString:withString:options: de NSMutableString pour faire le remplacement manuellement, mais cette méthode est plus répétitive et bavard. (. Voir )

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