gpt4 book ai didi

ios - __NSCFNumber stringByAddingPercentEncodingWithAllowedCharacters 无法识别的选择器错误

转载 作者:行者123 更新时间:2023-11-29 00:26:37 24 4
gpt4 key购买 nike

所以我是 Objective-c 编程的新手。我想使用 HTTP POST 方法发出请求。我发送的参数是 int 类型。

我收到这个错误:

[__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 是正确的,错误是将数字视为字符串的结果。立即(但有点笨拙)的解决方法是减少对枚举字典时找到的值类型的 promise ...

// 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 = // ...

关于ios - __NSCFNumber stringByAddingPercentEncodingWithAllowedCharacters 无法识别的选择器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42843089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com