热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
本提示词专为iOS开发场景设计,能够根据API端点的功能特性,生成结构清晰、内容完整的技术文档。通过系统化的分析流程,确保文档包含端点概述、请求参数、响应格式、错误代码和使用示例等核心要素,帮助开发团队快速理解和使用API接口,提升开发效率和协作质量。生成的文档风格专业严谨,逻辑层次分明,便于后续维护和参考。
用于移动端登录场景下获取 OAuth 2.0 访问令牌的端点。支持两种授权类型:
该端点不需要现有令牌即可调用。适用于用户登录、令牌续期等场景。速率限制:20次/分钟。
说明:请求体为 JSON。根据 grant_type 不同,所需参数不同。
通用参数
按授权类型的参数
当 grant_type = password:
当 grant_type = refresh_token:
成功时返回 JSON,字段如下:
成功响应示例: { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "def50200a1b2c3d4..." }
注:错误响应的具体报文结构未在本规范中定义,请根据状态码与错误码进行处理。
请求示例(密码模式)
请求示例(刷新令牌模式)
cURL 示例(密码模式)
curl -X POST "https://
-H "Content-Type: application/json"
-d '{
"grant_type": "password",
"username": "user@example.com",
"password": "P@ssw0rd123",
"scope": "basic"
}'
cURL 示例(刷新令牌模式)
curl -X POST "https://
-H "Content-Type: application/json"
-d '{
"grant_type": "refresh_token",
"refresh_token": "def50200a1b2c3d4...",
"scope": ""
}'
iOS(Swift)示例:使用 URLSession 获取令牌并写入 Keychain import Foundation import Security
struct TokenResponse: Decodable { let access_token: String let token_type: String let expires_in: Int let refresh_token: String }
struct PasswordGrantBody: Encodable { let grant_type = "password" let username: String let password: String let scope: String? }
struct RefreshGrantBody: Encodable { let grant_type = "refresh_token" let refresh_token: String let scope: String? }
final class OAuthTokenService {
private let baseURL = URL(string: "https://
func requestPasswordToken(username: String,
password: String,
scope: String? = nil,
completion: @escaping (Result<TokenResponse, Error>) -> Void) {
let body = PasswordGrantBody(username: username, password: password, scope: scope)
performTokenRequest(body: body, completion: completion)
}
func requestRefreshToken(refreshToken: String,
scope: String? = nil,
completion: @escaping (Result<TokenResponse, Error>) -> Void) {
let body = RefreshGrantBody(refresh_token: refreshToken, scope: scope)
performTokenRequest(body: body, completion: completion)
}
private func performTokenRequest<T: Encodable>(body: T,
completion: @escaping (Result<TokenResponse, Error>) -> Void) {
var url = baseURL
url.appendPathComponent("/api/v1/oauth/token")
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
do {
request.httpBody = try JSONEncoder().encode(body)
} catch {
completion(.failure(error))
return
}
session.dataTask(with: request) { data, response, error in
if let error = error {
completion(.failure(error))
return
}
guard let http = response as? HTTPURLResponse, let data = data else {
completion(.failure(NSError(domain: "net", code: -1)))
return
}
guard (200...299).contains(http.statusCode) else {
// 建议根据 http.statusCode(如 400 / 429)做分类处理
completion(.failure(NSError(domain: "http", code: http.statusCode)))
return
}
do {
let token = try JSONDecoder().decode(TokenResponse.self, from: data)
completion(.success(token))
} catch {
completion(.failure(error))
}
}.resume()
}
}
// Keychain 存储示例(简化版) @discardableResult func storeTokenInKeychain(accessToken: String, refreshToken: String) -> Bool { func upsert(account: String, value: String) -> Bool { let service = "com.yourapp.oauth" let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrService as String: service, kSecAttrAccount as String: account ] let attrs: [String: Any] = [ kSecValueData as String: Data(value.utf8), kSecAttrAccessible as String: kSecAttrAccessibleAfterFirstUnlock ] let status = SecItemUpdate(query as CFDictionary, attrs as CFDictionary) if status == errSecItemNotFound { var add = query add.merge(attrs) { $1 } return SecItemAdd(add as CFDictionary, nil) == errSecSuccess } return status == errSecSuccess }
let ok1 = upsert(account: "access_token", value: accessToken)
let ok2 = upsert(account: "refresh_token", value: refreshToken)
return ok1 && ok2
}
// 使用示例 let service = OAuthTokenService() service.requestPasswordToken(username: "user@example.com", password: "P@ssw0rd123", scope: "basic") { result in switch result { case .success(let token): _ = storeTokenInKeychain(accessToken: token.access_token, refreshToken: token.refresh_token) case .failure(let error): print("Token request failed:", error) } }
为已登录用户提供订单列表的只读分页检索能力。客户端可通过可选的状态过滤、更新时间过滤及分页参数获取订单数据。典型使用场景:
支持 iOS 端通过 Authorization 认证访问,并支持 ETag 条件请求以减少流量和加快加载。
请求头(建议/可选):
说明:
查询参数:
成功响应(HTTP 200)为 JSON 对象,包含以下字段:
条件请求(ETag):
示例请求(带筛选与分页):
GET /api/v1/orders?status=paid&page=1&page_size=20&updated_after=2024-01-10T12:00:00Z
Accept: application/json
Authorization: Bearer
示例成功响应(200 OK): { "items": [ { "order_id": "ord_202501011234", "status": "paid", "amount": 199.99, "currency": "USD", "created_at": "2025-01-02T08:30:15Z" }, { "order_id": "ord_202501011235", "status": "paid", "amount": 59.50, "currency": "USD", "created_at": "2025-01-02T10:12:00Z" } ], "meta": { "total": 142, "page": 1, "page_size": 20, "has_next": true } }
示例条件请求未修改(304 Not Modified,无响应体): HTTP/1.1 304 Not Modified
iOS 端 Swift 代码示例(URLComponents 构建查询 + ISO8601 解析 + ETag 缓存):
// 1) 定义模型 struct OrdersResponse: Decodable { let items: [Order] let meta: Meta
struct Order: Decodable {
let orderId: String
let status: String
let amount: Decimal
let currency: String
let createdAt: Date
enum CodingKeys: String, CodingKey {
case orderId = "order_id"
case status
case amount
case currency
case createdAt = "created_at"
}
}
struct Meta: Decodable {
let total: Int
let page: Int
let pageSize: Int
let hasNext: Bool
enum CodingKeys: String, CodingKey {
case total, page
case pageSize = "page_size"
case hasNext = "has_next"
}
}
}
// 2) 灵活的 ISO8601 解码(兼容是否带毫秒) final class ISO8601FlexibleDecoder { static let withoutFractional: ISO8601DateFormatter = { let f = ISO8601DateFormatter() f.formatOptions = [.withInternetDateTime, .withColonSeparatorInTimeZone] return f }()
static let withFractional: ISO8601DateFormatter = {
let f = ISO8601DateFormatter()
f.formatOptions = [.withInternetDateTime, .withFractionalSeconds, .withColonSeparatorInTimeZone]
return f
}()
static func decoder() -> JSONDecoder {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .useDefaultKeys
decoder.dateDecodingStrategy = .custom { decoder -> Date in
let container = try decoder.singleValueContainer()
let str = try container.decode(String.self)
if let d = withFractional.date(from: str) ?? withoutFractional.date(from: str) {
return d
}
throw DecodingError.dataCorruptedError(in: container,
debugDescription: "Invalid ISO8601 date: \(str)")
}
return decoder
}
}
// 3) 简易 ETag 缓存(内存演示,可替换为持久化方案) final class ETagCache { static let shared = ETagCache() private var store: [String: (etag: String, data: Data)] = [:] private let lock = NSLock()
func key(for url: URL) -> String { url.absoluteString }
func get(for url: URL) -> (etag: String, data: Data)? {
lock.lock(); defer { lock.unlock() }
return store[key(for: url)]
}
func set(for url: URL, etag: String, data: Data) {
lock.lock(); defer { lock.unlock() }
store[key(for: url)] = (etag, data)
}
}
// 4) 构建请求并发起调用 struct OrdersQuery { var status: String? // "pending"/"paid"/"shipped"/"canceled" var page: Int? // >= 1 var pageSize: Int? // <= 100 var updatedAfter: Date? // RFC3339/ISO8601 }
func fetchOrders(baseURL: URL, token: String, query: OrdersQuery, completion: @escaping (Result<OrdersResponse, Error>) -> Void) { // URLComponents 构建查询参数 var components = URLComponents(url: baseURL.appendingPathComponent("/api/v1/orders"), resolvingAgainstBaseURL: false)! var items: [URLQueryItem] = []
if let status = query.status { items.append(URLQueryItem(name: "status", value: status)) }
if let page = query.page { items.append(URLQueryItem(name: "page", value: String(page))) }
if let pageSize = query.pageSize {
let clamped = min(pageSize, 100) // 客户端侧预防性限制
items.append(URLQueryItem(name: "page_size", value: String(clamped)))
}
if let updatedAfter = query.updatedAfter {
let fmt = ISO8601FlexibleDecoder.withFractional // 输出 RFC3339/ISO8601 字符串
let str = fmt.string(from: updatedAfter)
items.append(URLQueryItem(name: "updated_after", value: str))
}
components.queryItems = items
guard let url = components.url else {
completion(.failure(NSError(domain: "OrdersAPI", code: -1, userInfo: [NSLocalizedDescriptionKey: "Invalid URL"])))
return
}
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
// 附加 If-None-Match(若有)
if let cached = ETagCache.shared.get(for: url) {
request.setValue(cached.etag, forHTTPHeaderField: "If-None-Match")
}
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
completion(.failure(error)); return
}
guard let http = response as? HTTPURLResponse else {
completion(.failure(NSError(domain: "OrdersAPI", code: -2, userInfo: [NSLocalizedDescriptionKey: "No HTTP response"])))
return
}
// 304:返回缓存数据
if http.statusCode == 304 {
if let cached = ETagCache.shared.get(for: url) {
let decoder = ISO8601FlexibleDecoder.decoder()
do {
let result = try decoder.decode(OrdersResponse.self, from: cached.data)
completion(.success(result))
} catch {
completion(.failure(error))
}
} else {
completion(.failure(NSError(domain: "OrdersAPI", code: 304, userInfo: [NSLocalizedDescriptionKey: "Not Modified but no cache"])))
}
return
}
// 非 200:转化为错误(实际项目可按 401/403/422/500 分流处理)
guard http.statusCode == 200, let data = data else {
completion(.failure(NSError(domain: "OrdersAPI", code: http.statusCode, userInfo: [NSLocalizedDescriptionKey: "HTTP \(http.statusCode)"])))
return
}
// 解析并存储 ETag
if let etag = http.value(forHTTPHeaderField: "ETag") {
ETagCache.shared.set(for: url, etag: etag, data: data)
}
let decoder = ISO8601FlexibleDecoder.decoder()
do {
let result = try decoder.decode(OrdersResponse.self, from: data)
completion(.success(result))
} catch {
completion(.failure(error))
}
}
task.resume()
}
// 5) 加载下一页示例 func loadNextPageIfNeeded(current: OrdersResponse, baseURL: URL, token: String, status: String?) { guard current.meta.hasNext else { return } let nextPage = current.meta.page + 1 let query = OrdersQuery(status: status, page: nextPage, pageSize: current.meta.pageSize, updatedAfter: nil) fetchOrders(baseURL: baseURL, token: token, query: query) { result in // 合并列表 UI... } }
用于上传并更新用户头像的端点。服务端会对上传图片进行正方形自动裁剪,返回裁剪后图片的元数据与访问地址。支持 Idempotency-Key 以避免重复创建资源。适用于个人中心头像设置/更新等场景。
请求头
表单字段(multipart/form-data)
示例: { "media_id": "avt_1234567890", "file_url": "https://cdn.example.com/media/avt_1234567890.jpg", "width": 512, "height": 512, "content_type": "image/jpeg" }
cURL
curl -X POST https://api.example.com/api/v1/media/avatar
-H "Authorization: Bearer
-H "Idempotency-Key: 8f0f9a0a-6e7b-4c77-9c1c-2a2d7c0f0abc"
-F "file=@/path/to/avatar.jpg"
-F "filename=avatar.jpg"
-F "purpose=avatar"
iOS(Swift,URLSession 背景上传,超时 60s,上传前压缩至 <2MB 优化) import UIKit
final class AvatarUploader: NSObject, URLSessionTaskDelegate { private let boundary = "Boundary-(UUID().uuidString)" private lazy var session: URLSession = { let config = URLSessionConfiguration.background(withIdentifier: "com.example.app.upload.avatar.(UUID().uuidString)") config.timeoutIntervalForRequest = 60 config.timeoutIntervalForResource = 60 // 根据需求调整网络/电量策略 config.isDiscretionary = false config.sessionSendsLaunchEvents = true return URLSession(configuration: config, delegate: self, delegateQueue: nil) }()
func uploadAvatar(image: UIImage,
token: String,
fileName: String = "avatar.jpg",
idempotencyKey: String? = nil,
completion: @escaping (Result<Data, Error>) -> Void) {
// 1) 压缩到 <2MB(JPEG)
guard let imageData = compressToUnder2MB(image: image) else {
completion(.failure(NSError(domain: "AvatarUploader", code: -1, userInfo: [NSLocalizedDescriptionKey: "Image compression failed"])))
return
}
// 2) 构造 multipart/form-data 文件
let url = URL(string: "https://api.example.com/api/v1/media/avatar")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
if let key = idempotencyKey {
request.setValue(key, forHTTPHeaderField: "Idempotency-Key")
}
// 将 multipart 数据写入临时文件以便使用背景上传
let tempFileURL = writeMultipartToTempFile(imageData: imageData, fileName: fileName)
// 3) 发起背景上传
let task = session.uploadTask(with: request, fromFile: tempFileURL) { data, response, error in
defer { try? FileManager.default.removeItem(at: tempFileURL) }
if let error = error { completion(.failure(error)); return }
guard let http = response as? HTTPURLResponse, (200..<300).contains(http.statusCode), let data = data else {
let code = (response as? HTTPURLResponse)?.statusCode ?? -1
completion(.failure(NSError(domain: "AvatarUploader", code: code, userInfo: [NSLocalizedDescriptionKey: "Upload failed"])))
return
}
completion(.success(data))
}
task.resume()
}
private func writeMultipartToTempFile(imageData: Data, fileName: String) -> URL {
var body = Data()
// purpose
body.append("--\(boundary)\r\n".data(using: .utf8)!)
body.append("Content-Disposition: form-data; name=\"purpose\"\r\n\r\n".data(using: .utf8)!)
body.append("avatar\r\n".data(using: .utf8)!)
// filename field(可选字段)
body.append("--\(boundary)\r\n".data(using: .utf8)!)
body.append("Content-Disposition: form-data; name=\"filename\"\r\n\r\n".data(using: .utf8)!)
body.append("\(fileName)\r\n".data(using: .utf8)!)
// file
let mime = fileName.lowercased().hasSuffix(".png") ? "image/png" : "image/jpeg"
body.append("--\(boundary)\r\n".data(using: .utf8)!)
body.append("Content-Disposition: form-data; name=\"file\"; filename=\"\(fileName)\"\r\n".data(using: .utf8)!)
body.append("Content-Type: \(mime)\r\n\r\n".data(using: .utf8)!)
body.append(imageData)
body.append("\r\n".data(using: .utf8)!)
body.append("--\(boundary)--\r\n".data(using: .utf8)!)
let tempURL = FileManager.default.temporaryDirectory.appendingPathComponent("avatar-\(UUID().uuidString).tmp")
try? body.write(to: tempURL)
return tempURL
}
private func compressToUnder2MB(image: UIImage) -> Data? {
let maxBytes = 2 * 1024 * 1024
var jpegQuality: CGFloat = 0.9
guard var data = image.jpegData(compressionQuality: jpegQuality) else { return nil }
// 若仍超限,逐步降低质量
while data.count > maxBytes && jpegQuality > 0.4 {
jpegQuality -= 0.1
if let d = image.jpegData(compressionQuality: jpegQuality) { data = d }
else { break }
}
// 若仍超限,按比例缩放再压缩
if data.count > maxBytes {
let scale = sqrt(CGFloat(maxBytes) / CGFloat(max(data.count, 1))) // 粗略缩放因子
let targetSize = CGSize(width: max(1, image.size.width * scale),
height: max(1, image.size.height * scale))
UIGraphicsBeginImageContextWithOptions(targetSize, true, 1.0)
image.draw(in: CGRect(origin: .zero, size: targetSize))
let resized = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
if let resized = resized, let d = resized.jpegData(compressionQuality: 0.8) {
return d.count <= maxBytes ? d : d // 返回尽力压缩结果
}
}
return data
}
}
// 使用示例
let uploader = AvatarUploader()
uploader.uploadAvatar(image: UIImage(named: "avatar")!,
token: "
通过一条可复用的高质量提示词,让iOS团队以最少输入快速产出结构统一、可直接交付的接口文档。用户只需提供端点功能、目标平台与期望详细程度,即可自动生成包含功能概览、调用方式、参数说明、响应数据、异常场景、示例与注意事项的完整内容,帮助团队快速对齐,减少沟通与返工,支撑新建开发、存量梳理与评审培训,加速交付、沉淀规范并降低协作成本。
在新功能立项时,基于端点描述一键产出可执行文档;为复杂流程补充调用示例与注意事项;上线前快速校对参数与返回说明,减少联调反复。
梳理接口契约并统一格式;把需求变更快速同步为文档更新;提供清晰错误含义与边界,降低前端问答与排查时间。
据文档生成测试要点与用例清单;覆盖常见异常与边界;在回归阶段据示例复现问题并追踪修复。
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
半价获取高级提示词-优惠即将到期