我得到了一个必须向其发送 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
}
}
}
好吧,我解决了这个问题 - 基本上,我必须在标头中发送 csrftoken 值,如下 -
case .addTimeTable:
return [
"Content-Type": "application/json",
"Cookie": "csrftoken=\(Utils.getValue(key: Constants.CSRFTOKENVALUE))"
]