2016-11-22 67 views
-1

我有工作json獲取代碼與GET方法,但當我把它轉換爲POST加入;如何在Swift 3上使用httpMethod = POST,URLRequest?

request.httpMethod = "POST" 

給我;

無法指定屬性:「列舉HTTPMethod」是隻得到屬性下的錯誤下面該如何解決

我的代碼?我怎樣才能將其轉換爲POST

@discardableResult 
    open func getLoginMethod(_ method: String, parameters: String, completionHandler: @escaping (_ login: [Login]?, _ error: Error?) -> Void) -> URLSessionTask! { 
     let session = URLSession.shared 
     guard let url = NSURL(string: parameters) else { 
      completionHandler(nil, myErrors.InvalidUrlError) 
      return nil 
     } 
     let request = NSURLRequest(url: url as URL) 

     let task = session.dataTask(with: request as URLRequest) { data, response, error in 
      if error != nil { 
       completionHandler(nil, myErrors.getError) 
      } else { 
       do { 
        let login = try self.getLogin(jsonData: data! as NSData) 
        completionHandler(login, nil) 
       } catch { 
        completionHandler(nil, error) 
       } 
      } 
     } 
     task.resume() 

     return task 
    } 

而且我的呼喚下的代碼下面get方法我的變量裏面parameters,爲POST方法,它改變了我需要做什麼?

AWLoader.show(blurStyle: .dark, shape: .Circle) 

     DispatchQueue.global(qos: .background).async { 
      myApp.sharedInstance().getLoginMethod("", parameters: "http://bla.com/Post?Phone=\(self.phone.text)") {login, error in 
       if error != nil { 
        DispatchQueue.main.async { 
         // self.showAlert() 

         print(error!) 

         AWLoader.hide() 
        } 
       } else { 
        DispatchQueue.main.async { 
         self.getlogin = login! 
         // self.collectionView.reloadData() 
         //  AWLoader.hide() 

         // self.loginButton.alpha = 0 
         print(self.getlogin) 


         AWLoader.hide() 
        } 
       } 
      } 


     } 

感謝

+1

'NSURLRequest'不可變,'NSMutableURLRequest'是。你爲什麼不使用'URLRequest'(更像Swift)? – Larme

回答

2

您需要使用NSMutableURLRequest才能夠修改httpMethod。使用NSURLRequest不會。

例子:

let request = NSMutableURLRequest(url: url) 
request.httpMethod = "POST" 

但更好的是,你應該使用URLRequest結構:

var request = URLRequest(url: url) 
request.httpMethod = "POST" 

你的重構的代碼與額外的改進:

@discardableResult 
open func getLoginMethod(_ method: String, parameters: String, 
        session: URLSession = .shared, 
        completionHandler: @escaping (_ login: [Login]?, _ error: Error?) -> Void) -> URLSessionTask! { 

    guard let url = URL(string: parameters) else { 
     completionHandler(nil, myErrors.InvalidUrlError) 
     return nil 
    } 
    var request = URLRequest(url: url) 
    request.httpMethod = method 
    let task = session.dataTask(with: request) { data, _, _ in 
     guard let responseData = data else { 
      completionHandler(nil, myErrors.getError) 
      return 
     } 
     do { 
      let login = try self.getLogin(jsonData: data as NSData) 
      completionHandler(login, nil) 
     } catch { 
      completionHandler(nil, error) 
     } 
    } 
    task.resume() 

    return task 
} 

編輯: 要回答你問題的第二部分。這取決於您的API期望的數據格式 - 它是否應該是multipart/form-datajson格式,這一切都取決於。 但在一般情況下,假設你使用的是我已經提到URLRequest結構,你應該只是它使用串行轉換爲Data,並使用它像這樣:

var request = URLRequest(url: url) 
request.httpMethod = "POST" 
request.httpBody = <your parameters converted to Data> 

通常情況下,你的API會期望適當Content-Type頭添加到您的URLRequest

request.setValue("application/json", forHTTPHeaderField: "Content-Type") 
+0

ty但我怎麼發送varibles?通常我發送他們內部參數:「http://bla.comPostMember?移動= \(self.phone.text)」這樣但在後我怎麼能發送他們? – SwiftDeveloper

+0

我更新了我的問題,我在帖子上添加了調用方法代碼?我如何發送變量?哪些我需要改變? – SwiftDeveloper

+0

這取決於你需要怎麼發送它們 - 什麼類型的編碼等,但基本上你可以將它們添加到'request.httpBody' – Krodak