You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS POST请求实现:发送完整问题并获取常见答案示例需求

解决思路与代码示例

首先,你的代码里有几个关键问题导致没拿到预期结果:

  • Google 搜索接口不支持用POST请求获取结果,它默认接受GET请求,而且需要把查询参数正确编码后拼在URL里
  • 直接请求google.com/search返回的是HTML网页,不是JSON数据,所以你用JSONSerialization解析肯定拿不到想要的Answer字段
  • 你没有对查询字符串做URL编码,直接把带空格的字符串传进去,这会导致请求格式错误

修正后的基础请求代码(GET方式)

先把请求改成正确的GET方式,并且自动处理参数编码:

import UIKit

@IBAction func GetAnswer(_ sender: Any) {
    // 1. 用URLComponents构建请求URL,自动处理参数编码(比如空格会转成%20)
    guard var components = URLComponents(string: "https://www.google.com/search") else {
        print("无效的URL格式")
        return
    }
    components.queryItems = [URLQueryItem(name: "q", value: questionAsked)]
    
    guard let myUrl = components.url else {
        print("创建URL失败")
        return
    }
    
    var request = URLRequest(url: myUrl)
    request.httpMethod = "GET" // Google搜索接口仅支持GET请求
    
    let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
        if let error = error {
            print("请求错误: \(error.localizedDescription)")
            return
        }
        
        guard let data = data else {
            print("服务器未返回数据")
            return
        }
        
        // 这里返回的是HTML内容,先转成字符串确认返回结果
        if let htmlString = String(data: data, encoding: .utf8) {
            print("返回的HTML内容预览:\n\(htmlString.prefix(500))")
            // 下一步需要解析HTML提取答案,下面会给出示例
        }
    }
    task.resume()
}

提取搜索结果中的常见答案

因为Google返回的是HTML页面,要提取答案需要用HTML解析库,推荐用SwiftSoup(可以通过CocoaPods或Swift Package Manager安装)。

下面是用SwiftSoup提取Google搜索的直接答案(比如知识面板、顶部摘要)的示例:

// 先确保已导入SwiftSoup
import SwiftSoup

// 在dataTask的回调里替换之前的HTML打印代码:
if let htmlString = String(data: data, encoding: .utf8) {
    do {
        let doc = try SwiftSoup.parse(htmlString)
        // 尝试提取Google知识面板的直接答案(选择器可能会随页面更新变化,需验证)
        let directAnswer = try doc.select("div.Z0LcW").first()?.text()
        
        DispatchQueue.main.async {
            if let answer = directAnswer {
                self.AnswerView.text = "答案: \(answer)"
            } else {
                // 如果没有直接答案,提取第一个搜索结果的标题和摘要
                let firstTitle = try? doc.select("h3").first()?.text() ?? "未找到匹配结果"
                let firstSnippet = try? doc.select("div.IsZvec").first()?.text() ?? "无摘要"
                self.AnswerView.text = "\(firstTitle!)\n\(firstSnippet!)"
            }
        }
    } catch {
        print("HTML解析错误: \(error)")
    }
}

额外提示

  • Google的网页结构可能会随时调整,上面的CSS选择器(比如div.Z0LcW)如果失效,需要打开浏览器开发者工具查看最新的元素选择器
  • 如果想更稳定地获取结构化答案,推荐使用Google Custom Search API,它会返回JSON格式的结构化结果,不过需要申请API密钥和自定义搜索引擎ID

内容的提问来源于stack exchange,提问作者user11383986

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:20:04