【问题标题】:PATCH with Alamofire (swift 2.3)用 Alamofire 打补丁(swift 2.3)
【发布时间】:2017-02-16 12:02:02
【问题描述】:

我有一个问题,我尝试使用 Alamofire 使用 PATCH 方法进行更新,但没有反映任何更改。

我认为其中一个我犯了一些错误。

这是我的代码:

    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")
            }
    }

希望大家能帮帮我,而且我已经搜索过并没有太多信息。

最好的问候。

【问题讨论】:

    标签: ios swift2 alamofire patch


    【解决方案1】:

    您需要使用自定义编码并将参数作为原始字符串发送到正文中

    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")
                }
        }
    

    【讨论】:

      【解决方案2】:

      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
                  }
              }
      }
      

      【讨论】:

        【解决方案3】:

        尝试使用.PUT 而不是.PATCH

        PUT 和 PATCH 请求的区别体现在服务器处理封闭实体以修改由 Request-URI 标识的资源的方式上。在 PUT 请求中,包含的实体被认为是存储在源服务器上的资源的修改版本,并且客户端请求替换存储的版本。然而,对于 PATCH,封闭的实体包含一组指令,描述如何修改当前驻留在源服务器上的资源以生成新版本。 PATCH 方法会影响 Request-URI 标识的资源,也可能对其他资源产生副作用;即,可以通过应用 PATCH 创建新资源或修改现有资源。

        另外,检查服务器从您的应用接收请求是否正确。检查 URL、参数、格式和调用类型。如果一切都正确,请检查响应数据。

        【讨论】:

        • webservice不允许使用PUT方法,但我不允许修改它。 :( ...无论如何,谢谢。
        猜你喜欢
        • 2012-01-28
        • 2015-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多