当我尝试将请求的数据保存到api时,我的代码返回Code=3840 "Garbage at end."
……JSON返回是符合jsonlint的有效JSON (已通过Postman测试) :
{
"error": 0,
"message": "transaction_completed"
}
这是我的代码:
func request(urle : url, parameters : Parameters, completion: @escaping (JSON) -> Void)
{
Alamofire.request(getUrl(urlw: urle), method: .post, parameters: parameters).responseJSON
{
response in
if response.data != nil {
do{
let json = try JSON(data: response.data!)
completion(json)
}catch{
print(error)
}
}
}
}
这是我打电话给request function
的时候:
let parameters: Parameters=[
"key" : user.key,
"uid": user.id
]
api.request(urle: .buyStack, parameters: parameters) { json in
print(json)
}
请问我哪里出错了?感谢您的回复
答案 0 :(得分:1)
因此,显然您的JSON无效,它的末尾包含一些无效值。
第一件事。为了保持逻辑,可以使用强制展开(使用!
),因为它是调试程序。我不确定该代码是否可以编译,这只是逻辑表示。
let responseString = String(data: response.data, encoding: .utf8)
print("responseString: \(responseString)")
这给出了:
{"error":1,"message":"Undefined APIKey"}[]
最后还有多余的[]
,因此它不是有效的JSON。您可以要求开发人员修复它。如果您确实做不到,或者想要继续进行开发,可以删除多余的[]
。
您可以选中this answer删除最后两个字符,然后:
let cleanResponseJSONString = //check the linked answer
let cleanResponseData = cleanResponseJSONString.data(encoding: .utf8)
let json = try JSON(data: cleanResponseData)
说明和调试思路是否更复杂:
我要求print("data: \(response.data as! NSData)")
,因为这会打印十六进制数据。您的问题可能是由于结尾处的不可见字符引起的。如果您不认识它们,至少可以根据先前的答案进行操作:
let jsonString = "{\"error\":1,\"message\":\"Undefined APIKey\"}" (that's almost reponseString)
let jsonData = jsonString.data(encoding: .utf8)
print("jsonData: \(jsonData as! NSData)")
比较一下结果。
调试器技巧,您可以使用诸如this one之类的答案将hexDataString转换为Data
并从中进行调试。我建议在前面添加一个空格,“ <”和“>”,以便您可以轻松地从调试器输出中复制/粘贴该空格。
为什么?如果要解决问题的时间很长(很多操作)(在应用程序中登录,执行某些操作等),则可以节省您在另一个应用程序(游乐场,AppDelegate的开头等)上调试它的时间。 )。
别忘了之后删除所有调试代码;)
与问题无关
if response.data != nil {
do {
let json = try JSON(data: response.data!)
...
} catch {
...
}
}
应该是:
if let data = response.data {
do {
let json = try JSON(data: data)
...
} catch {
...
}
}
使用if let
,guard let
进行包装,避免使用强制包装。