我正在使用AlamoFire对Google Cloud Prediction中的其中一个模型进行POST查询。每当我发送请求时,我都会返回一条错误消息:该API不支持解析表单编码的输入。
经过一番研究,我发现需要将Content-Type HTTP标头设置为“ application / json”。希望您能找到我提出要求时错过的东西。这是我的代码:
let parameters = [
"access_token" : accessToken,
"input": [
"csvInstance": [
"This is very positive"
]
]
]
Alamofire.Manager.sharedInstance.session.configuration
.HTTPAdditionalHeaders?.updateValue("application/json",
forKey: "Accept")
Alamofire.Manager.sharedInstance.session.configuration
.HTTPAdditionalHeaders?.updateValue("application/json",
forKey: "Content-Type")
Alamofire.request(.POST, "https://www.googleapis.com/prediction/v1.6/projects/mailanalysis-1378/trainedmodels/10kTweetData/predict", parameters: parameters).responseJSON { (response) in
if let JSON = response.result.value {
print("JSON: \(JSON)")
//print("refresh token = " + auth.accessToken)
}
}
最佳答案
万一有人还在寻找答案,我设法在没有Alamofire的情况下从我的iOS客户端访问GooglePredictionAPI:
var accessToken: String?
GIDSignIn.sharedInstance().currentUser.authentication.getTokensWithHandler { (authentication, error) in
if let err = error {
print(err)
} else {
if let auth = authentication {
accessToken = auth.accessToken
}
}
}
if let accTok = accessToken {
let parameters = [
"input": [
"csvInstance": [
0.9,
0.14,
-0.41,
1.61,
-1.67,
1.57,
-0.14,
1.15,
0.26,
-1.52,
-1.57,
3.65
]
]
]
let url = NSURL(string: "https://www.googleapis.com/prediction/v1.6/projects/ExermotePredictionAPI/trainedmodels/getExercise/predict")
let session = URLSession.shared
let request = NSMutableURLRequest(url: url! as URL)
request.httpMethod = "POST" //set http method as POST
do {
request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
} catch let error {
print(error.localizedDescription)
}
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.addValue("Bearer \(accTok)", forHTTPHeaderField: "Authorization")
let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
guard error == nil else {
return
}
guard let data = data else {
return
}
do {
if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: AnyObject] {
print(json)
}
} catch let error {
print(error.localizedDescription)
}
})
task.resume()
}