【问题标题】:(Cocoa error 3840.)" (Invalid value around character 0.) AFNetworking(Cocoa 错误 3840。)”(字符 0 周围的值无效。)AFNetworking
【发布时间】:2014-11-17 03:07:46
【问题描述】:

使用 GET 方法从服务器检索文件时出现以下错误:

Error: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid value around character 0.) UserInfo=0x16e81ed0 {NSDebugDescription=Invalid value around character 0.}

我尝试了许多不同的方法,我相信这可能与我试图获取的文件中的 JSON 格式有关。

这是我一直在使用的代码:

_username = @"JonDoe";
NSDictionary *parameters = @{ @"username" : _username};
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];

[manager GET:@"http://.........."
  parameters:parameters
     success:^(AFHTTPRequestOperation *operation, id responseObject) {
         NSLog(@"JSON: %@", responseObject);
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         NSLog(@"Error: %@", error);
     }];

我的 POST 方法运行良好。我似乎无法用 GET 解决这个问题。有任何想法吗?谢谢。

【问题讨论】:

  • 如果没有看到实际的 GET 请求,或者至少是 _username 的值,我们可能无法帮助您。文档还说当无法解析响应时执行失败块,因此也要检查回复。
  • 好的,现在operation.response怎么样?
  • operation.responseSerializationError = 错误:摘要字符串解析错误
  • 不,我的意思是实际响应...cocoadocs.org/docsets/AFNetworking/1.3.1/Classes/…
  • 或任何可以获取实际 http 响应头+正文的方式。不太熟悉这个特定的 API。

标签: ios objective-c json cocoa-touch afnetworking-2


【解决方案1】:

从 cmets 中的讨论来看,您的 GET 请求似乎成功(响应代码 200),但响应正文不是有效的 JSON(也不是 JSON 片段),正如您使用 AFJSONResponseSerializer 所请求的那样。基本的AFHTTPResponseSerializer 可用于非 JSON 响应。

【讨论】:

  • 感谢您的帮助布拉德。我是 JSON 新手。如果我将文件作为 JSON 上传到 Apache 服务器,当我向 GET 发出请求时,它应该不是有效的 JSON,还是被服务器更改?
  • @Jonathan 我不确定你在问什么。您无法通过 GET 上传任何内容。您得到的错误是由于服务器 response 对您的 GET 请求,而不是您的 GET 请求本身。 GET 请求通常也不是 json。服务器的响应可以是任何东西。
  • 不,我的意思是我在使用 JSON 的情况下使用 POST 方法上传。因此,如果我使用 JSON 上传,我可以使用不同的序列化程序下载?
  • @Jonathan responseSerializer 应根据您期望从服务器获得的响应数据类型来选择。它与您发布的内容无关。
  • 我将它切换到 AFHTTPResponseSerializer 并且似乎正在工作。当我有机会时,我只需要测试它。谢谢布拉德。
【解决方案2】:

我很确定您有来自服务器的有效响应,但您的响应不是 JSON 中的有效格式,可能是因为您在第一个 { 前面有字符。 请尝试以下操作:在浏览器中手动输入相同的 URL 地址,您将在响应中看到罪魁祸首。希望对您有所帮助。

【讨论】:

    【解决方案3】:

    嘿,伙计们,这是我发现的问题:我通过一个函数调用 Alamofire 来验证用户:我使用了函数“登录用户”以及将从“正文”调用的参数(电子邮件:字符串, 密码: String) 那将被传递

    我的错误是:

    optional(alamofire.aferror.responseserializationfailed(alamofire.aferror.responseserializationfailurereason.jsonserializationfailed(error domain=nscocoaerrordomain code=3840 "invalid value around character 0." userinfo={nsdebugdescription=invalid value around character 0

    字符0是这里的关键:意味着“电子邮件”的调用与参数不匹配:见下面的代码

    func loginUser(email: String, password: String, 完成: @escaping downloadComplete) { 让 lowerCasedEmail = email.lowercased()

        let header = [
            "Content-Type" : "application/json; charset=utf-8"
        ]
        let body: [String: Any] = [
            "email": lowerCasedEmail,
            "password": password
        ]
    
        Alamofire.request(LOGIN_USER, method: .post, parameters: body, encoding: JSONEncoding.default, headers: header).responseJSON { (response) in
            if response.result.error == nil {
    
                if let data = response.result.value as? Dictionary<String, AnyObject> {
                    if let email = data["user"] as? String {
                        self.userEmail = email
                        print(self.userEmail)
                    }
                    if let token = data["token"] as? String {
                        self.token_Key = token
                        print(self.token_Key)
                    }
    

    函数参数中的“email”在解析时必须与let“email”匹配,然后它才能工作..我不再收到错误......并且字符0是Alamofire的“body”参数中的“email”请求:

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2013-12-18
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 2018-06-17
      相关资源
      最近更新 更多