2016-11-22 3 views
-1

私はGETメソッドでコードをフェッチするのにjsonを働いていますが、追加するとPOSTに変換します。URLRequestのSwift 3でhttpMethod = POSTを使用するには?

request.httpMethod = "POST" 

私には、

はプロパティに割り当てることができません:「HTTPMETHOD」それを修正する方法を以下の下

私のコードのget専用プロパティのエラーですか?どのように私はそれは私が行う必要がある変更POST方法のために、parametersget方法私の変数については、以下の下でも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 
    } 

に私の呼び出し元のコードを変換することができますか?あなたはhttpMethodを変更できるようにNSMutableURLRequestを使用する必要が

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'(もっとスウィフト的なもの)を使わないのですか? – Larme

答えて

2

NSURLRequestを使用しないでください。

例:追加の改善と

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 
} 

EDIT: は答えることが

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

しかし、より良い、あなたはURLRequest構造体を使用する必要がありますあなたの第二の部分。それはあなたの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?Mobile = \(self.phone.text)"これのように、しかしポストではどうすればそれらを送ることができますか? – SwiftDeveloper

+0

私は自分の質問を更新しました。投稿にメソッドコードを追加しましたか?どのように変数を送信できますか?どのような私は変更する必要がありますか? – SwiftDeveloper

+0

それはあなたがそれらを送信する必要があるかどうかに依存します - どんなタイプのエンコーディングなどですが、基本的に 'request.httpBody'に追加します – Krodak

関連する問題