URLSession отправляет запрос GET вместо POST
Вот так я делаю POST-запрос
var request = URLRequest(url: url)
let methodString = mehtod.rawValue
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.cachePolicy = .reloadIgnoringLocalAndRemoteCacheData
if let headers = headers {
request.set(headers: headers)
}
if let parameters = parameters {
do {
let postParams = try JSONEncoder().encode(parameters)
let postData = postParams
request.httpBody = postData
}
catch {
print("error")
}
}
let session = URLSession.shared
print(request)
print(request.allHTTPHeaderFields)
print(String(data: request.httpBody!, encoding: .utf8)!)
print(request.httpMethod)
session.dataTask(with: request) { (data, response, error) in
let result: Result<Data>
if let data = data {
result = .success(data)
}
else if let error = error {
result = .failure(error)
}
else {
result = .failure(RESTError.unknownError)
}
completion(result)
}.resume()
И это то, что я вижу в Чарльзе
Я пытаюсь отправить POST, но почему-то отправляю запрос GET. Также я получаю сообщение об ошибке с сервера:
{"message":"Method \"GET\" not allowed.","code":"method_not_allowed"}
В чем может быть причина?
2 ответа
Я была такая же проблема. Когда происходит перенаправление, iOS делает новый запрос и меняет POST на GET. Также ваше тело стало пустым. Дважды проверьте, не используете ли вы случайно http вместо https.
Вы также можете реализовать (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)redirectResponse newRequest:(NSURLRequest *)request completedHandler:(void (^) * (NS)) CompleteRequest
но для меня это не было решением.
Вот более подробная информация https://developer.apple.com/forums/thread/12749?answerId=34834022#34834022
Я думаю, что вы можете использовать session.uploadTask(with: request, from: uploadData)
,
Вам нужно создать строку поста в качестве словаря, а затем преобразовать ее в строку jason. если у вас возникли проблемы с преобразованием ваших данных в jason, скажите мне, что я дам вам метод для этого.
request.httpMethod = "POST"
request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData
let paramString = yourPostDataInJASON!
print(paramString)
request.httpBody = paramString.data(using: String.Encoding.utf8)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")