在不使用第三方库的情况下将NSData JSON对象发送到Web Service

时间:2012-08-17 20:15:52

标签: ios json web-services nsdata

我已经搜索过,在这里找不到这个:

我正在尝试将NSData对象发送到Web服务。 NSData对象是使用iOS 5内置JSON的JSON对象。

我需要执行异步发送,然后检查服务器的响应。

我不想使用任何第三方库。

以下是我已经做的不起作用:

NSDictionary * initialLogAsJSON = [NSDictionary dictionaryWithObjects:items forKeys:keys];

NSError * error;

NSData * jsonData = [NSJSONSerialization dataWithJSONObject:initialLogAsJSON options:NSJSONWritingPrettyPrinted error:&error];

NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:kURLSendTestStartedDataToTenOneServer ]];

[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"appliction/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [jsonData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody: jsonData];

[NSURLConnection sendAsynchronousRequest:request
                                   queue:self.queue
                       completionHandler:^( NSURLResponse * response, NSData * data, NSError * error )
                                        {
                                            NSLog( @"If finished with reponse = %@\nData: %@\nError %@", response, data, error );
                                            // do something useful
                                        }
];

2 个答案:

答案 0 :(得分:2)

两个问题:

1)你应该断言或记录该呼叫中的每个对象,这样你才知道什么都不是。

2)你这里有一个错字:

[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"appliction/json" forHTTPHeaderField:@"Content-Type"];

第二个应用程序缺少'a'

答案 1 :(得分:1)

实际上问题比...更容易。

由于源字符串中有一些有趣的转义字符,因此URL为零 -

这是我的最终(工作)实施:

NSDictionary * mainJSON = [NSDictionary dictionaryWithObjects:mainItems forKeys:mainKeys];

NSError * error;

NSData * jsonData = [NSJSONSerialization dataWithJSONObject:mainJSON options:NSJSONWritingPrettyPrinted error:&error];

NSString * jsonString = [[NSString alloc] initWithData:jsonData encoding:NSASCIIStringEncoding];

NSString * serverString = [NSString stringWithFormat:@"%@", kURLServer];

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

NSString * webStringURL = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURL * url = [NSURL URLWithString:webStringURL];

NSAssert( url != nil, @"URL nil - Check string values for URL to Server!" );

dispatch_async( kBackgroundQueue, ^
                                   {
                                       NSData * data = [NSData dataWithContentsOfURL:url];
                                                   [self performSelectorOnMainThread:@selector( receivedResponseFromServer: )
                                                                          withObject:data
                                                                       waitUntilDone:YES];
                                   }
               );