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")
Другие вопросы по тегам