繁体   English   中英

Swift-将数组作为POST请求参数发送到PHP

[英]Swift - Send an array as POST request parameter to PHP

我正在使用Swift开发一个应用程序。 我需要从该应用程序调用PHP Web服务。

以下Web服务代码:

//  ViewController.swift
//  SwiftPHPMySQL
//
//  Created by Belal Khan on 12/08/16.
//  Copyright © 2016 Belal Khan. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

//URL to our web service
let URL_SAVE_TEAM = "http://192.168.1.103/MyWebService/api/createteam.php"


//TextFields declarations
@IBOutlet weak var textFieldName: UITextField!
@IBOutlet weak var textFieldMember: UITextField!



//Button action method
@IBAction func buttonSave(sender: UIButton) {

    //created NSURL
    let requestURL = NSURL(string: URL_SAVE_TEAM)

    //creating NSMutableURLRequest
    let request = NSMutableURLRequest(URL: requestURL!)

    //setting the method to post
    request.HTTPMethod = "POST"

    //getting values from text fields
    let teamName=textFieldName.text
    let memberCount = textFieldMember.text

    //creating the post parameter by concatenating the keys and values from text field
    let postParameters = "name="+teamName!+"&member="+memberCount!;

    //adding the parameters to request body
    request.HTTPBody = postParameters.dataUsingEncoding(NSUTF8StringEncoding)


    //creating a task to send the post request
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request){
        data, response, error in

        if error != nil{
            print("error is \(error)")
            return;
        }

        //parsing the response
        do {
            //converting resonse to NSDictionary
            let myJSON =  try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary

            //parsing the json
            if let parseJSON = myJSON {

                //creating a string
                var msg : String!

                //getting the json response
                msg = parseJSON["message"] as! String?

                //printing the response
                print(msg)

            }
        } catch {
            print(error)
        }

    }
    //executing the task
    task.resume()

}


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

我有这个数组:

let arr = ["aaa", "wassd", "wesdsd"]

现在我需要将此数组作为参数发送:

let postParameters = "name="+teamName!+"&member="+memberCount!;

我已经做到了:

let postParameters = "name="+teamName!+"&member="+memberCount!+"&arr="+arr;

但出现此错误:

表达时间太长,无法在合理的时间内解决。 考虑将表达式分成不同的子表达式。

任何帮助,将不胜感激。

对于您要确切实现的目标有些困惑,但是似乎您正在尝试以form-url-encoded请求发送数组,但这不是它的工作原理。

您既可以遍历数组,也可以将它们分别分配给request参数中的值,如下所示:

var postParameters = "name=\(teamName)&member=\(member)"
let arr = ["aaa", "wassd", "wesdsd"]
var index = 0

for param in arr{
    postParameters += "&arr\(index)=\(item)"
    index++
}
print(postParameters) //Results all array items as parameters seperately 

当然,这是一种肮脏的解决方案,并假设我对您尝试错误地发送数组是正确的。 如果可能的话,我会将请求作为application/json请求发送,因为这样可以使事情变得更加容易和肮脏:

func sendRequest() {

    let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration()

    /* Create session, and optionally set a NSURLSessionDelegate. */
    let session = NSURLSession(configuration: sessionConfig, delegate: nil, delegateQueue: nil)


    guard var URL = NSURL(string: "http://192.168.1.103/MyWebService/api/createteam.php") else {return}
    let request = NSMutableURLRequest(URL: URL)
    request.HTTPMethod = "POST"

    // Headers

    request.addValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")

    // JSON Body

    let bodyObject = [
        "name": "\(teamName)",
        "member": "\(member)",
        "arr": [
            "aaa",
            "wassd",
            "wesdsd"
        ]
    ]
    request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(bodyObject, options: [])

    /* Start a new Task */
    let task = session.dataTaskWithRequest(request, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
        if (error == nil) {
            // Success
            let statusCode = (response as! NSHTTPURLResponse).statusCode
            print("URL Session Task Succeeded: HTTP \(statusCode)")
        }
        else {
            // Failure
            print("URL Session Task Failed: %@", error!.localizedDescription);
        }
    })
    task.resume()
    session.finishTasksAndInvalidate()
}

希望这可以帮助您朝正确的方向发展。 祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM