Этот фрагмент кода не работает, я приводил "Аутентификацию к сбою". ответ с сервера. Какие-либо идеи?
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];
Оба _tumblrLogin
и _tumblrPassword
пробегаются stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding
в другом месте в моем коде. Моя электронная почта входа в систему имеет форму "address+test@test.com". Это работает просто великолепно для входа непосредственно в Tumblr, но я задаюсь вопросом, вызывает ли "+" символ проблемы с кодированием? Этого не оставляют. Это должно быть?
Благодаря предложению Martin я теперь использую CFURLCreateStringByAddingPercentEscapes
выйти из моего входа в систему и пароля. У меня все еще есть та же проблема, тем не менее, моя Аутентификация перестала работать.
Проблема в том, что вы не создаете правильный HTTP POST запрос. POST-запрос требует правильно оформленного многокомпонентного MIME-кодированного тела, содержащего все параметры, которые вы хотите отправить на сервер. Вы пытаетесь задать параметры в виде HTTP-заголовков, что совсем не работает.
Этот код сделает то, что вы хотите, особенно обратите внимание на категории NSString
, которые создают правильную строку Multipart MIME:
@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
Согласно ответам на этот вопрос , stringByAddingPercentEscapesUsingEncoding:
не выполняет полное escape-кодирование. По какой-то причине версия этого метода CoreFoundation выполняет , однако:
[(NSString *) CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)[[self mutableCopy] autorelease], NULL,
CFSTR("=,!$&'()*+;@?\n\"<>#\t :/"), kCFStringEncodingUTF8) autorelease];
Вы также можете использовать метод NSMutableString replaceOccurencesOfString: withString: options:
для выполнения замены вручную, но этот метод является более однообразный и многословный. ( См. Здесь .)