2017-03-16 16 views
0

Objective-cを使用してプログラミングしています。私はHTTP POST Methodを使ってリクエストしたい。私が送るパラメータは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

関連する問題