знак "+" в адресе электронной почты - PullRequest
1 голос
/ 24 марта 2010

Мне нужно отправить адрес электронной почты со знаком "+" и подтвердить его на сервере. Но сервер получает электронную почту типа "aaa+bbb@mail.com" как "aaa bbb@mail.com".

Я отправляю все данные как POST-запрос со следующим кодом

NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", url, @"/signUp"]];

NSString *post = [NSString stringWithFormat:@"&email=%@&userName=%@&password=%@",
                      user.email, 
                      user.userName, 
                      user.password];

NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:NO];

NSData* data = [self sendRequest:url postData:postData];

переменная post перед кодированием имеет значение

&email=aaa+bbb@gmail.coma&userName=Asdfasdfadsfadsf&password=sdfasdf

после кодирования это то же самое

&email=aaa+bbb@gmail.coma&userName=Asdfasdfadsfadsf&password=sdfasdf

Метод, который я использую для отправки запроса, выглядит следующим образом:

-(id) sendRequest:(NSURL*) url postData:(NSData*)postData {
    // Create request
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

    NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]];

    [request setURL:url];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody:postData];

    NSURLResponse *urlResponse;

    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:nil];

    [request release];

    return data;
}

Ответы [ 3 ]

6 голосов
/ 24 марта 2010

Адрес электронной почты, имя пользователя и пароль должны быть экранированы -stringByAddingPercentEscapesUsingEncoding:.

NSString *post = [NSString stringWithFormat:@"&email=%@&userName=%@&password=%@",
                  [user.email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                  ...

Однако это не ускользнет от +, поскольку это действительный символ URL. Вы можете использовать более сложный CFURLCreateStringByAddingPercentEscapes, или для простоты просто замените все + на %2B:

NSString *post = [NSString stringWithFormat:@"&email=%@&userName=%@&password=%@",
                  [[user.email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
                   stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"], ...
1 голос
/ 24 марта 2010

Сервер HTTP + не экранируется как пробел.

Вам нужно выйти из + как %2B, позвонив CFURLCreateStringByAddingPercentEscapes

0 голосов
/ 24 марта 2010

Вам необходимо urlencode знак плюс. Это должно стать %2B для получателя, чтобы думать, что это знак плюс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...