因此,我正在尝试使用XCode制作一个非常简单的watchOS应用。它由一个按钮,两个标签和两个标签之间的分隔符组成。这是一个数字助理应用程序,需要与Dialogflow(https://dialogflow.com)交互。
该按钮调用presentTextInputController
函数,我想将该结果用作对Dialogflow代理的查询。
我需要发出一个HTTP请求,在JS中看起来更像这样:
{
url:"https://api.api.ai/v1/query",
method:"post",
body:JSON.stringify({query:"userInput",lang:"en-US",sessionID:"yaydevdiner"}),
headers:{
contentType:"application/json; charset=utf-8",
Authorization:"Bearer <auth_token>"
}
}
响应是一个JSON对象,我需要使用字符串jsonObject["result"]["speech"]
来访问Label.setText()
值以使用print
我尝试过的所有方法都给出了有关Any类型和其他此类错误的信息。由于//HTTP Request
let parameters = [
"query":name![0] as? String,
"lang":"en-US",
"sessionID":"yaydevdiner"
];
//create the url with URL
let url = URL(string: "https://api.api.ai/v1/query")! //change the url
//create the session object
let session = URLSession.shared
//now create the URLRequest object using the url object
var request = URLRequest(url: url)
request.httpMethod = "POST" //set http method as POST
do {
request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) // pass dictionary to nsdata object and set it as request body
} catch let error {
print(error.localizedDescription)
}
request.addValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer f786fef55008491fb8422cea2be85eb1", forHTTPHeaderField: "Authorization")
//create dataTask using the session object to send data to the server
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 {
//create json object from data
if let json = try JSONSerialization.jsonObject (with: data, options: .mutableContainers) as? [String:Any] {
self.Response.setText(json["result"]["string"]);
}
} catch let error {
print(error.localizedDescription)
}
})
task.resume()
}
的输出未显示在XCode中,因此我也无法进行大量调试。
我必须提到,我是Swift的极端入门者,并且我不擅长处理它们的类型以及转换和解压缩之类的事情。
有人可以告诉我如何处理此请求以及JSON的后续处理吗?
这是我当前的代码:
Response
json["result"]
是文本标签。
这段代码给我一个错误,提示我应该在两个之间添加一个问号
["speech"]
和agent.split("|-|")
。当我这样做时,它给我另一个错误,提示“ Type Any没有下标成员”。
答案 0 :(得分:0)
好,我知道了。
因为XCode可以通过watchOS应用自动创建一个iOS应用,所以我决定尝试在iOS应用中进行调试,直到获得正确的HTTP请求和JSON解析为止。
在JSONSerialization if语句中,我不得不添加另一个if语句:
if let result = responseJSON["result"] as? [String:Any]{
self.Response.setText(result!["speech"] as? String ?? "Network error Occurred")
}
感谢vadian的帮助!