Google搜索与Alamofire失败(iOS,Swift,JSON,HTML)
请帮忙! 我坚持了几个月,现在试图在我的Swift应用上执行一个简单的Google搜索 ,而我正在通过粉碎我的头穿过墙!
我已经尝试了ALAMOFIRE和Regular URLRequest,但是由于结果似乎只有HTML格式,我似乎无法正确解析结果。 即使您查看HTML格式,代码也适用于网页,并且不包含搜索结果。
我很乐意将搜索结果转换为简单字典。 这是我的代码:
let googleUrl:String = "https://cse.google.com/cse/publicurl?&output=json&cx=<MyGoogleKey>:<MyGoogleSKey>&q=q=+normal+search"
// Trying with AlamoFire:
Alamofire.request(googleUrl).response { response in
print("Request: (response.request)")
print("Response: (response.response)")
print("Error: (response.error)")
}.responseJSON(completionHandler: { response in
print("ResponseJSON: (response)")
}).responseData(completionHandler: { response in
print("ResponseData: (response)")
}).responseString(completionHandler: { response in
print("ResponseString: (response)")
})
正如你看到我几乎在所有Alamofire支持的类型中尝试响应,而我几乎没有。
这里是错误#1( 。responseJSON ):
数据无法被读取,因为它的格式不正确。 ResponseJSON:FAILURE:responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain = NSCocoaErrorDomain Code = 3840“Invalid value around the character 0”。UserInfo = {NSDebugDescription =字符0周围的值无效}))
下面是数据响应(responseData):ResponseData:成功:4337个字节
这里是响应HTML( 。responseString )
ResponseString:SUCCESS:
*> Google自定义搜索
(function(){var cookie_path ='/ cse /'; var path_copy ='/ coop /'; window._gaq = window._ga ...._ AND_SO_ON_TILL_FULL_HTML_PAGE_IN_A_STRING .... *
*我只希望我可以在一个简单的字典中搜索结果...
任何人? 请?
您似乎正在使用自定义搜索API来嵌入到网页中。
这份文档是为了你想要做的。
以下是使用堆栈溢出作为搜索域的示例。
import UIKit
import Alamofire
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
search(query: "swift") { (results) in
for result in results {
dump(result)
}
}
}
func search(query:String, completion: @escaping (Array<SearchResult>)->()){
let id = "Custom search engine ID"
let key = "API key"
let url = "https://www.googleapis.com/customsearch/v1?key=(key)&cx=(id)&q=(query)"
Alamofire.request(url).responseJSON { (response) in
var results = Array<SearchResult>()
if let dict = response.value as? Dictionary<String,Any> {
if let items = dict["items"] as? Array<Dictionary<String,Any>> {
for item in items {
if let result = SearchResult(dict: item) {
results.append(result)
} else {
print("Incomplete search result data.")
}
}
}
}
completion(results)
}
}
}
我有这个结构来更好地存储搜索结果。 它不包含JSON结果所做的所有值。 我只是选择了这些进行测试。
struct SearchResult {
var displayLink: String
var formattedUrl: String
var htmlFormattedUrl: String
var htmlSnippet: String
var htmlTitle: String
var link: String
var snippet: String
var title: String
init?(dict:Dictionary<String,Any>) {
guard
let displayLink = dict["displayLink"] as? String,
let formattedUrl = dict["formattedUrl"] as? String,
let htmlFormattedUrl = dict["htmlFormattedUrl"] as? String,
let htmlSnippet = dict["htmlSnippet"] as? String,
let htmlTitle = dict["htmlTitle"] as? String,
let link = dict["link"] as? String,
let snippet = dict["snippet"] as? String,
let title = dict["title"] as? String
else {
return nil
}
self.displayLink = displayLink
self.formattedUrl = formattedUrl
self.htmlFormattedUrl = htmlFormattedUrl
self.htmlSnippet = htmlSnippet
self.htmlTitle = htmlTitle
self.link = link
self.snippet = snippet
self.title = title
}
}
这是dump(result)
打印出来的一对结果。
▿ CustomGoogleSearch.SearchResult
- displayLink: "stackoverflow.com"
- formattedUrl: "https://stackoverflow.com/questions/tagged/swift"
- htmlFormattedUrl: "https://stackoverflow.com/questions/tagged/<b>swift</b>"
- htmlSnippet: "<b>Swift</b> is an open-source programming language developed by Apple. Use the tag <br>nonly for questions about language features, or requiring code in <b>Swift</b>. Use the ..."
- htmlTitle: "Newest '<b>swift</b>' Questions - Stack Overflow"
- link: "https://stackoverflow.com/questions/tagged/swift"
- snippet: "Swift is an open-source programming language developed by Apple. Use the tag nonly for questions about language features, or requiring code in Swift. Use the ..."
- title: "Newest 'swift' Questions - Stack Overflow"
▿ CustomGoogleSearch.SearchResult
- displayLink: "stackoverflow.com"
- formattedUrl: "stackoverflow.com/documentation/swift/topics"
- htmlFormattedUrl: "stackoverflow.com/documentation/<b>swift</b>/topics"
- htmlSnippet: "58 example-focused documentation topics for <b>Swift</b> Language."
- htmlTitle: "All <b>Swift</b> Language Topics - Stack Overflow"
- link: "http://stackoverflow.com/documentation/swift/topics"
- snippet: "58 example-focused documentation topics for Swift Language."
- title: "All Swift Language Topics - Stack Overflow"
获得钥匙
在此页面上,单击Get A Key
按钮。
然后您需要选择或创建一个Google项目,然后您将生成一个API密钥。 因此,复制这个放在这里let key = "API key"
对于搜索引擎ID,请转到您的控制台。 现在选择一个搜索引擎或创建一个新的搜索引擎。 你会看到像这样的页面。
点击Search engine ID
按钮,这将显示一个你的ID屏幕,然后把这里let id = "Custom search engine ID"
上一篇: Google Search with Alamofire Fails (iOS, Swift, JSON, HTML)