美文网首页
iOS中遇到后台返回数据中带有\r、\n等特殊字符时

iOS中遇到后台返回数据中带有\r、\n等特殊字符时

作者: 康_3eab | 来源:发表于2019-06-11 17:42 被阅读0次

后台传输的数据中一旦带有\r、\n等特殊字符时AFNetWorking会出现无法解析的情况,那么怎么办呢,我们就可以采用修改af框架的做法来对特殊字符进行转码过滤。

- (id)responseObjectForResponse:(NSURLResponse*)response

                           data:(NSData*)data

                          error:(NSError*__autoreleasing*)error

{

    if(![selfvalidateResponse:(NSHTTPURLResponse*)responsedata:dataerror:error]) {

        if (!error || AFErrorOrUnderlyingErrorHasCodeInDomain(*error, NSURLErrorCannotDecodeContentData, AFURLResponseSerializationErrorDomain)) {

            returnnil;

        }

    }

    // Workaround for behavior of Rails to return a single space for `head :ok` (a workaround for a bug in Safari), which is not interpreted as valid input by NSJSONSerialization.

    // See https://github.com/rails/rails/issues/1742

    NSStringEncodingstringEncoding =self.stringEncoding;

    if(response.textEncodingName) {

        CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)response.textEncodingName);

        if (encoding != kCFStringEncodingInvalidId) {

            stringEncoding =CFStringConvertEncodingToNSStringEncoding(encoding);

        }

    }

    idresponseObject =nil;

    NSError*serializationError =nil;

    @autoreleasepool {

        NSString*responseString = [[NSStringalloc]initWithData:dataencoding:stringEncoding];

        if(responseString && ![responseStringisEqualToString:@" "]) {

            // Workaround for a bug in NSJSONSerialization when Unicode character escape codes are used instead of the actual character

            // See http://stackoverflow.com/a/12843465/157142

            data = [responseStringdataUsingEncoding:NSUTF8StringEncoding];

            if(data) {

                if([datalength] >0) {

                    responseObject = [NSJSONSerializationJSONObjectWithData:dataoptions:self.readingOptionserror:&serializationError];

                    if(responseObject ==nil) {

                        //将字符串的特殊字符都屏蔽

                        NSCharacterSet *controlChars = [NSCharacterSet controlCharacterSet];

                        NSRangerange = [responseStringrangeOfCharacterFromSet:controlChars];

                        if(range.location!=NSNotFound)

                        {

                            NSMutableString*mutable = [NSMutableStringstringWithString:responseString];

                            while(range.location!=NSNotFound)

                            {

                                [mutabledeleteCharactersInRange:range];

                                range = [mutablerangeOfCharacterFromSet:controlChars];

                            }

                            responseString = mutable;

                        }

                        data = [responseStringdataUsingEncoding:NSUTF8StringEncoding];

                        responseObject = [NSJSONSerializationJSONObjectWithData:dataoptions:self.readingOptionserror:&serializationError];

                        if(responseObject !=nil) {

                            error =nil;

                        }

                        //将字符串的特殊字符都屏蔽

#ifdef DEBUG

                        //                        dispatch_async( dispatch_get_main_queue(), ^{

                        //                            [Utility showTitle:responseString];//updataby lv

                        //                        });

#endif

                    }

                }else{

                    returnnil;

                }

            }else{

                NSDictionary*userInfo =@{

                                           NSLocalizedDescriptionKey: NSLocalizedStringFromTable(@"Data failed decoding as a UTF-8 string", @"AFNetworking", nil),

                                           NSLocalizedFailureReasonErrorKey: [NSStringstringWithFormat:NSLocalizedStringFromTable(@"Could not decode string: %@",@"AFNetworking",nil), responseString]

                                           };

                serializationError = [NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:userInfo];

            }

        }

    }

    if(self.removesKeysWithNullValues&& responseObject) {

        responseObject =AFJSONObjectByRemovingKeysWithNullValues(responseObject,self.readingOptions);

    }

    if(error) {

        *error =AFErrorWithUnderlyingError(serializationError, *error);

    }

    returnresponseObject;

}

相关文章

网友评论

      本文标题:iOS中遇到后台返回数据中带有\r、\n等特殊字符时

      本文链接:https://www.haomeiwen.com/subject/ckqcfctx.html