Swift中的HTTP请求和JSON解析

时间:2018-08-14 15:36:41

标签: json swift http dialogflow

因此,我正在尝试使用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没有下标成员”。

1 个答案:

答案 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的帮助!