2017-01-10 70 views
0

我試圖瞭解xcode 8 swift 3中的post請求的過程。如何在xcode 8 swift 3中將字段值傳遞爲字符串類型?

我設法通過將值添加到「paramString」來手動發佈數據。

我的問題是,如果輸入數據來自textfield如何傳遞數據?

我把它命名爲usernameTxtpasswordTxt。如何使用下面的代碼將這些值傳遞給PHP MySQL?

「paramString」將是如果視圖控制器有多個文本字段輸入到Web服務?

到目前爲止我的代碼如下

import UIKit 
class ViewController: UIViewController { 

    @IBOutlet var usernameTxt: UITextField! 
    @IBOutlet var passwordTxt: UITextField! 
    @IBOutlet var loginButton: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
    @IBAction func sendData(_ sender: Any) { 
     data_request("http://localhost/send.php") 
    } 
    func data_request(_ url:String) 
    { 
     let name = usernameTxt.text 
     let pass = passwordTxt.text 

     let url:NSURL  = NSURL(string: url)! 
     let session   = URLSession.shared 

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

     let paramString  = "data=" + name! 
     // let paramString = "data=" + name! + "data2=" + pass! //this line does not work 
     request.httpBody = paramString.data(using: String.Encoding.utf8) 

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

      guard let _:NSData = data as NSData?, let _:URLResponse = response, error == nil else { 
       print("Error") 
       return 
      } 

      if let dataString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue){ 
       print(dataString) 
      } 
     } 
     task.resume() 
    } 
} 
+0

你可能想看看API refernce爲['UITextField'(https://developer.apple.com/reference/uikit/uitextfield) – MadProgrammer

+0

感謝您的答覆,:)。 。我仍然試圖理解這個概念和流程。 。同時,也許有人可以快速回答如何將這些usernameTxt,passwordTxt值分配給「let StringParam」..上面的代碼,只需要最後一次觸摸。 – AlotJai

+0

它看起來像我只能傳遞一個字符串變量像這樣let name = usernameTxt.text,讓paramString =「data =」+ name! 。我不知道如何傳遞這兩個值。 – AlotJai

回答

0

usernameTxt.textpasswordTxt.text

+0

你能分享或更新我的上述代碼的答案?我不知道在哪裏以及如何投入這些價值。我在這個ios開發中很初學。仍然很難理解流程和概念。謝謝。 – AlotJai

+0

這是這樣嗎?讓paramString =「data =」+ usernameTxt.text! – AlotJai

-1
 You can try this code for api request with parameter 
      let user_id = 1 
      let name = 'test' 
     let post:NSString = "id=\(user_id)&name=\(name)" as NSString 
        let url:URL = URL(string:"ADD YOUR URL HERE")! 
        let postData:Data = post.data(using: String.Encoding.ascii.rawValue)! 
        let postLength:NSString = String(postData.count) as NSString 

        let request:NSMutableURLRequest = NSMutableURLRequest(url: url) 
        request.httpMethod = "POST" 
        request.httpBody = postData 
        request.setValue(postLength as String, forHTTPHeaderField: "Content-Length") 
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
        request.setValue("application/json", forHTTPHeaderField: "Accept") 

        var reponseError: NSError? 
        var response: URLResponse? 

        var urlData: Data? 
        do { 
         urlData = try NSURLConnection.sendSynchronousRequest(request as URLRequest, returning:&response) 
        } catch let error as NSError { 
         reponseError = error 
         urlData = nil 
        } 

        if (urlData != nil) { 
         let res = response as! HTTPURLResponse!; 

         if ((res?.statusCode)! >= 200 && (res?.statusCode)! < 300) 
         {} 

    } 
+0

它是異步的嗎? – AlotJai

+0

是的,它是異步請求 –

+0

你的建議只使用一個變量。你能爲兩個變量輸入更新你的答案嗎?謝謝 。 。 – AlotJai

0

的參數字符串的POST請求格式必須是

key1=value&key2=value2 

一種方便的方法來創建該字符串是String Interpolation

let paramString = "data=\(name)&data2=\(pass)" 

這是很好的編程習慣來檢查text屬性是不是nil而不是空的。進一步在Swift 3中使用本機結構URLURLRequest

順便說一句Swift不是PHP。命名慣例是使用駱駝事件。

... 
@IBAction func sendData(_ sender: AnyObject) { 
    dataRequest("http://localhost/send.php") 
} 

func dataRequest(_ url:String) 
{ 
    guard let name = usernameTxt.text, !name.isEmpty, 
     let pass = passwordTxt.text, !pass.isEmpty else { return } 

    let url = URL(string: url)! 
    let session = URLSession.shared 

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

    let paramString = "data=\(name)&data2=\(pass)" 
    request.httpBody = paramString.data(using: .utf8) 

    let task = session.dataTask(with: request) { (data, response, error) in 

     guard error == nil else { 
      print("Error: ", error!) 
      return 
     } 

     if let dataString = String(data: data!, encoding: .utf8) { 
      print(dataString) 
     } 
    } 
    task.resume() 
} 
相關問題