AFNetworking从响应中修剪角色 [英] AFNetworking Trim Characters From Response

查看:66
本文介绍了AFNetworking从响应中修剪角色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用AFNetworking使用基本身份验证来调用Web服务。问题是我得到

 失败:错误域= NSCocoaErrorDomain代码= 3840 JSON文本不是以数组或对象开头,并且允许未设置片段的选项。 UserInfo = {NSDebugDescription = JSON文本不是以数组或对象开头,并且没有允许设置片段的选项。} 

当我允许片段时,我得到

 字符0 
<周围的值无效/ pre>

我与我们的Web开发人员进行了交谈,无论出于何种原因,他都在JSON响应的前面加上 //,因此在使用JSON之前我需要对其进行修剪。我的问题是我不确定如何访问响应以对其进行修剪和使用,因为代码会立即转到故障块。

  let manager = AFHTTPSessionManager(baseURL:URL(string: http://mydev1.kyfb.com/remote/appinfo.cfc?method=GetMemberInfo))
manager.requestSerializer.setAuthorizationHeaderFieldWithUsername(emailTextField。 text !,密码:passwordTextField.text!)
// manager.responseSerializer = AFJSONResponseSerializer(readingOptions:.allowFragments)
// manager.responseSerializer = AFHTTPResponseSerializer()
manager.post( ,参数:nil,进度:nil,成功:{
(task,responseObject)->
中的虚空// TODO:如果JSON响应中返回错误消息,则显示错误
//否则登录成功。将用户信息保存到User对象,然后推送AccountTableViewController
print( RESPONSE OBJECT:\(response seObject!))
让responseJSON = responseObject为? [String:AnyObject]
print( RESPONSE JSON:\(responseJSON))
if responseJSON![ MEMBERSHIPNUMBER]!= nil {

}

},失败:{
(操作,错误)->
中的空// // TODO:显示错误
print( FAILURE:\(error))
})
}


解决方案

如果您将 responseSerializer 设置为 AFHTTPResponseSerializer 与: manager.responseSerializer = AFHTTPResponseSerializer(),然后 responseObject 应该是(NS)Data 对象。



操作:

// 的值(我们称之为 prefixData )。

检查是否 responseObject 在其前缀中。

如果需要,请将其删除。

  let prefixData = //。data(使用:.utf8)! 
// OR let prefixData = Data(bytes:[0x2F,0x2F])

let responsePrefix = responseObject.subdata(in:Range(0 ..< 2))
如果responsePrefix == prefixData {
let jsonData = responseObject.subdata(in:Range(2 ..< responseObject.count)))
//您将JSON序列化为Codable或JSONSerialization
}

使用强制拆包和静默尝试的示例代码(尝试?)(不要这样做),出于逻辑考虑:

  let prefixData = //。data(使用:.utf8)! 
print( PrefixData from String:\(prefixData as NSData))

let prefixData2 = Data(bytes:[0x2F,0x2F])
print( prefixData from字节:\(prefixData2 as NSData))

如果prefixData == prefixData2 {
print( prefixData == prefixData2,请使用所需的那个)
}

让responseObject = // {\ key\:\ value\}。data(使用:.utf8)!
print( responseObject:\(responseObject as NSData))

让responsePrefix = responseObject.subdata(in:Range(0 ..< 2))
if responsePrefix == prefixData {
let jsonData = responseObject.subdata(in:Range(2 ..< responseObject.count))
print( jsonData:\(jsonData as NSData))
let json =试试吗? JSONSerialization.jsonObject(with:jsonData,选项:[])
print( json:\(json!))
let jsonString = String(数据:jsonData,编码:.utf8)
print( jsonString:\(jsonString!))
}

输出:


$>来自字符串的前缀数据:< 2f2f>

$>来自字节的前缀数据:< 2f2f>

$> prefixData == prefixData2,使用您想要的那个

$> responseObject:< 2f2f7b22 6b657922 3a227661 6c756522 7d>

$> jsonData:< ; 7b226b65 79223a22 76616c75 65227d>

$> json:可选({

键=值;

})

$> jsonString :{ key: value}



I am using AFNetworking to call a web service using basic auth. The issue is that I get

FAILURE: Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

When I allow fragments, I get

Invalid value around character 0

I spoke with our web developer and he is prefixing the JSON response with '//' for whatever reason so I need to trim those before I can use the JSON. My issue is that I'm not sure how to access the response to trim it and use it since the code immediately goes to the failure block.

let manager = AFHTTPSessionManager(baseURL: URL(string: "http://mydev1.kyfb.com/remote/appinfo.cfc?method=GetMemberInfo"))
            manager.requestSerializer.setAuthorizationHeaderFieldWithUsername(emailTextField.text!, password: passwordTextField.text!)
            // manager.responseSerializer = AFJSONResponseSerializer(readingOptions: .allowFragments)
            // manager.responseSerializer = AFHTTPResponseSerializer()
            manager.post("", parameters: nil, progress: nil, success: {
                (task, responseObject) -> Void in
                // TODO: If error message returned in JSON response, display error
                // else login was successful. Save user info to User object and push AccountTableViewController
                print("RESPONSE OBJECT: \(responseObject!)")
                let responseJSON = responseObject as? [String: AnyObject]
                print("RESPONSE JSON: \(responseJSON)")
                if responseJSON!["MEMBERSHIPNUMBER"] != nil {

                }

            }, failure: {
                (operation, error) -> Void in
                // TODO: Display error
                print("FAILURE: \(error)")
            })
        }

解决方案

If the you set the responseSerializer as AFHTTPResponseSerializer with : manager.responseSerializer = AFHTTPResponseSerializer(), then responseObject should be a (NS)Data object.

What to do:
Get the value for "//" (let's call it prefixData).
Check if responseObject has it in prefix.
Remove if needed.

let prefixData = "//".data(using: .utf8)!        
//OR let prefixData = Data(bytes: [0x2F, 0x2F])

let responsePrefix = responseObject.subdata(in: Range(0..<2))
if responsePrefix == prefixData {
    let jsonData = responseObject.subdata(in: Range(2..<responseObject.count))
    //You got your JSON to serialize with Codable or JSONSerialization
}

Sample code with force unwrap and silent try (try?) (don't do that) for the sake of the logic:

let prefixData = "//".data(using: .utf8)!
print("prefixData from String: \(prefixData as NSData)")

let prefixData2 = Data(bytes: [0x2F, 0x2F])
print("prefixData from Bytes: \(prefixData2 as NSData)")

if prefixData == prefixData2 {
    print("prefixData == prefixData2, use the one you want")
}

let responseObject = "//{\"key\":\"value\"}".data(using: .utf8)!
print("responseObject: \(responseObject as NSData)")

let responsePrefix = responseObject.subdata(in: Range(0..<2))
if responsePrefix == prefixData {
    let jsonData = responseObject.subdata(in: Range(2..<responseObject.count))
    print("jsonData: \(jsonData as NSData)")
    let json = try? JSONSerialization.jsonObject(with: jsonData, options: [])
    print("json: \(json!)")
    let jsonString = String(data: jsonData, encoding: .utf8)
    print("jsonString: \(jsonString!)")
} 

Output:

$>prefixData from String: <2f2f>
$>prefixData from Bytes: <2f2f>
$>prefixData == prefixData2, use the one you want
$>responseObject: <2f2f7b22 6b657922 3a227661 6c756522 7d>
$>jsonData: <7b226b65 79223a22 76616c75 65227d>
$>json: Optional({
key = value;
})
$>jsonString: {"key":"value"}

这篇关于AFNetworking从响应中修剪角色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆