2015-07-03 149 views
3

我試圖發送帶有序列化JSON正文的Patch請求。在Swift中使用PATCH的HTTP請求正在使用PATCH

由於某些原因,服務器無法正常接收身體。我有一種感覺,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() 

回答

2

你可以嘗試一個Content-Type頭添加到請求:

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

或使用其他JSON內容類型格式之一描述here

我用一個ExpressJS服務器測試了它,沒有Content-Type頭,服務器得到一個空體,但是Content-Type頭很好地運行。

+0

要命,工作就像一個魅力! – DamirDiz

0

在迅速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()