iOS 将 json 数据发布到 Web 服务并返回结果

Posted

技术标签:

【中文标题】iOS 将 json 数据发布到 Web 服务并返回结果【英文标题】:iOS post json data to web service and return result 【发布时间】:2014-07-14 07:55:18 【问题描述】:

我有 WCF Web 服务,它接受电子邮件地址,如果数据库中不存在该条目,则返回“True”,如果存在,则返回“False”。当我使用 fiddler 和 POST 数据进行服务时,它返回结果为预期,当我尝试从我的 iPad 应用程序发送请求时,它只会说“无效的 JSON 原语:电子邮件。”。

服务链接: http://www.unluapps.com/Service1.svc/CheckRejected

用于测试的 JSON:

"Email":"test@unluco.com"

ios代码:

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
   NSError *e = nil;
   NSDictionary *parameters = [NSJSONSerialization JSONObjectWithData: [[NSString stringWithFormat:@"\"Email\":\"%@\"",_TxtMail.text]  dataUsingEncoding:NSUTF8StringEncoding]
        options: NSJSONReadingMutableContainers
        error: &e
    ];

   [manager POST:@"http://www.unluapps.com/Service1.svc/CheckRejected" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) 
       // NSLog(@"JSON: %@", responseObject);

        _receivedData=responseObject;
        //NSLog(@"%@",[responseObject objectForKey:@"CheckifExistsResult"]);
        NSLog(@"%@",[responseObject objectForKey:@"CheckRejectedResult"]);
    
    failure:^(AFHTTPRequestOperation *operation, NSError *error) 
        NSLog(@"Error: %@", error);
    
    ]; 

【问题讨论】:

这个 url unluapps.com/Service1.svc/CheckRejected 没有得到响应。 404错误 我已经说过我在问题中使用 POST。 【参考方案1】:

AFHTTPRequestOperationManager 默认使用 AFHTTPRequestSerializer。添加

manager.requestSerializer = [AFJSONRequestSerializer new];

AFHTTPRequestOperationManager 初始化之后。

您还可以简化代码:

   AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
   manager.requestSerializer = [AFJSONRequestSerializer new];
   NSDictionary *parameters = @@"Email": _TxtMail.text;

   [manager POST:@"http://www.unluapps.com/Service1.svc/CheckRejected" parameters:parameters   success:^(AFHTTPRequestOperation *operation, id responseObject) 
       // NSLog(@"JSON: %@", responseObject);

        _receivedData=responseObject;
        //NSLog(@"%@",[responseObject objectForKey:@"CheckifExistsResult"]);
        NSLog(@"%@",[responseObject objectForKey:@"CheckRejectedResult"]);
    
    failure:^(AFHTTPRequestOperation *operation, NSError *error) 
        NSLog(@"Error: %@", error);
    
    ]; 

【讨论】:

状态码: 400, headers "Cache-Control" = private; “内容长度”= 11; “内容类型”=“文本/html”;日期 = "2014 年 7 月 14 日星期一 08:55:45 GMT";服务器 = "Microsoft-IIS/8.0"; “X-AspNet-版本”=“4.0.30319”; "X-Powered-By" = "ASP.NET"; , NSErrorFailingURLKey=unluapps.com/Service1.svc/CheckRejected, NSLocalizedDescription=请求失败:错误请求 (400) 如何将内容类型设置为文本 html 感谢您的帮助,我找到了解决方案。【参考方案2】:

希望这篇文章对你有帮助

您使用的是 AFHTTPRequestOperation 而不是 AFJSONRequestOperation。

你也可以直接使用AFHttpClient:

NSDictionary *parameter = @@"Email":self.email.text;
[httpClient setParameterEncoding:AFJSONParameterEncoding];
[httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];

[httpClient postPath:@"http://www.unluapps.com/Service1.svc/CheckRejected" parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject) 
    // Print the response body in text
    BOOL *success = [[responseObject objectForKey:@"success"] boolValue];
    NSLog(@"Response: %@",responseObject);
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    [self handleConnectionError:error];
];

我还建议使用 clientWithBaseURL: 方法创建一个仅创建一个 AFHTTPClient 实例。 另请阅读github.com/AFNetworking/AFNetworking 上的文档,它确实解释了如何正确使用 AFHTTPClient。看看 AFAppDotNetAPIClient 这将为您提供如何使用 AFHTTPClient 的一个很好的示例。

【讨论】:

构建失败:未知类型名称'AFJSONRequestOperation' 查看此链接github.com/AFNetworking/AFNetworking 它将帮助您从 1.0 更改为 2.0 感谢您的帮助,我找到了解决方案。【参考方案3】:

在我花了几个小时编写代码后,我找到了另一种方法,并且 Web 服务的链接区分大小写。我已经更改了代码,现在它可以工作了。如果您在服务器端使用微软产品,请注意不要犯我犯的错误。

代码:

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager POST:@"http://www.unluapps.com/Service1.svc/checkRejected"
       parameters:@@"email": _TxtMail.text
          success:^(AFHTTPRequestOperation *operation, id responseObject) 
           NSLog(@"%@",[responseObject objectForKey:@"CheckRejectedResult"]);

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

【讨论】:

以上是关于iOS 将 json 数据发布到 Web 服务并返回结果的主要内容,如果未能解决你的问题,请参考以下文章

将信息从 ios 应用程序保存到 Web 服务器 (POST JSON)

我将一些数据发送到 web 服务,它返回一些 JSON 作为 NSData。如何转换为字典?(iOS 4.3)

POST JSON 数据从 iOS 到 mssql 服务器 [关闭]

保护 iOS 到 Web 服务的通信

将 JSON 动态发布到 IOS 8 中的 URL 地址

将服务器端 MySQL 数据库传输到 iOS