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

求助:如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:35:12