【问题标题】:Send POST request with special characters iOS发送带有特殊字符 iOS 的 POST 请求
【发布时间】:2015-05-28 23:47:15
【问题描述】:

我的应用调用 Web 服务进行登录。通常该服务可以正常工作,但是当我的密码带有特殊字符(例如:!*'\"();:@&=+$,/?%#[]%)时,Web 服务器不会'不允许我登录,因为在服务器端我收到的密码没有特殊字符,例如:

在我的应用上插入密码:test+test

密码接收到网络服务器:testtest

正如您看到的删除特殊字符的请求,实际上我正在使用以下代码发送登录凭据:

- (id)sendRequestToURL:(NSString *)url withMethod:(NSString *)method withUsername:(NSString*)username withPassword:(NSString*)password andInstallationId:(NSString*)installationId {
    NSURL *finalURL = [[NSURL alloc]init];

    if ([method isEqualToString:@"POST"]) {
        finalURL = [NSURL URLWithString:url];
    } else {
        NSLog(@"Metodo no previsto");
    }

    NSString *post = [NSString stringWithFormat:@"username=%@&password=%@&installationId=%@", username, password, installationId];
    NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding];

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

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
    [request setURL:finalURL];
    [request setHTTPMethod:method];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:postData];

    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    if (connection) {
        [connection start];
    }

    return connection;
}

我该如何解决这个问题?我看了NSString class reference,看到有- stringByAddingPercentEncodingWithAllowedCharacters:不删除特殊字符的方法,有人知道这个方法怎么用吗?可以给我一个代码 sn-p 吗?

谢谢

【问题讨论】:

标签: ios objective-c


【解决方案1】:

我找到了解决这个问题的方法,下面是我的代码,也许它应该对某人有用:

- (id)sendRequestToURL:(NSString *)url withMethod:(NSString *)method withUsername:(NSString*)username withPassword:(NSString*)password andInstallationId:(NSString*)installationId {
    NSURL *finalURL = [[NSURL alloc]init];

    if ([method isEqualToString:@"POST"]) {
        finalURL = [NSURL URLWithString:url];
    } else {
        NSLog(@"Metodo no previsto");
    }

    NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789"];

    NSString *encodedPassword = [password stringByAddingPercentEncodingWithAllowedCharacters:set];

    NSString *post = [NSString stringWithFormat:@"username=%@&password=%@&installationId=%@", username, encodedPassword, installationId];

    NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding];

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

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
    [request setURL:finalURL];
    [request setHTTPMethod:method];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:postData];

    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    if (connection) {
        [connection start];
    }

    return connection;
}

通过这种方式,我在密码字符串中搜索特殊字符,如果找到,则使用百分比编码更改此字符。这样,我可以使用普通密码和带有特殊字符的密码登录。我希望它对某人有用。

【讨论】:

    【解决方案2】:

    只需使用- stringByAddingPercentEscapesUsingEncoding: 对每个参数进行编码。

    NSString *encodeUsername = [username stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSString *encodePassword = [password stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSString *encodeInstallationId = [installationId stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    NSString *post = [NSString stringWithFormat:@"username=%@&password=%@&installationId=%@", encodeUsername, encodePassword, ins encodeInstallationId allationId];
    

    并在您的请求中使用此编码参数。

    【讨论】:

    • 我尝试了您的解决方案,但它不起作用...您可以使用我在问题上发布的代码来帮助我解决问题吗?
    • 请看我修改后的答案。
    【解决方案3】:

    Url 编码您的字符串并 POST 到 Web 服务。请使用下面的方法进行 url 编码。

    +(NSString *) urlencode: (NSString *) str {
    NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                                                                                   NULL,
                                                                                   (CFStringRef)str,
                                                                                   NULL,
                                                                                   (CFStringRef)@" ",
                                                                                   kCFStringEncodingUTF8 );
    
    return [encodedString autorelease];
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      相关资源
      最近更新 更多