【问题标题】:Posting JSON data using AFNetworking 2.0使用 AFNetworking 2.0 发布 JSON 数据
【发布时间】:2014-02-24 13:37:26
【问题描述】:

我有一个网络脚本,它通过 HTTP POST 请求接受 JSON 字符串作为输入。 我遇到了几个相同的 AFNetworking 1.x 示例,任何人都可以指点我或给 AFNetworking 2.0 示例以对带有格式 JSON 作为输入的 Web 脚本执行 HTTP POST 请求吗?

谢谢

【问题讨论】:

  • 阅读 AFNetworking github 页面上的迁移指南。
  • 问题是我是 AFNetworking 的新手,所以我不太了解并希望了解我来自 ASIHTTP 背景的以前版本,不过感谢您的建议。
  • cocoadocs.org/docsets/AFNetworking/2.1.0 上搜索 JSON 和 POST 你需要尝试一下然后寻求帮助...
  • @wain 我希望它是如此明显,即使是初学者也能理解

标签: ios json http-post afnetworking-2


【解决方案1】:

迅速:

将此添加到manager.AFHTTPRequestOperationManager

manager.requestSerializer = AFJSONRequestSerializer(writingOptions: NSJSONWritingOptions.PrettyPrinted)

【讨论】:

    【解决方案2】:

    如果要发布参数字典 json 字符串,请使用以下代码

    NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"your_webservice_post_url"]];
    [urlRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    NSError *error;
    NSDictionary *parameters = @{@"customValue":@"value"};
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parameters options:NSJSONWritingPrettyPrinted error:&error];
     [urlRequest setHTTPMethod:@"POST"];
     [urlRequest setHTTPBody:jsonData];
    

    【讨论】:

      【解决方案3】:

      这里是一些以 JSON 格式存储在 NSMutableDictionary 参数中的 POST 参数的简单模板。适用于 AFNetworking 2.4.1。

      NSString *baseURL = @"http://your-server.com/";
      NSString *path = @"method/url/";
      
      NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
      [parameters setObject:@"value" forKey:@"key"];
      
      AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL];
      manager.requestSerializer = [AFJSONRequestSerializer serializer];
      manager.responseSerializer = [AFJSONResponseSerializer serializer];
      
      [manager POST:path parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
      
              NSLog(@"JSON: %@", responseObject);
              //here is place for code executed in success case
      
      } failure:^(NSURLSessionDataTask *task, NSError *error) {
      
              //here is place for code executed in error case
              UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error while sending POST"
                                                                  message:@"Sorry, try again."
                                                                 delegate:nil
                                                        cancelButtonTitle:@"Ok"
                                                        otherButtonTitles:nil];
              [alertView show];
      
              NSLog(@"Error: %@", [error localizedDescription]);
      }];
      

      【讨论】:

      • 我不确定,但这不再有效。请检查此question
      • 我没有检查它是否有更新版本的 AFNetworking。当然它适用于 2.4.1 版本。
      【解决方案4】:

      如果你想将json发布到服务器,你应该在下面使用这种方式发布你的参数。

      使用这种方式,你可以发现你的请求头中的“Content-Type”是“application/json”。

      AFJSONRequestSerializer *serializer = [AFJSONRequestSerializer serializer];
      [serializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
      [serializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
      manager.requestSerializer = serializer;
      
       NSDictionary *paras = @{@"uid" : @(10020)};
      
      [manager POST:@"http://your.request.url" parameters:paras success:^(AFHTTPRequestOperation *operation, id responseObject) {
      
      
      
      }failure:^(AFHTTPRequestOperation *operation, NSError *error) {
      
          NSLog(@"the falire is %@", error);
      
      }];
      

      希望对您有所帮助。 :)

      【讨论】:

      • 成功了,谢谢。也请评价我的答案:)
      【解决方案5】:

      在搜索文档并尝试了一些代码后,我得到了以下示例

       AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
      manager.requestSerializer = [AFJSONRequestSerializer serializer];
      
      
      NSDictionary *params = @ {@"user" :txtUserName, @"pwd" :txtPwd };
      
      
      [manager POST:URL_SIGNIN parameters:params
      success:^(AFHTTPRequestOperation *operation, id responseObject)
      {
          NSLog(@"JSON: %@", responseObject);
      }
      failure:
       ^(AFHTTPRequestOperation *operation, NSError *error) {
           NSLog(@"Error: %@", error);
       }];
      

      另外不要忘记在服务器脚本中将响应头类型设置为 Application/json。

      【讨论】:

      • 这对我不起作用。我不断收到此错误状态代码:200, headers { Connection = close; “内容长度”= 59; “内容类型”=“文本/html;字符集=UTF-8”;日期 = "2014 年 4 月 21 日星期一 06:44:34 GMT";服务器 = "Apache/2.2.25 (亚马逊)"; "X-Powered-By" = "PHP/5.3.27"; } }, NSLocalizedDescription=请求失败:不可接受的内容类型:text/html}
      • @Nitesh 你忽略了我在答案中的最后一条语句 :) “另外不要忘记在服务器脚本中将响应头类型设置为 Application/json”
      • 如果您不能更改服务器脚本,您可以检查this answer,让 JSON 解析器接受“text/html”内容类型。
      • @mgarciaisaia 将响应类型设置为 text/html 并发送 JSON 是不好的做法,没有标准 API 这样做。
      • 这对我也不起作用。我收到“JSON 文本没有以数组或对象开头,并且允许未设置片段的选项。”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多