2017-03-16 87 views
0

因此,我使用Objective-c進行編程。我想用HTTP POST方法發出請求。我發送的參數是int類型的。__NSCFNumber stringByAddingPercentEncodingWithAllowedCharacters無法識別的選擇器錯誤

我得到這個錯誤:

[__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:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-._~"]; 
return [string stringByAddingPercentEncodingWithAllowedCharacters:allowed]; 
} 
+0

項目之一字典是'NSNumber',而不是'的NSString '。 – Paulw11

回答

1

@ 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 = // ... 
+0

這工作。非常感謝! :) – Dzi

+0

@Dzi,很高興聽到。您可以通過將其標記爲正確來指示。 – danh

+0

你能幫我做點什麼嗎?我有這個錯誤預期responseCode == 200;收到500 – Dzi

相關問題