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

3

我曾多次使用GET方法,但在当前情况下,我需要使用POST方法来调用Web服务。我已经查阅了许多教程,但仍然无法实现。

路径为"http://vinipost.com/Services/Mobile_Application/wcfService.svc/logIn",参数为"id"和"pass",测试用的电子邮件地址是"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 = Server encountered error”的原因。


1
如果您能说明实际问题,那将非常有帮助。您无法发布吗?还是收到了错误信息?具体是什么错误? - Michael Dautermann
你遇到了什么错误?或者你还有其他问题吗?请告诉我们你卡在哪里了。 - Apoorv
请告诉我您在头部使用的Content-Type是什么? - Apoorv
@SakshiSingh 当您创建一个POST请求时,请求中有Header和Body。请咨询您的服务器团队并确认哪些参数在Header中,哪些参数在Request的Body中。 - Apoorv
直接使用NSURLConnection应该会更容易,需要了解 HTTP 的一些知识。在我看来,AFNetworking 只是在添加越来越多的抽象层,这并没有使实际任务变得更容易,反而可能更加混乱。可以使用命令行上的 curl 工具进行测试:curl -sSv -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d '<your JSON>' http://yourservice/url - CouchDeveloper
显示剩余5条评论
1个回答

1
我想详细解释一下我的评论,并可能提供一些提示,如何跟踪Web服务和API的潜在问题。
确保Web服务按预期工作。 您不需要Xcode-但是一个宝贵的命令行工具curl。 curl非常强大 - 它使您可以在命令行上非常简洁地执行HTTP请求,尽管它提供的许多选项可能看起来令人困惑。
(如果您需要有关curl的具体帮助,请参阅man页面和网络)。
因此,让我们尝试curl,启动您的Terminal应用程序,然后输入一个简单的GET命令,以测试curl是否工作:
$ curl -X GET http://example.com

请使用curl命令在控制台上从www.example.com返回http页面。

为了从curl获取帮助,请打开man页面:

$ man curl

你可以浏览内容。注意: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规则,我们确实应该发送Content-Type!适当的Content-Type是“application/json”-正如命令中指定的那样。当您的服务正在运行时,它应该返回“something”。我们甚至可以告诉我们首选的响应数据类型,比如说我们想要一个JSON响应体。为了告诉服务器,请包括一个适当的标头:“Accept: application/json”。我们甚至可以更加具体地说明字符编码:“Accept: 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的输出美化并打印到控制台上。
现在,一旦您验证了Web服务正在运行,将curl命令映射到相应的NSURLConnection请求就非常简单了。
您应该使用NSJSONSerialization从字典创建JSON,并将其序列化为JSON(文本)的NSData对象。
设置一个NSMutableRequest对象如下:
像上面那样设置标题“Content-Type”和“Accept”。将HTTPBody属性分配给JSON数据(UTF-8编码)。设置URL和方法“POST”。
开始连接。
最后一步取决于您可以使用NSURLConnection中方便的方法,例如sendAsynchronousRequest:queue:completionHandler: - 或使用委托方法,或使用第三方库等。

@couchDeveloper- 那么问题的解决方案是什么呢?是服务器端出了问题吗? - Sakshi Singh
你应该测试是否存在问题。你的Web服务是否按照HTTP(以及可能的REST)规则正常工作?例如,对于GET请求,它是否返回状态码200(OK),并且Content-Type(用于正文数据)为“application/json”?未经身份验证时是否返回401?错误响应是否为JSON格式?当服务器按预期工作时,在你的代码中正确设置请求,并从你的网络代码中尝试。但是,不要传递一些基础对象,让AFN将其解释为JSON,而是自己创建JSON并将其作为POST数据发送。 - CouchDeveloper
@CouchDeveloper- 你能测试一下这个Web服务是否正常运行吗? - Sakshi Singh
@SakshiSingh 尝试使用 $ curl -sSv -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d '{"id":shail@gmail.com,"pass":"shail"}' http://vinipost.com/Services/Mobile_Application/wcfService.svc/logIn,返回结果为:* upload completely sent off: 37 out of 37 bytes < HTTP/1.1 405 Method Not Allowed < Allow: GET < Content-Length: 1565 < Content-Type: text/html; charset=UTF-8 < Server: Microsoft-IIS/7.5 < X-Powered-By: ASP.NET < Date: Thu, 05 Sep 2013 05:41:34 GMT < - CouchDeveloper
这意味着,在指定的URL中,给定的资源不允许使用"POST"方法 - 只允许使用"GET"方法。您应该查阅文档,了解如何进行身份验证。通常,您尝试使用普通请求没有凭据或授权标头连接。如果资源需要身份验证,则服务器会发送状态代码401,其中包含指定"挑战"(例如授权方法)的授权标头。NSURLConnection可以很好地处理它。可能要实现connection:willSendRequestForAuthenticationChallenge委托方法。 - CouchDeveloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接