在Swift中使用PATCH发送带有请求体的HTTP请求

4
我正在尝试发送一个具有序列化JSON主体的Patch请求。由于某种原因,服务器无法正确接收Body。我有一种感觉,似乎PATCH方法与http请求正文的组合存在问题。
    let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session = NSURLSession(configuration: sessionConfig, delegate: nil, delegateQueue: nil)

    var URL = B2MFetcher.urlForBooking(event.unique, bookingID: booking.unique)
    let request = NSMutableURLRequest(URL: URL)
    request.HTTPMethod = "PATCH"

    // Headers
    println(token)
    request.addValue(token, forHTTPHeaderField: "Authorization")
    request.addValue("gzip, identity", forHTTPHeaderField: "Accept-Encoding")

    // JSON Body
    let bodyObject = [
        "op": "cancel"
    ]
    var jsonError: NSError?
    request.HTTPBody = NSJSONSerialization.dataWithJSONObject(bodyObject, options: nil, error: &jsonError)

    /* Start a new Task */
    let task = session.dataTaskWithRequest(request, completionHandler: { (data : NSData!, response : NSURLResponse!, error : NSError!) -> Void in
        completion(data: data, response:response , error: error)
    })
    task.resume()
3个回答

4
你可以尝试在请求中添加Content-Type头部:

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

或者使用其他在这里描述的JSON Content-Type格式之一。

我用ExpressJS服务器测试了一下,没有Content-Type头信息,服务器返回一个空的body,但是有Content-Type头信息时它可以正常工作。


3

在Swift 3/4中:

 let request = NSMutableURLRequest(url: NSURL(string: "http://XXX/xx/xxx/xx")! as URL)
        request.httpMethod = "PATCH"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        do{

           let json: [String: Any] = ["status": "test"]
           let jsonData = try? JSONSerialization.data(withJSONObject: json)
            request.httpBody = jsonData
            print("jsonData: ", String(data: request.httpBody!, encoding: .utf8) ?? "no body data")
        } catch {
            print("ERROR")
        }

        let task = URLSession.shared.dataTask(with: request as URLRequest) {
            data, response, error in

            if error != nil {
                print("error=\(error)")
                completion(false)
                return
            }

            let responseString = NSString(data: data!, encoding:            String.Encoding.utf8.rawValue)
            print("responseString = \(responseString)")
            completion(true)
            return
        }
        task.resume()

1

使用patch的简单方法而不使用HTTPBody

如果您只想使用patch,您只需要更改特定用户的名称值,就像这样:

let myurl = URL(string: "https://gorest.co.in/public-api/users/"+"\(id)?"+"name=abc")!

var request = URLRequest(url:myurl)
request.addValue("Bearer yourAuthorizationToken",forHTTPHeaderField:"Authorization")
request.httpMethod = "PATCH"

let dataTask = URLSession.shared.dataTask(with: request)
dataTask.resume()

注意:这里的“id”将会被替换为userId

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