2017-02-16 91 views
2

我有一个问题,我尝试使用Alamofire的PATCH方法更新,但没有更改反映出来。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和PATCH请求之间的差异被反映在服务器处理该封闭实体来修改由Request-URI所标识的资源的方式。在PUT请求中,封闭的实体被认为是存储在源服务器上的资源的修改版本,并且客户端正在请求替换存储的版本。但是,对于PATCH,封闭实体包含一组说明,说明当前驻留在源服务器上的资源如何修改以生成新版本。 PATCH方法影响由Request-URI标识的资源,并且它也可能对其他资源产生副作用;即可以通过应用PATCH创建新的资源,或者修改现有的资源。

此外,检查服务器是否接收来自您的应用程序的请求是否正确。检查URL,参数,格式和呼叫类型。如果所有事情都是正确的,请检查响应数据。

+0

webservice不允许使用方法PUT,但我不允许修改它。 :(......感谢无论如何。 – Luckio

+0

你是否尝试更新URL中的路径密钥? –

0

斯威夫特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 
      } 
     } 
}