使用AFNetworking将对象发布到ASP.NET Web API

时间:2014-03-07 18:16:14

标签: asp.net-web-api http-post afnetworking

问题很简单,但我看到实施相当尴尬!!

我想发布一个对象,例如Web api Web服务的设备对象

// Initialize Client
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://rezawebapi.com"]];
//Indicationg this device is online and sending its dEVICE token to the server
Device *device = [Device new];
device.DeviceToken = [[NSUserDefaults standardUserDefaults] objectForKey:@"devicetoken"];
device.IsOnline = @"True";
//updating current active users of this app in the server
NSDictionary *dictionary = [[NSDictionary alloc]initWithObjectsAndKeys:
                            device.DeviceToken,@"DeviceToken",
                            device.IsOnline,@"IsOnline",
                            nil];


client.parameterEncoding = AFJSONParameterEncoding;
[client postPath:@"/api/iosAppstats" parameters:dictionary success:^(AFHTTPRequestOperation *operation, id responseObject)
 {
     NSLog(@"%@", responseObject);
     // it crashes on the next line because responseObject is NSData

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

1-无论如何都要发送对象而不创建字典?(这很容易出错!)

2-当我的deviceToken为null时,它发送给服务器的对象为null。但是在这里考虑一个属性deviceToken为null,但其他属性有自己的值!有没有人有任何想法?

3-我已定义@property (assign, nonatomic) BOOL IsOnline;但是当它创建字典时EXEX-BAD-ACCESS上升!我该如何定义bool值? (我不得不将其定义为NSString。它不是一种批准的方式)

1 个答案:

答案 0 :(得分:1)

1。

  

无论如何都要发送对象而不创建字典?(这很容易出错!)

您的API需要JSON。 JSON只是字典,数组,字符串和数字。所以不行。但是,它不容易出错。只需确保只在您的字典中放入符合JSON的对象。请阅读the NSJSONSerialization Overview了解详情。

2

  

当我的deviceToken为null时,它发送给服务器的对象为null。但是在这里考虑一个属性deviceToken是null但其他属性有自己的值!有没有人有任何想法?

您可以有条件地添加deviceToken,如下所示:

NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
NSString *deviceToken = [[NSUserDefaults standardUserDefaults] objectForKey:@"devicetoken"];
if (deviceToken) {
    [dictionary setObject:deviceToken forKey:@"DeviceToken"];
}

3

  

我定义了@property(assign,nonatomic)BOOL IsOnline;但是当它创建字典EXEX-BAD-ACCESS上升!我该如何定义bool值? (我不得不将其定义为NSString。它不是一种批准的方式)

使用BOOL违反了我在#1中链接的NSJSONSerialization概述中的这条规则:

  

所有对象都是NSStringNSNumberNSArrayNSDictionaryNSNull的实例。

因此,如果您的属性是BOOL或其他简单数字类型,请将其包装在@()中以使其成为NSNumber:

[dictionary setObject:@(device.IsOnline) forKey:@"DeviceToken"];

这与:

相同
NSNumber *isOnlineNum = [NSNumber numberWithBool:device.isOnline];
[dictionary setObject:isOnlineNum forKey:@"DeviceToken"];