Ios 如何在Swift中发送POST参数?

Ios 如何在Swift中发送POST参数?,ios,swift,Ios,Swift,下面是一些代码: var URL: NSURL = NSURL(string: "http://stackoverflow.com") var request:NSMutableURLRequest = NSMutableURLRequest(URL:URL) request.HTTPMethod = "POST" request.HTTPBody = ?????? NSURLConnection.sendAsynchronousRequest(request, queue: NSOperat

下面是一些代码:

var URL: NSURL = NSURL(string: "http://stackoverflow.com")
var request:NSMutableURLRequest = NSMutableURLRequest(URL:URL)
request.HTTPMethod = "POST"
request.HTTPBody = ?????? 
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) 
{
    (response, data, error) in
    println(NSString(data: data, encoding: NSUTF8StringEncoding))
}

如果我想发送POST查询
“key”=“value”
,我应该在
request.HTTPBody
中写什么?

与Objective-C中相同,HTTPBody需要一个NSData对象:

var bodyData = "key1=value&key2=value&key3=value"
request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding);
您必须自己在字符串中设置值和键。

var post:NSString=“api=myposts&userid=\(uid)&page\u no=0&limit\u no=10”
 var post:NSString = "api=myposts&userid=\(uid)&page_no=0&limit_no=10"

    NSLog("PostData: %@",post);

    var url1:NSURL = NSURL(string: url)!

    var postData:NSData = post.dataUsingEncoding(NSASCIIStringEncoding)!

    var postLength:NSString = String( postData.length )

    var request:NSMutableURLRequest = NSMutableURLRequest(URL: url1)
    request.HTTPMethod = "POST"
    request.HTTPBody = postData
    request.setValue(postLength, forHTTPHeaderField: "Content-Length")
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.setValue("application/json", forHTTPHeaderField: "Accept")


    var reponseError: NSError?
    var response: NSURLResponse?

    var urlData: NSData? = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&reponseError)

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

        NSLog("Response code: %ld", res.statusCode);

        if (res.statusCode >= 200 && res.statusCode < 300)
        {
            var responseData:NSString  = NSString(data:urlData!, encoding:NSUTF8StringEncoding)!

            NSLog("Response ==> %@", responseData);

            var error: NSError?

            let jsonData:NSDictionary = NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as NSDictionary


            let success:NSInteger = jsonData.valueForKey("error") as NSInteger

            //[jsonData[@"success"] integerValue];

            NSLog("Success: %ld", success);

            if(success == 0)
            {
                NSLog("Login SUCCESS");

                self.dataArr = jsonData.valueForKey("data") as NSMutableArray 
                self.table.reloadData()

            } else {

                NSLog("Login failed1");
            }

        } else {

            NSLog("Login failed2");

        }
    } else {

         NSLog("Login failed3");
    }
NSLog(“PostData:%@”,post); var url1:NSURL=NSURL(字符串:url)! var postData:NSData=post.dataUsingEncoding(NSASCIIStringEncoding)! 变量postLength:NSString=String(postData.length) var请求:NSMutableURLRequest=NSMutableURLRequest(URL:url1) request.HTTPMethod=“POST” request.HTTPBody=postData request.setValue(postLength,forHTTPHeaderField:“内容长度”) request.setValue(“application/x-www-form-urlencoded”,forHTTPHeaderField:“内容类型”) request.setValue(“application/json”,forHTTPHeaderField:“Accept”) var REPORNSERROR:NSError? var响应:nsurresponse? 变量urlData:NSData?=NSURLConnection.sendSynchronousRequest(请求、返回响应:&response、错误:&ResponseError) if(urlData!=nil){ 让res=响应为NSHTTPURLResponse!; NSLog(“响应代码:%ld”,res.statusCode); 如果(res.statusCode>=200&&res.statusCode<300) { var responseData:NSString=NSString(数据:urlData!,编码:NSUTF8StringEncoding)! NSLog(“响应==>%@”,响应数据); var错误:N错误? 让jsonData:NSDictionary=NSJSONSerialization.JSONObjectWithData(urlData!,选项:NSJSONReadingOptions.MutableContainers,错误:&error)作为NSDictionary 让success:NSInteger=jsonData.valueForKey(“错误”)作为NSInteger //[jsonData[@“success”]integerValue]; NSLog(“成功:%ld”,成功); 如果(成功==0) { NSLog(“登录成功”); self.dataArr=jsonData.valueForKey(“数据”)作为NSMutableArray self.table.reloadData() }否则{ NSLog(“登录失败1”); } }否则{ NSLog(“登录失败2”); } }否则{ NSLog(“登录失败3”); }
这对你肯定有帮助

class func postMethod (params: [String : AnyObject], apikey: String, completion: @escaping (Any) -> Void, failure:@escaping (Error) -> Void)
{
    if Utils().isConnectedToNetwork() == false
    {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: {
            Utils().HideLoader()
        })
        return
    }

    let strURL = Constants.BASE_URL + apikey
    let url = URL(string: strURL)
    print(params)
    print(strURL)

    var token = String()

    if((Constants.USERDEFAULTS .value(forKey: "token")) != nil){

        token = Constants.USERDEFAULTS.value(forKey: "token") as! String
    }
    else{
         token = ""
    }

    let headers = [
        "Authorization": "Bearer \(token)",
        "Accept": "application/json"
    ]


    let manager = Alamofire.SessionManager.default
    manager.session.configuration.timeoutIntervalForRequest = 120
    manager.request(url!, method: .post, parameters: params, headers: headers)
        .responseJSON
        {
            response in
            switch (response.result)
            {
            case .success:
                let jsonResponse = response.result.value as! NSDictionary
                print(jsonResponse)
                completion(jsonResponse)
                Utils().HideLoader()
            case .failure(let error):
                Utils().showAlert("Something went wrong")
                Utils().HideLoader()
                failure(error)
                break
        }
    }
}
更新至Swift 4.2

此代码基于pixel的答案,是对
Swift 4.2

let bodyData = "key1=value&key2=value&key3=value"
request.httpBody = bodyData.data(using: .utf8)

那怎么办?我见过这个。但我没有看到key=value的例子。只是“一些数据”。对于php,它看起来像:$\u POST['key']=“value”;只要你在SWIFT(iOS 7 +)中编写,你也可以考虑使用NSURLISTION(也就是iOS 7 +),而不是NSLLCONNECTION。请你告诉我们为什么NSURLIST比NSURLCONNED更好吗?抱歉,有人能告诉我这行是什么意思(响应、数据、错误)(data:data,encoding:NSUTF8StringEncoding))我想我做错了什么:在服务器上我只有index.php:if($\u POST['test']==“some”)echo“起作用”;else echo“不起作用”。在我的第一篇文章的代码中,我添加了您编写的其他代码:var bodyData=“some=test”。我还有“不起作用”。swift代码有问题吗?在客户端中,您应该设置key=value,因此字符串应该是test=some而不是some=testIt听起来很奇怪,但问题出在URL地址中。我在文件夹/someFolder/中有index.php,URL是:“”。当我将其更改为“”时。它可以工作。但对于第一个URL,我也得到了不正确的答案。太奇怪了。我如何通过base64图像发送?它是一个长字符串,在发送到服务器时会将其切断,即使我使用post?这不会对数据进行属性编码(转义/引用特殊字符等)。只有在原始OP请求时,才应引用第三方软件包。添加“request.setValue(“application/x-www-form-urlencoded”,forHTTPHeaderField:“Content Type”)”使所有内容都对我有效。谢谢。应该让bodyData=“key1=value&key2=value&key3=value”