"Cocoa错误3840"(字符0附近的无效值)AFNetworking。

29

当我使用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的问题。有什么想法吗?谢谢。


不,我的意思是实际的响应... http://cocoadocs.org/docsets/AFNetworking/1.3.1/Classes/AFHTTPRequestOperation.html#//api/name/response - Brad Allred
返回已翻译的文本:或者以任何方式获取实际的HTTP响应头+正文。对于这个特定的API,我不是很熟悉。 - Brad Allred
NSLog(@"error: %@", operation.responseString) 的输出为 --> error: p_large_jldr_475f00025cc22d0e.jpg - Jonathan
肯定不像是 JSON 格式,我猜这就是你的问题。换句话说,GET 请求成功了,但响应无法被解码为 JSON 格式(因为你使用了 AFJSONResponseSerializer)。 - Brad Allred
抱歉,这是您请求的错误信息: 错误:<NSHTTPURLResponse: 0x16588b40> { URL: http://69.91.198.44:8080/GeodatabaseServer/File?username=liubang } { 状态码:200,头部信息 { "Content-Length" = 33; Date = "Tue, 23 Sep 2014 03:58:18 GMT"; Server = "Apache-Coyote/1.1"; } } - Jonathan
显示剩余3条评论
3个回答

39

根据评论讨论,似乎您的GET请求成功了(响应代码为200),但是响应体不是有效的JSON(也不是JSON片段),而您要求使用AFJSONResponseSerializer进行请求。对于非JSON响应,可以使用基本的AFHTTPResponseSerializer


@Jonathan,我不确定你在问什么。你无法通过GET上传任何内容。你得到的错误是由服务器对你的GET请求的响应引起的,而不是你的GET请求本身。 GET请求通常也不是json格式的。服务器的响应可以是任何东西。 - Brad Allred
@Jonathan,“responseSerializer” 应该根据您从服务器期望的 响应 数据类型进行选择,与您发布的内容无关。 - Brad Allred
我已将其切换到AFHTTPResponseSerializer,看起来正在工作。 我只需要在有机会时进行测试。 谢谢Brad。 - Jonathan
你好,@Brad Allred,但我没有使用AFHTTPResponseSerializer来调用WebService,我正在使用默认的NSJsonSerialization。那么针对这个特定错误,该方法有什么变化?请尽快帮助我。 - Hiren kanetiya
@Hirenkanetiya 这就是问题所在,你不能使用 NSJsonSerialization 来处理非 JSON 格式的负载数据。这很简单。请使用 AFJSONResponseSerializer 或其他更合适的工具来代替。 - Brad Allred
显示剩余4条评论

3

我相信你从服务器得到了有效的响应,但是你的响应在JSON格式上不合法,可能是因为第一个 { 前面有字符。 请尝试手动在浏览器中输入相同的URL地址,你会在响应中看到罪魁祸首。希望这能帮到你。


-2

大家好,这是我发现的问题:我通过一个函数调用Alamofire来验证用户:我使用了函数“Login User”,并传递了从“body”中调用的参数(email: String, password: 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:这意味着对“email”的调用与参数不匹配:请参见下面的代码

func loginUser(email: String, password: String, completed: @escaping downloadComplete) { let 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”,这样才能正常工作。我不再遇到错误了。而且,对于Alamofire请求,“body”参数中的第一个字符是“email”。
希望这能有所帮助。

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