AFNetworking从响应中修剪角色 [英] AFNetworking Trim Characters From Response
问题描述
我正在使用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
asAFHTTPResponseSerializer
with :manager.responseSerializer = AFHTTPResponseSerializer()
, thenresponseObject
should be a(NS)Data
object.What to do:
Get the value for"//"
(let's call itprefixData
).
Check ifresponseObject
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屋!