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

Swift中Yelp API v3的正确使用示例及方法说明求助

Swift 中使用 Yelp Fusion API v3 完整指南

我太懂你这种找不到靠谱、可用文档的痛苦了——Yelp官方的Swift示例确实有点拉胯,第三方资源又大多过时。下面给你一个**可直接运行、基于现代Swift(async/await)**的完整示例,涵盖授权、请求发起、数据解码的全流程,帮你获取商家的评论、图片等信息。

前置准备

首先你得去Yelp开发者平台创建一个应用,拿到你的API Key(就是那个标为API Key的字符串,不是Client ID)。这个Key是所有请求的核心授权凭证。

步骤1:定义Codable数据模型

Yelp的响应是JSON格式,我们用Swift的Codable协议来自动解码数据。先定义几个核心模型:

import Foundation

// 商家基础信息模型(包含图片URL)
struct Business: Codable {
    let id: String
    let name: String
    let imageUrl: String?
    let url: String?
    let reviewCount: Int?
    // 你还可以根据需要添加更多字段,比如地址、评分等
}

// 评论模型
struct Review: Codable {
    let id: String
    let text: String
    let rating: Int
    let user: User
}

struct User: Codable {
    let name: String
    let imageUrl: String?
}

// 搜索商家的响应容器
struct BusinessSearchResponse: Codable {
    let businesses: [Business]
}

// 获取评论的响应容器
struct ReviewResponse: Codable {
    let reviews: [Review]
}

步骤2:创建API管理工具类

我们封装一个简单的YelpAPIManager类,处理授权、请求发起和数据解码:

class YelpAPIManager {
    private let apiKey: String
    private let baseUrl = "https://api.yelp.com/v3"
    
    init(apiKey: String) {
        self.apiKey = apiKey
    }
    
    // 搜索商家(比如按关键词、地理位置)
    func searchBusinesses(keyword: String, latitude: Double, longitude: Double) async throws -> [Business] {
        guard let url = URL(string: "\(baseUrl)/businesses/search") else {
            throw NSError(domain: "YelpAPI", code: -1, userInfo: [NSLocalizedDescriptionKey: "无效的URL"])
        }
        
        var components = URLComponents(url: url, resolvingAgainstBaseURL: false)
        components?.queryItems = [
            URLQueryItem(name: "term", value: keyword),
            URLQueryItem(name: "latitude", value: "\(latitude)"),
            URLQueryItem(name: "longitude", value: "\(longitude)"),
            URLQueryItem(name: "limit", value: "10") // 限制返回数量,可调整
        ]
        
        guard let finalUrl = components?.url else {
            throw NSError(domain: "YelpAPI", code: -1, userInfo: [NSLocalizedDescriptionKey: "无法构建请求URL"])
        }
        
        var request = URLRequest(url: finalUrl)
        // 设置授权头:Bearer + 你的API Key
        request.setValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization")
        
        let (data, response) = try await URLSession.shared.data(for: request)
        
        // 检查响应状态码
        guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
            throw NSError(domain: "YelpAPI", code: -2, userInfo: [NSLocalizedDescriptionKey: "请求失败"])
        }
        
        // 解码数据
        let searchResponse = try JSONDecoder().decode(BusinessSearchResponse.self, from: data)
        return searchResponse.businesses
    }
    
    // 根据商家ID获取评论
    func getReviews(for businessId: String) async throws -> [Review] {
        guard let url = URL(string: "\(baseUrl)/businesses/\(businessId)/reviews") else {
            throw NSError(domain: "YelpAPI", code: -1, userInfo: [NSLocalizedDescriptionKey: "无效的URL"])
        }
        
        var request = URLRequest(url: url)
        request.setValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization")
        
        let (data, response) = try await URLSession.shared.data(for: request)
        
        guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
            throw NSError(domain: "YelpAPI", code: -2, userInfo: [NSLocalizedDescriptionKey: "获取评论失败"])
        }
        
        let reviewResponse = try JSONDecoder().decode(ReviewResponse.self, from: data)
        return reviewResponse.reviews
    }
}

步骤3:调用示例

在你的视图控制器或者ViewModel里,这样使用这个工具类:

// 替换成你的API Key
let apiKey = "YOUR_YELP_API_KEY_HERE"
let yelpManager = YelpAPIManager(apiKey: apiKey)

// 搜索附近的咖啡店(示例坐标:旧金山)
Task {
    do {
        let businesses = try await yelpManager.searchBusinesses(keyword: "coffee", latitude: 37.7749, longitude: -122.4194)
        for business in businesses {
            print("商家:\(business.name),图片URL:\(business.imageUrl ?? "无")")
            
            // 获取该商家的评论
            let reviews = try await yelpManager.getReviews(for: business.id)
            print("评论数量:\(reviews.count)")
            for review in reviews {
                print("用户\(review.user.name)的评论:\(review.text),评分:\(review.rating)")
            }
        }
    } catch {
        print("请求出错:\(error.localizedDescription)")
    }
}

关键注意事项

  • 授权头格式:必须是Bearer {你的API Key},这是Yelp v3 API的核心要求,官方文档其实提了但藏得比较深,容易被忽略。
  • API调用限制:Yelp免费版每天最多5000次请求,开发时注意不要超出频次限制。
  • 错误处理:示例里的错误处理比较基础,你可以根据需求扩展,比如专门处理401(授权失败)、429(请求超限)等特定状态码。
  • 兼容旧版本:如果你的项目还在用Swift 5.5以下版本,可以把async/await改成URLSession的闭包回调方式,逻辑是一致的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:20:46