2017-08-24 257 views
0

我已經使用POST方法在我的應用程序中調用帶有標題值和參數正文的API。 服務器只接受格式objective-c HTTP POST發送請求,格式爲

"form": { 
     "action" : "login", 
     "user" : "311" 
}, 

當我們使用代碼

NSString *urlString = [NSString stringWithFormat:@"%@", url_string]; 

NSURL *url = [NSURL URLWithString:urlString]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
NSError *error; 

NSDictionary *parameters = @{@"action": @"login", @"user": @"311"}; 
NSString *params = [self makeParamtersString:parameters withEncoding:NSUTF8StringEncoding]; 
NSData *jsonData2 = [params dataUsingEncoding:NSUTF8StringEncoding]; 

[request setHTTPMethod:@"POST"]; 
     [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody: jsonData2]; 
     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:ourBlock]; 

我的形式看起來像這樣

form = { 
     action = login; 
     user = 311; 
}; 

你能出示你想要的結果的形式? 你能幫我解決這個問題嗎?

回答

0

如何更改這樣的參數。

NSDictionary *parameters = @{@"form":@{@"action": @"login", @"user": @"311"}}; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parameters options:NSJSONWritingPrettyPrinted error:nil]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody: jsonData]; 
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:ourBlock]; 
+0

然後,我有錯誤例外: - [__ NSDictionaryI stringValue的]:無法識別的選擇發送到實例 – Albert

+0

看來你的服務器需要JSON格式的身體。如果是這樣,請嘗試更新的答案。 – ZHZ

0

試試這個

NSURL * url = [NSURL URLWithString:@"%@",url_string]; 

NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration]; 

NSURLSession * session = [NSURLSession sessionWithConfiguration:config]; 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 

request.HTTPMethod = @"POST"; 

NSDictionary * paramters = [NSDictionary dictionaryWithObjectsAndKeys:@"login",@"action",@"311",@"user", nil]; // [NSDictionary dictionaryWithObjectsAndKeys:@"value",@"key", nil]; 


NSDictionary *params = @{@"form": paramters}; 
NSError *err = nil; 
NSData *jsonData2 = [NSJSONSerialization dataWithJSONObject:params options:0 error:&err]; 
+0

然後我的請求:form = { 「{\」action \「:\」login \「,\」user \「:\」311 \「}」=「」; }; – Albert

+0

@Albert,我已經更新了答案。請檢查並讓我知道。 – Yuyutsu

+0

現在的請求是:form = { 「{\」form \「:{\」action \「:\」login \「,\」user \「:\」311 \「}}」=「」; }; – Albert

0

嘗試

NSString *urlString = [NSString stringWithFormat:@"%@", url_string]; 

NSURL *url = [NSURL URLWithString:urlString]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
NSError *error; 

NSDictionary *parameters = @{@"action": @"login", @"user": @"311"}; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject: parameters options:0 error:&error]; 

[request setHTTPMethod:@"POST"]; 
     [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody: jsonData]; 
     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:ourBlock]; 
0
NSError *error; 
NSDictionary *parameters = @{@"form": @{@"action": @"login", @"user": @"311"}}; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parameters 
     options:NSJSONWritingPrettyPrinted error:&error]; 
request.HTTPBody = jsonData 

//Using NSURLSession is better option than using NSURLConnection 
NSURLSession *session = [NSURLSession sharedSession]; 
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
    NSHTTPURLResponse* respHttp = (NSHTTPURLResponse*) response; 

    if (!error && respHttp.statusCode == 200) { 

    NSDictionary* respondData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error]; 
    NSLog(@"%@", respondData); 

    } else{ 
    NSLog(@"%@", error); 
    } 
}]; 

[dataTask resume]; 
+0

我的結果表格= { 「{\ n \」action \「:\」login \「,\ n \」user \「:\」311 \「\ n}」=「」; }; – Albert

+0

更新預期字典格式,現在就試試 – suhit

0

試試這個,如果你需要編碼

NSMutableDictionary *param = [@{@"form":@{@"action": @"login", @"user": @"311"}} mutableCopy]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:serviceURL]; 
NSString *strEncoded = [self encodeParameters:param]; 
NSData *requestData = [strEncoded dataUsingEncoding:NSUTF8StringEncoding]; 
[request setHTTPBody:requestData]; 
[request setValue:[NSString stringWithFormat:@"%lu",(unsigned long)requestData.length] forHTTPHeaderField:@"Content-Length"]; 

[request setHTTPMethod:@"POST"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 


// Function encodeParameters 

+(NSString *)encodeParameters:(NSDictionary *)dictEncode 
{ 
// Encode character set as per BASE64 
NSCharacterSet *URLBase64CharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"/+=\n"] invertedSet]; 

NSMutableString *stringEncode = [[NSMutableString alloc] init]; 
NSArray *allKeys = [dictEncode allKeys]; 
for (int i = 0;i < allKeys.count; i++) { 
    NSString *key = [allKeys objectAtIndex:i]; 
    if([dictEncode valueForKey:key]) 
    { 
     [stringEncode appendFormat:@"%@=%@",key,[[dictEncode valueForKey:key] stringByAddingPercentEncodingWithAllowedCharacters:URLBase64CharacterSet]]; 
    } 

    if([allKeys count] > i+1) 
    { 
     [stringEncode appendString:@"&"]; 
    } 
} 

return stringEncode; 
} 
0

嘗試的base64對此,

NSString *parameters = @"\"form\":{\"action\" : \"login\", \"user\" : \"311\"}"; 
NSData *jsonData2 = [parameters dataUsingEncoding:NSUTF8StringEncoding]; 

[request setHTTPMethod:@"POST"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody: jsonData2]; 
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:ourBlock]; 
0

嘗試AFNetwoking

NSString *urlString = [NSString stringWithFormat:@"URL"]; 
    NSDictionary *para= @{@"action": @"login", @"user": @"311"}; 
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 

    [manager POST:urlString parameters:para success:^(AFHTTPRequestOperation *operation, id responseObject) { 
         NSLog(@"JSON: %@", responseObject); 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 

    }];