2017-02-16 60 views
2

У меня проблема, я пытаюсь обновить с помощью метода PATCH, используя Alamofire, но никаких изменений не отражено.PATCH с Alamofire (swift 2.3)

Думаю, в одном из них я делаю ошибку.

Это мой код:

Alamofire.request(.PATCH, url, parameters: ["op": "replace", "path": "/IsVacinated", "value": true], encoding: .JSON) 
     .responseJSON { response in 
      Utils.endRequest(progressView) 
      if let data = response.data { 
       let json = JSON(data: data) 
       if json != nil { 
        self.navigationController?.popViewControllerAnimated(true) 
        print(json) 
       } 
       else { 
        print("nil json") 
       } 
      } 
      else { 
       print("nil data") 
      } 
    } 

Я надеюсь, что вы можете помочь мне, и что я искал и не много информации.

С уважением.

ответ

2

Вы должны использовать пользовательскую кодировку и отправить параметры в качестве сырья строки в теле

let enconding: ParameterEncoding = .Custom({convertible, params in 
       let mutableRequest = convertible.URLRequest.copy() as? NSMutableURLRequest 
       mutableRequest?.HTTPBody = "[{\"op\" : \"replace\", \"path\" : \"/IsVacinated\", \"value\":true"}]".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) 
       if let mutableRequest = mutableRequest { 
        return (mutableRequest, nil) 
       } 
       let error = NSError(domain: "Custom", code: -1, userInfo: nil) 
       return (convertible.URLRequest, error) 
      }) 

Наконец, используя пользовательскую кодировку

Alamofire.request(.PATCH, url, parameters: [:], encoding: encoding) 
     .responseJSON { response in 
      Utils.endRequest(progressView) 
      if let data = response.data { 
       let json = JSON(data: data) 
       if json != nil { 
        self.navigationController?.popViewControllerAnimated(true) 
        print(json) 
       } 
       else { 
        print("nil json") 
       } 
      } 
      else { 
       print("nil data") 
      } 
    } 
+0

Отлично! Большое вам спасибо – Luckio

1

Попробуйте использовать .PUT вместо .PATCH

Разница между PUT и накладными запросами находит свое отражение в том, как сервер обрабатывает прилагаемый объект для модификации ресурса, идентифицируемого Request-URI. В запросе PUT закрытый объект рассматривается как модифицированная версия ресурса, хранящегося на исходном сервере, и клиент запрашивает замену сохраненной версии. Однако с помощью PATCH закрытый объект содержит набор инструкций, описывающих, как ресурс, находящийся в настоящее время на исходном сервере, должен быть изменен для создания новой версии. Метод PATCH влияет на ресурс, идентифицированный Request-URI, и также может иметь побочные эффекты для других ресурсов; то есть новые ресурсы могут быть созданы или уже модифицированы приложением PATCH.

Кроме того, проверьте, является ли запрос на получение сервера от вашего приложения правильным или нет. Проверьте URL, параметры, формат и тип вызова. Если все правильно, проверьте данные ответа.

+0

Веб-сервис не позволяет использовать метод PUT, но мне не разрешено его изменять. :(... спасибо в любом случае. – Luckio

+0

Вы пробовали обновить ключ ключа в URL-адресе? –

0

Swift 4 и Alamofire 4,6 Пример:

struct CustomPATCHEncoding: ParameterEncoding { 
    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { 
     let mutableRequest = try! URLEncoding().encode(urlRequest, with: parameters) as? NSMutableURLRequest 

     do { 
      let jsonData = try JSONSerialization.data(withJSONObject: parameters!, options: .prettyPrinted) 
      mutableRequest?.httpBody = jsonData 
     } catch { 
      print(error.localizedDescription) 
     } 

     return mutableRequest! as URLRequest 
    } 
} 

func updateProfile() { 
    let phoneString = self.phone.value 
    let formattedPhoneString = phoneString.digits 
    var parameters : Parameters = ["email": self.email.value, 
            "first_name": self.firstName.value, 
            "last_name": self.lastName.value, 
            "id": self.id.value] 

    if formattedPhoneString.count > 0 { 
     parameters["phone"] = formattedPhoneString 
    } 

    Alamofire.request(APPURL.Profile, 
         method: .patch, 
         parameters: parameters, 
         encoding: CustomPATCHEncoding(), 
         headers:APIManager.headers()) 
     .debugLog() 
     .responseJSON { response in 

      switch response.result { 
      case .success(let JSON): 
       print("Success with JSON: \(JSON)") 
       break 
      case .failure(let error): 
       print("Request failed with error: \(error.localizedDescription)") 
       break 
      } 
     } 
}