如何保存来自我的服务器的响应,以及如何访问该数据

Posted

技术标签:

【中文标题】如何保存来自我的服务器的响应,以及如何访问该数据【英文标题】:How to save the response From My server , and How can i access That data 【发布时间】:2015-12-28 09:17:56 【问题描述】:

您好,我已成功收到来自服务器的响应。我需要访问服务器在我的应用程序中发送的 user_id。

检查我的代码:

 NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
        NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];



        NSURL * url = [NSURL URLWithString:@"my url"];
        NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:url];




        NSString * params=[[NSString alloc]initWithFormat:@"mobile=%@",[self.reqnum text ]];

        NSLog(@"%@",params);
        [urlRequest setHTTPMethod:@"POST"];
        [urlRequest setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]];

        NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest
                                                           completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
                                                               NSLog(@"Response:%@ %@\n", response, error);
                                                               if(error == nil)
                                                               
                                                                   NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];

                                                                     NSLog(@"Data = %@",text);



                                                                   [[NSUserDefaults standardUserDefaults]setObject:@"Y" forKey:@"login"];

                                                                   [[NSUserDefaults standardUserDefaults] synchronize];


                                                               


                                                           ];
        [dataTask resume];

对于这段代码,我得到如下响应:

在这里我需要访问我的应用程序中的 user_id。所以我可以获得那个特定的 user_id。

谢谢。

【问题讨论】:

为用户对象创建一个模型类。以字典形式转换响应,因为它是 JSON,而不是字符串。使用字典为类创建初始化方法。像使用普通类实例一样访问所需对象的所需属性。由于只有一个用户,因此将其设为单例类。然后用户属性将在您的应用程序中随处可用。这将是正确的做法。如需快速解决方案,请使用 ShahiM 的答案。 【参考方案1】:

由于已经发布了原始解决方案,我将专注于更长更乏味的方式,我认为这是处理房间里大象的正确方式。从长远来看,这将对您有所帮助。

创建一个 Singleton 类,因为一次只能有一个用户登录。

SharedUser.h

#import <Foundation/Foundation.h>
@interface SharedUser : NSObject

@property (strong, nonatomic) NSString* userId;
@property (strong, nonatomic) NSString* userName;
@property (strong, nonatomic) NSString* subscriptionStatus;
@property (strong, nonatomic) NSString* registerDate;
@property (strong, nonatomic) NSString* expiryDate;
+(SharedUser*) getInstance;

@end

SharedUser.m

#import "SharedUser.h"

@implementation SharedUser



static SharedUser * sharedInstance;



+(SharedUser*) getInstance

    @synchronized(self)
    
        if(sharedInstance == nil)
        

            sharedInstance = [[SharedUser alloc] init];
            sharedInstance.userName = @"";
            sharedInstance.userId = @"";
            sharedInstance.subscriptionStatus = @"";
            sharedInstance.registerDate = @"";
            sharedInstance.expiryDate = @"";
            return sharedInstance;
        
        else
        
            return  sharedInstance;
        

    

将您的回复转换为NSDictionary

NSDictionary *json_dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];;//From Santosh Reddy's Answer

使用结果属性填充您的 sharedInstance:

[SharedUser getInstance].userId = [json_dict objectForKey:@"user_id"];
[SharedUser getInstance].userName = [json_dict objectForKey:@"username"];
[SharedUser getInstance].subscriptionStatus = [json_dict objectForKey:@"subscription_status"];
[SharedUser getInstance].registryDate = [json_dict objectForKey:@"register_date"];//Better to use NSDate type instead of NSString
[SharedUser getInstance].expiryDate = [json_dict objectForKey:@"expiry_date"];

现在您的用户属性将在应用程序的任何位置可用。您只需将SharedUser.h 导入所需的UIViewUIViewController 并输入以下内容即可访问您的数据:

NSString *userId = [SharedUser getInstance].userId;

还要注意,我使用的是单例模式,因为我假设您只需要处理一个用户的属性,这些属性将在一段时间内用于多个视图控制器。如果您需要保存多个用户,请创建一个类似的用户模型类并以类似的方式填充它们。 (只是不要让他们单身)。

另外我建议您阅读 Ray Wenderlich 的系列教程:

1. Object Oriented Design 2. Design Patterns 3. Intro to ios design patterns

【讨论】:

感谢@NSNoob 的建议【参考方案2】:

如果你想在其他类中使用该值,那么:

首先创建一个数据模型类,解析数据字典/JSON并存储。 使用完成块,您可以将特定/收到的 user_id 返回给调用者。

这里你得到的是 JSON,你可以解析它并得到想要的数据:

NSDictionary *respDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
NSString *userID = respDict[@"user_id"];

【讨论】:

【参考方案3】:

响应是一个 JSON 对象。如果您要问的是如何解析它,那么 iOS 中有一个内置的 JSON 解析器。

NSDictionary *json_dict = [text JSONValue];
NSString *userID = [result objectForKey:@"user_id"];

【讨论】:

【参考方案4】:

创建一个 NSDictionary 来获取 json 数据。

   NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest
     completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
     NSLog(@"Response:%@ %@\n", response, error);
     if(error == nil)
             
      NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
      NSString *userID = [dictionary objectForKey:@"user_id"];


 ];

【讨论】:

【参考方案5】:

是的,由你决定如何存储数据,如果你想解析它,然后尝试

NSDictionary *jsonDict = [responseString JSONValue];
NSString *user_id = [jsonDict objectForKey:@"user_id"];

【讨论】:

【参考方案6】:

解析您在块中获取的数据,如下所示。

completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
     NSLog(@"Response:%@ %@\n", response, error);
     if(error == nil)
             
     NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
    NSDictionary *response = JSON[@"user_id"];


 ];

【讨论】:

【参考方案7】:

您可以创建一个 NSDictionary,在其中保存 JSON 数据并从中获取 user_id。像这样:

NSDictionary *dictionaryName=[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

NSString *user_id= [dictionaryName valueForKey:@"user_id"];

【讨论】:

不客气。如果您觉得答案有帮助,请投票。

以上是关于如何保存来自我的服务器的响应,以及如何访问该数据的主要内容,如果未能解决你的问题,请参考以下文章

如何让 FullCalendar 显示来自我的 JSON 提要的信息?

A电脑使用深信服的VPN客户端连接公司内网,其他电脑如何通过A电脑来访问公司内网?

服务响应超时,该如何排查?

如何在 android 中解析来自我的中间件的 Directions API 响应?

自制方法装饰器擦除所有元数据,我该如何解决?

将来自 API 的响应作为来自我的节点服务器的响应传递抛出