如何解决从我的 swift 应用程序发送 PUT 请求时出现的错误

问题描述 投票:0回答:1

我得到了一个必须向其发送 put 请求的 URL。这些是正在发送的标头 - 正文也看起来像这样 - (第二张图片)

之前我在 Postman 上遇到了问题,因为在 cookies 标头中,它发送了一些 csrftoken,现在我从 Postman put 请求中删除了该标头,现在它工作正常,现在我必须在我的 Swift 中做同样的事情app - 但收到错误 403,实际上我硬编码了在 put 请求正文中发送的值,与邮递员上完全相同,我只在 put 请求中发送一个标头,附在下面的图片,我的 URL 也是同样的,我也打印出来了,这个错误是因为我在发送 put 请求时没有清除标头字段中的 cookie 吗?,我不明白如何解决这个问题,请帮忙

[![在此处输入图像描述][3]][3]

这是我发送的整个请求 - [![在此处输入图像描述][5]][5]

[在此输入图像描述][6]

[![在此处输入图像描述][7]][7]

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
    }
}

}

ios swift rest put
1个回答
0
投票

好吧,我解决了这个问题 - 基本上,我必须在标头中发送 csrftoken 值,如下 -

case .addTimeTable:
        return [
            "Content-Type": "application/json",
            "Cookie": "csrftoken=\(Utils.getValue(key: Constants.CSRFTOKENVALUE))"
        ]
© www.soinside.com 2019 - 2024. All rights reserved.