2017-08-20 17 views
-1

私はAlamofireでhttp投稿要求を送信したいと思います。 sampleViewControllerにリクエストを送信し、リクエストからレスポンスを取得するコードがあります。私はサーバーからの応答を持っている問題がありますが、私はサンプルビューコントローラで応答を印刷したいとき、私の応答は常にnilを返します。サーバーから応答を受け取った後、どのように応答を確認できますか?Alamofire HTTPリクエスト

public class PersistencyManager { 

func SendPostHttpRequest(baseURL: String, parameter: [String:Any?], content: String) -> Any? { 

     let url = URL(string: Constant.baseURL) 
    var result : Any? 

     var urlRequest = URLRequest(url: url!) 
      urlRequest.setValue("text/html; charset=utf-8", forHTTPHeaderField: "Content-Type") 
      urlRequest.setURLEncodedFormData(parameters: parameter) 

      Alamofire.request(urlRequest).responseJSON { response in 

      switch response.result { 

      case .success : 


       if let JSON = response.result.value as? [String:Any] { 
       print("JSON: \(JSON)") 

       result = JSON 
       } 



      case .failure : 

       result = nil 

      } 
      } 
     default: 
      break 
     } 

     return result 

    } 
    } 


    class sampleViewController: UIViewController { 

     @IBOutlet weak var sendButton: UIButton! 
     @IBOutlet weak var centerVIew: UIView! 
     override func viewDidLoad() { 
      super.viewDidLoad() 



     } 

    @IBAction func SendRequest(_ sender: Any) { 

     let parameters = ["key":Constant.serverKey,"userid":"0" ,"action":"vitrin","step":"list","sort": nil,"filter":nil,"start":String("5"),"end":String("8")] 

     Constant.libraryAPI.parameters = parameters 
     Constant.libraryAPI.requestContent = "String" 



      let response = Constant.libraryAPI.GetAPIResponse(parameters: parameters, contentType: "String") 
     print(response) //this line call before get response from server 
    } 
    } 
+2

Alamofireは非同期を要求するのに役立ちます。これはあなたの 'SendPostHttpRequest'がすぐに戻ることを意味します。 –

+0

@OrkhanAlikhanov他のコントローラの応答をどのように処理できますか? – ava

+0

応答が届いたときに呼び出されるはずの 'SendPostHttpRequest'にクロージャを渡す必要があります。 –

答えて

1

あなたが閉鎖を必要とするが、成功であるか失敗したときに、あなたの閉鎖でerrorがnilであればAlamofireのコールバックで閉鎖を呼び出すと、その後、あなたがチェックすることができ、その後、すべてのOS OK、あなたが使用することができますJSON

func SendPostHttpRequest(baseURL: String, parameter: [String:Any?], content: String, closure:@escaping ((_ success:JSON?,_ error:NSError?) -> Void)) { 

    let url = URL(string: Constant.baseURL) 
    var result : Any? 

    var urlRequest = URLRequest(url: url!) 
    urlRequest.setValue("text/html; charset=utf-8", forHTTPHeaderField: "Content-Type") 
    urlRequest.setURLEncodedFormData(parameters: parameter) 

    Alamofire.request(urlRequest).responseJSON { response in 

     switch response.result { 

     case .success : 

      if let JSON = response.result.value as? [String:Any] { 
       print("JSON: \(JSON)") 

       closure(JSON,nil) 
      }else{ 
       closure(nil,NSError(domain: "Error in JSON parsing", code: 995, userInfo: nil)) 
      } 

     case .failure : 
      closure(nil,response.result.error) 
     } 

    } 

} 

ホープこれは

-1

@オークファンは言ったように、SendPostHttpRequestはすぐに戻ります。あなたは閉鎖するべきです。これを試してみてください:

public class PersistencyManager { 
func SendPostHttpRequest(baseURL: String, parameter: [String:Any?], content: String, withCompletionBlock completion:(@escaping(Any?) -> Swift.Void)?) { 

     let url = URL(string: Constant.baseURL) 
     var result : Any? 

     var urlRequest = URLRequest(url: url!) 
     urlRequest.setValue("text/html; charset=utf-8", forHTTPHeaderField: "Content-Type") 
     urlRequest.setURLEncodedFormData(parameters: parameter) 

     Alamofire.request(urlRequest).responseJSON { response in 

      switch response.result { 

      case .success : 


       if let JSON = response.result.value as? [String:Any] { 
        print("JSON: \(JSON)") 

        result = JSON 
       } 



      case .failure : 

       result = nil 

      } 
     } 
     default: 
     break 

     completion?(result) 
    } 

    } 
} 
+0

@NaGib ToroNgo、返事ありがとう、私はあなたのコードを試してみますが、このエラーが発生します: 'default'ラベルは 'switch'ステートメント内にしか表示されません – ava

+0

@ava内に不一致がある可能性があります。角かっこを確認してください。私はそれを実行しませんでした。問題を取り除くにはここでコメントしてください....私は修正します – Torongo

+0

@NaGib ToroNgo switch文でデフォルトを追加すると、最初にこのメソッドを呼び出しますprint(response)//この行を呼び出してからサーバから応答を取得し、 ()) そして応答を得る – ava

関連する問題