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&nbsp;..."
  - htmlTitle: "Newest &#39;<b>swift</b>&#39; 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按钮。

获取API密钥按钮

然后您需要选择或创建一个Google项目,然后您将生成一个API密钥。 因此,复制这个放在这里let key = "API key"

对于搜索引擎ID,请转到您的控制台。 现在选择一个搜索引擎或创建一个新的搜索引擎。 你会看到像这样的页面。

Google自定义搜索引擎设置页面

点击Search engine ID按钮,这将显示一个你的ID屏幕,然后把这里let id = "Custom search engine ID"

链接地址: http://www.djcxy.com/p/96233.html

上一篇: Google Search with Alamofire Fails (iOS, Swift, JSON, HTML)

下一篇: Keyboard breaks layout in UICollectionViewController