Повторяющееся событие удаления / обновления API календаря Google возвращает 412 при URLSession

#ios #swift #calendar #google-calendar-api

#iOS #swift #Календарь #google-calendar-api

Вопрос:

Я пытаюсь удалить родительское повторяющееся событие (поэтому родительский элемент и все экземпляры будут удалены).

При использовании URLSession с созданным вручную URLRequest запрос возвращает код ошибки 412. Я не предоставляю заголовок If-Match, и в событии не было никаких изменений с момента создания до его удаления.

При выполнении запроса с помощью Postman или Paw запрос завершается успешно с кодом состояния 204, что является желаемым результатом.

Я создаю запрос как таковой:

  func delete(eventWithId eventId: String, token: String) {

    let sessionConfig = URLSessionConfiguration.default

    let session = URLSession(configuration: sessionConfig, delegate: nil, delegateQueue: nil)

    guard var URL = URL(string: "https://www.googleapis.com/calendar/v3/calendars/primary/events/(eventId)") else {return}
    var request = URLRequest(url: URL)
    request.httpMethod = "DELETE"

    request.addValue("Bearer (token)", forHTTPHeaderField: "Authorization")
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")

    let task = session.dataTask(with: request, completionHandler: { (data: Data?, response: URLResponse?, error: Error?) -> Void in
        if (error == nil) {
            let statusCode = (response as! HTTPURLResponse).statusCode // <--- returning status code 412
        }
        else {
            print("URL Session Task Failed: %@", error!.localizedDescription);
        }
    })
    task.resume()
    session.finishTasksAndInvalidate()
}
  

Тело ответа является:

 {
   "error":{
      "errors":[
         {
            "domain":"global",
            "reason":"conditionNotMet",
            "message":"Precondition Failed",
            "locationType":"header",
            "location":"If-Match"
         }
      ],
      "code":412,
      "message":"Precondition Failed"
   }
}
  

Странная вещь. Я выполняю тот же запрос на удаление, используя Postman и PAW, и он выполняется успешно, возвращая код состояния 204. Также мой запрос на удаление, похоже, работает нормально в отдельных событиях или в отдельных случаях повторяющегося события.

У кого-нибудь есть опыт в этом вопросе?

Комментарии:

1. Пожалуйста, отредактируйте свой вопрос и включите свой код, который нам нужен, чтобы иметь возможность видеть, что вы делаете.

2. Очень верное замечание @DaImTo . Я отредактировал

Ответ №1:

Итак, что на самом деле происходило, так это то, что был добавлен заголовок «If-None-Match», который не отображался при отладке объекта запроса. Мне пришлось провести аудит запроса с помощью прокси (Charles), чтобы увидеть его.

Переопределение этого поля заголовка, похоже, решило эту проблему.