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)