Ios __NSCFNumber stringByAddingPercentEncodingWithAllowedCharacters无法识别的选择器错误
所以我是新来的,用Objective-c编程。我想用HTTP POST方法发出请求。我发送的参数类型为int 我得到了这个错误:Ios __NSCFNumber stringByAddingPercentEncodingWithAllowedCharacters无法识别的选择器错误,ios,objective-c,Ios,Objective C,所以我是新来的,用Objective-c编程。我想用HTTP POST方法发出请求。我发送的参数类型为int 我得到了这个错误: [__NSCFNumber stringByAddingPercentEncodingWithAllowedCharacters:]: unrecognized selector sent to instance 0xb0000000000048d3 在这一行代码中: return [string stringByAddingPercentEncodingWithA
[__NSCFNumber stringByAddingPercentEncodingWithAllowedCharacters:]: unrecognized selector sent to instance 0xb0000000000048d3
在这一行代码中:
return [string stringByAddingPercentEncodingWithAllowedCharacters:allowed];
整个代码:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
request.HTTPMethod = @"POST";
[request setHTTPBody:[self httpBodyForParameters:params]];
NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"dataTaskWithRequest error: %@", error);
}
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
if (statusCode != 200) {
NSLog(@"Expected responseCode == 200; received %ld", (long)statusCode);
}}
NSError *parseError;
id responseObject = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
if (!responseObject) {
NSLog(@"JSON parse error: %@", parseError);
} else {
NSLog(@"responseObject = %@", responseObject);
}
NSLog(@"print123");
}];
[task resume];
}
- (NSData *)httpBodyForParameters:(NSDictionary *)parameters {
NSMutableArray *parameterArray = [NSMutableArray array];
[parameters enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) {
NSString *param = [NSString stringWithFormat:@"%@=%@", [self percentEscapeString:key], [self percentEscapeString:obj]];
[parameterArray addObject:param];
}];
NSString *string = [parameterArray componentsJoinedByString:@"&"];
return [string dataUsingEncoding:NSUTF8StringEncoding];
}
- (NSString *)percentEscapeString:(NSString *)string {
NSCharacterSet *allowed = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~"];
return [string stringByAddingPercentEncodingWithAllowedCharacters:allowed];
}
@Paulw11是正确的,错误是一个数字被当作字符串处理的结果。一个即时但有点笨拙的修复方法是,在枚举字典时,减少对所找到的值类型的承诺
// notice we change the type of obj id, not NSString*
[parameters enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) {
// now, test for it's type and treat accordingly
NSString *objString = ([obj isKindOfClass:[NSString self]])? [self percentEscapeString:obj] : [obj stringValue];
NSString *param = [NSString stringWithFormat:@"%@=%@", [self percentEscapeString:key], objString];
[parameterArray addObject:param];
}];
但这种脆弱的解决方案现在只适用于字符串和数字。如果您能说服服务器接受JSON,那么请求代码可以像这样简化和通用化
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
request.HTTPMethod = @"POST";
// params is your original (serializable) dictionary
NSError *error;
NSData *postData = [NSJSONSerialization dataWithJSONObject: params options:0 error:&error];
[request setHTTPBody:postData];
NSURLSessionTask *task = // ...
参数字典中的一项是NSNumber,而不是NSString。@Dzi,很高兴听到这个消息。你可以把它标对来表示。你能帮我做点别的吗?我有一个错误,期望响应代码=200;收到500@Dzi,500表示服务器端出现内部错误。