如何使用AFnetworking或NSJsonserialization发布json数据

时间:2013-09-02 11:43:27

标签: ios json post afnetworking nsjsonserialization

我已经使用了很多次GET。但在目前的情况下,我必须使用POST方法使用webService。我已经完成了许多教程但无法做到。 路径为“http://vinipost.com/Services/Mobile_Application/wcfService.svc/logIn”,参数为“id”,“传递”用于测试的电子邮件ID为“shail@gmail.com”,密码为“shail”

    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://vinipost.com/Services/Mobile_Application/wcfService.svc/logIn"]];
    [httpClient setParameterEncoding:AFFormURLParameterEncoding];
    NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:@"http://vinipost.com/Services/Mobile_Application/wcfService.svc/logIn" parameters:@{@"id":@"shail@gmail.com",@"pass":@"shail"}];

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        self.movies = [JSON objectForKey:@"logInResult"];
         NSLog(@"=========%@",self.movies); 
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);

}];
[operation start];

输出

=========(
        {
        msg = "Server encountered error";
    }
)

服务器端的人说它进入catch块这就是为什么它打印“msg =服务器遇到错误”

1 个答案:

答案 0 :(得分:1)

我想详细说明我的评论,并可能提供一些提示,以便如何跟踪Web服务和API的可能问题。

确保Web服务按预期工作。您不需要Xcode - 而是一个非常宝贵的命令行工具curlcurl功能强大 - 它允许您在命令行上以非常简洁的方式执行HTTP请求,尽管它提供的许多选项可能看起来令人困惑。

(如果您需要有关卷曲的具体帮助,请参阅手册页和网页。)

所以,让我们尝试curl,启动你的终端应用程序,然后输入一个简单的GET命令来测试curl是否正常工作:

$ curl -X GET http://example.com

curl应该从控制台上的www.example.com返回一个http页面。

要获得curl的帮助,请打开手册页:

$ man curl

您可以浏览内容。注意:卷曲很复杂 - 不复杂。不要不堪重负 - 从基础开始:

上述问题的以下POST请求比简单的GET更详细。我们想要POST一个JSON ..首先我们需要我们的JSON:

{“id”:“shail。@ gmail.com”,“pass”:“shail”}

现在输入命令行:

$ curl -X POST -H "Content-Type: application/json" -d '{"id": "shail.@gmail.com", "pass": "shail"}' "http://vinipost.com/Services/Mobile_Application/wcfService.svc/logIn"

注意:发送JSON时,我们应该通知服务器有关Content-Type的信息。根据HTTP规则,我们真的应该,只是意味着:DO发送内容类型!

适当的Content-Type是“application / json” - 正如在命令中指定的那样。

当您的服务正常运行时,它应该返回“某事”。我们甚至可以告诉我们首选的响应数据,比如说我们想要一个JSON的响应体。要告诉服务器,请包含适当的标头:

“接受:application / json”

我们可以更加具体地说明字符编码:

“接受:application / json; charset = utf-8”

你需要对语法挑剔!

现在,我们期望的是UTF-8中的JSON响应

$ curl -X POST -H "Content-Type: application/json" -H "Accept: application/json; charset=utf-8" -d '{"id": "shail.@gmail.com", "pass": "shail"}' "http://vinipost.com/Services/Mobile_Application/wcfService.svc/logIn" 

响应可能会打印到控制台 - 但不是很漂亮。

这是一个解决方案:

$ <curl command> | python -m json.tool

更好:

$ curl -sSv <other commands>  | python -m json.tool

现在,我们使用强大的管道命令(|)来调用第二个工具(python),它启动一个python程序,该程序从curl获取输出并将JSON打印到控制台。

现在,一旦您确认Web服务正在运行,将curl命令映射到相应的NSURLConnection请求就不那么简单了。

您应该使用NSJSONSerialization从字典创建JSON并将其序列化为NSData对象为JSON(文本)。

设置NSMutableRequest对象,如下所示:

如上所述设置标题“Content-Type”和“Accept”。为HTTPBody属性分配JSON数据(UTF-8编码)。设置URL和方法“POST”。

开始连接。

最后一步取决于。您可以使用NSURLConnection中的方便方法,例如sendAsynchronousRequest:queue:completionHandler: - 或使用委托方法,或使用第三方库等。