求助:如何在Swift 3 Playground中实现REST API请求(含Laravel GET调用)
在Swift 3 Playground中实现Laravel REST API请求(GET/POST/PUT/DELETE)
我明白你在Swift 3 Playground里调用Laravel REST API时遇到了麻烦,先从你最关心的GET请求入手,一步步帮你搞定所有HTTP方法的实现。
首先要注意Playground的特殊设置:默认情况下Playground会在代码执行完立刻停止,异步网络请求还没返回就结束了,所以必须先开启无限执行:
import PlaygroundSupport import Foundation // 让Playground保持运行直到我们手动结束 PlaygroundPage.current.needsIndefiniteExecution = true
一、GET请求实现(针对你的Laravel API)
你的代码已经有了雏形,但需要适配Swift 3的语法并补全完整流程。这里是可以直接运行的完整版本:
// 1. 设置请求头和URL let headers = ["Content-Type": "application/json"] guard let url = URL(string: "http://localhost:8088/api/person") else { print("无效的URL") PlaygroundPage.current.finishExecution() return } // 2. 创建请求对象 var request = URLRequest(url: url) request.httpMethod = "GET" request.allHTTPHeaderFields = headers request.timeoutInterval = 10.0 // 3. 发起网络请求 let task = URLSession.shared.dataTask(with: request) { data, response, error in // 处理错误 if let error = error { print("请求出错: \(error.localizedDescription)") PlaygroundPage.current.finishExecution() return } // 验证响应状态码 guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else { print("响应状态码异常") PlaygroundPage.current.finishExecution() return } // 解析返回的JSON数据(Laravel API通常返回JSON) if let data = data { do { let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) print("GET请求成功,返回数据:\n\(json)") } catch { print("JSON解析失败: \(error.localizedDescription)") } } // 结束Playground运行 PlaygroundPage.current.finishExecution() } task.resume()
关键说明:
- Swift 3里推荐使用
URLRequest(结构体)替代NSMutableURLRequest,通过var声明来修改属性 - 一定要加
guard校验URL的有效性,避免崩溃 - 在回调里处理完逻辑后调用
PlaygroundPage.current.finishExecution()主动结束Playground
二、POST请求(提交数据到Laravel API)
POST请求需要设置httpBody,把要提交的数据转成JSON格式:
// 要提交的参数 let postParams: [String: Any] = [ "name": "John Doe", "age": 30, "email": "john@example.com" ] // 转成JSON数据 guard let postData = try? JSONSerialization.data(withJSONObject: postParams, options: []) else { print("参数转JSON失败") PlaygroundPage.current.finishExecution() return } var postRequest = URLRequest(url: url) postRequest.httpMethod = "POST" postRequest.allHTTPHeaderFields = headers postRequest.httpBody = postData let postTask = URLSession.shared.dataTask(with: postRequest) { data, response, error in // 处理逻辑和GET请求类似,这里省略重复部分 if let error = error { print("POST请求出错: \(error.localizedDescription)") } else if let data = data { let json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) print("POST请求成功,返回数据:\n\(json ?? "无返回数据")") } PlaygroundPage.current.finishExecution() } postTask.resume()
三、PUT请求(更新数据)
PUT请求和POST类似,只是httpMethod设为PUT,通常用来更新已有资源:
// 假设要更新ID为1的用户 guard let putUrl = URL(string: "http://localhost:8088/api/person/1") else { print("无效的PUT URL") PlaygroundPage.current.finishExecution() return } let putParams: [String: Any] = [ "name": "John Updated", "age": 31 ] guard let putData = try? JSONSerialization.data(withJSONObject: putParams, options: []) else { print("PUT参数转JSON失败") PlaygroundPage.current.finishExecution() return } var putRequest = URLRequest(url: putUrl) putRequest.httpMethod = "PUT" putRequest.allHTTPHeaderFields = headers putRequest.httpBody = putData let putTask = URLSession.shared.dataTask(with: putRequest) { data, response, error in // 处理逻辑同前 if let error = error { print("PUT请求出错: \(error.localizedDescription)") } else if let data = data { let json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) print("PUT请求成功,返回数据:\n\(json ?? "无返回数据")") } PlaygroundPage.current.finishExecution() } putTask.resume()
四、DELETE请求(删除资源)
DELETE请求不需要httpBody(根据Laravel路由设计,可能通过URL传递资源ID):
// 假设要删除ID为1的用户 guard let deleteUrl = URL(string: "http://localhost:8088/api/person/1") else { print("无效的DELETE URL") PlaygroundPage.current.finishExecution() return } var deleteRequest = URLRequest(url: deleteUrl) deleteRequest.httpMethod = "DELETE" deleteRequest.allHTTPHeaderFields = headers let deleteTask = URLSession.shared.dataTask(with: deleteRequest) { data, response, error in // 处理逻辑同前 if let error = error { print("DELETE请求出错: \(error.localizedDescription)") } else if let data = data { let json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) print("DELETE请求成功,返回数据:\n\(json ?? "无返回数据")") } PlaygroundPage.current.finishExecution() } deleteTask.resume()
额外注意事项:
- 确保你的Laravel API已经正确配置了CORS(如果Playground和Laravel不在同一个域的话,不过localhost下通常没问题)
- 如果Laravel API需要认证(比如Token),记得在请求头里加上
Authorization: Bearer {your_token} - 测试时可以先用Postman确认Laravel API本身是正常工作的,排除后端问题
内容的提问来源于stack exchange,提问作者Thobs More
相关产品推荐
相关产品推荐

