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

Swift应用发送PUT请求出现403错误的解决方法

问题:Swift中PUT请求返回403错误,疑似Cookies头未清除

我需向指定URL发送PUT请求,请求头与请求体如下(对应图片所示)。此前在Postman中因Cookies头携带csrftoken导致请求异常,删除该头后请求恢复正常。但在Swift应用中按相同逻辑配置(请求体与Postman完全一致,仅发送Content-Type: application/json头,URL已确认无误),却出现403错误。怀疑是请求中未清除Cookies头所致,恳请协助解决。

以下是我的请求代码实现:

var path: String {
    switch self {
    case .loginUser:
        return "/user/login/"
    case .getGalleryImages:
        return "/gallery/list/"
    case .getPrograms:
        return "/curriculum/academic-year"
    case .getTimeTable:
        return "/curriculum/timetable"
    case .addTimeTable(let id, _, _, _, _, _, _, _):
        return "/curriculum/timetable/\(id)/"
    }
}

var queryItems: [URLQueryItem] {
    //paginated response will include
    switch self {
    case .getPrograms(let date):
        return [
            URLQueryItem(name: "date", value: date)
        ]
    case .getTimeTable(let grade, let dayOfTheWeek):
        return [
            URLQueryItem(name: "grade", value: String(grade)),
            URLQueryItem(name: "day_of_week", value: dayOfTheWeek)
        ]
    default:
        return []
    }
}

var headers: [String : String] {
    switch self {
    case .loginUser, .addTimeTable:
        return ["Content-Type": "application/json"]
    default:
        return [:]
    }
}

var method: Alamofire.HTTPMethod {
    switch self {
    case .loginUser:
        return .post
    case .getGalleryImages, .getPrograms, .getTimeTable:
        return .get
    case .addTimeTable:
        return .put
    }
}

var url: URL? {
    var components = URLComponents(string: self.baseURLString)
    components?.path += self.path
    if !queryItems.isEmpty {
        components?.queryItems = queryItems
    }
    return components?.url
}

var request: URLRequest? {
    guard let url = self.url else { return nil }
    var request = URLRequest(url: url)
    request.method = method
    request.httpBody = body
    request.allHTTPHeaderFields = headers
    return request
}

var body: Data? {
    switch self {
    case .loginUser(let username, let password):
        let body: [String: String] = [
            "username": username,
            "password": password
        ]
        return try? JSONSerialization.data(
            withJSONObject: body,
            options: .fragmentsAllowed
        )
    case .addTimeTable(
        _,
        let grade,
        let subject,
        let teacher,
        let day_of_week,
        let period_number,
        let start_time,
        let end_time
    ):
        let body: [String: Any] = [
            "grade": grade,
            "subject": subject,
            "teacher": teacher,
            "day_of_week": day_of_week,
            "period_number": period_number,
            "start_time": start_time,
            "end_time": end_time
        ]
        return try? JSONSerialization.data(
            withJSONObject: body,
            options: .fragmentsAllowed
        )
    default:
        return nil
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 07:33:16