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
相关产品推荐
相关产品推荐

