使用Alamofire进行PATCH请求(Swift 2.3)

3

我有一个问题,我尝试使用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")
            }
    }

希望你能帮助我,我已经搜索过了,但信息不是很丰富。

最好的问候。

3个回答

4
您需要使用自定义编码,并将参数作为原始字符串发送到请求体中。
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")
            }
    }

1

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

0

尝试使用.PUT而不是.PATCH

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

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


该网络服务不允许使用PUT方法,但是我无法修改它。:( ... 不管怎样还是谢谢。 - Luckio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接