如何使用&发布密码符号

时间:2014-05-04 19:27:22

标签: ios post nsurlrequest

我正在尝试创建一个通过POST将密码发送到php网站的应用程序,但我遇到PostData问题。当密码包含&符号它认为变量将被分成两部分。

例如:

  • 用户名:testuser
  • 电子邮件:email@email.com
  • 密码:Pass& word1

以下是PostData

username=testuser&email=email@email.com&password=Pass&word1
                                                     ^This breaks the password up

这是我的代码:

@try {

    NSString *post = [[NSString alloc] initWithFormat:@"username=%@&email=%@&password=%@", usernameField.text, emailField.text, password1Field.text];
    NSLog(@"PostData: %@",post);

    NSURL *url=[NSURL URLWithString:@"http://mywebsite.com/test/register.php"];

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

    NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:url];
    [request setHTTPMethod:@"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:postData];
}
@catch (NSException *exception) {
    NSLog(@"Exception: %@", exception);
}

修改

我也意识到像àìú这样的字母也会引起问题。

2 个答案:

答案 0 :(得分:1)

&符号在HTTP请求中具有特殊含义。您需要对这些参数进行URL编码,以确保服务器软件知道它们是数据。

您需要为请求字符串中的每个参数执行类似的操作:

NSString* encodedPassword = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
           (CFStringRef)password1Field.text,
           NULL,
           (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
           CFStringConvertNSStringEncodingToEncoding(NSUTF8Encoding));

请查看此参考,以获取将URL编码器添加到NSString类的一个很好的示例:http://madebymany.com/blog/url-encoding-an-nsstring-on-ios

至于你的编辑,像àìú这样的字符可能会给你带来问题,因为你正在使用NSASCIIStringEncoding。尝试使用NSUTF8StringEncoding,因为它支持比ASCII更大范围的潜在字符。

答案 1 :(得分:-1)

简单解决方案:使用'|'而不是'&'在您的Objective C代码中。