如何在 request.http POST 方法的正文中传递动态参数

Posted

技术标签:

【中文标题】如何在 request.http POST 方法的正文中传递动态参数【英文标题】:How to pass dynamic parameters in requst.httpBody of POST method 【发布时间】:2016-12-21 13:07:51 【问题描述】:

在 xcode 7.3 我更新到 xcode 8.2 和 swift 3 之前,我一直可以正常访问我的网络服务,现在我的应用程序崩溃了,这是我的代码

func jsonParsingFromURL () throws 

    let WSLink = "http://XXXXX.co/itXXXXMS/webservice.asmx/GXXXXXX"
    let url = URL(string: WSLink)
    let bodyData = "lastlogindate=\(todayDate)&CompanyId=\(compID)"  //problem is here

    let request:NSMutableURLRequest = NSMutableURLRequest(url:url!)
    request.httpMethod = "POST"
    request.httpBody = bodyData.data(using: String.Encoding.utf8);

    NSURLConnection.sendAsynchronousRequest(request as URLRequest, queue: OperationQueue.main) (response, data, error) in

        guard let _ = data else  return 
        self.startParsing(data!)
    


func startParsing(_ data :Data) 

    //Am getting error here in this line
    let dict: NSDictionary!=(try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers)) as! NSDictionary  
    arrDict.removeAllObjects()

    for i in 0  ..< (dict.value(forKey: "results") as! NSArray).count 
        arrDict.add((dict.value(forKey: "results") as! NSArray) .object(at: i))
    

json 文本不是以数组或对象开头,并且选项允许 片段未设置

其实我找到了错误的原因,但不知道如何解决它。

当我写为时,让 bodyData = "lastlogindate=26/11/2016&CompanyId=3" //它正在工作。

当我将参数包装在来自先前视图控制器的动态变量中时,例如

让 date = "26/11/2016",让 id = "3" 和

let bodyData = "lastlogindate=(date)&CompanyId=(id)" 然后出现错误。

所以基本上我的问题是如何在 swift 3 中将动态变量包装到 request.httpBody 中?

【问题讨论】:

但在 swift 2.2 之前它工作正常 昨天我更新了 xcode,今天它给出了这个错误,swift 3 有什么改变吗? 那你有什么建议? 我在浏览器中测试了它的工作原理 尝试将序列化中的options设置为.allowFragments 【参考方案1】:

我的问题是在将参数传递给bodyData时出现在这一行:

let bodyData = "lastlogindate=\(todayDate)&CompanyId=\(compID)"

//example lastlogindate = "12/24/2016" and CompanyId = 134

当我执行print(bodyData) 时,我得到的输出为 "lastlogindate=可选(12/24/2016)&CompanyId=可选(134)"

我不知道为什么在 Swift 3 中添加了 optional。 在 Swift 2.2 中,它没有添加 optional

所以,我做的是

let bodyData = "lastlogindate=" + todayDate + "&CompanyId=" + compID

现在,当我执行 print(bodyData) 时,它会给我正确的输出

lastlogindate=12/24/2016&CompanyId=134.

【讨论】:

以上是关于如何在 request.http POST 方法的正文中传递动态参数的主要内容,如果未能解决你的问题,请参考以下文章

400 Bad Request HTTP Response 使用 WCF POST 通过 JQuery

alamofire post 方法中的 response.result.value 为 nil

HTTP 多部分 (POST) 请求中的边界参数是啥?

nginx基础学习第二篇:nginx内置变量的使用

scrapy发送post请求获取cookie

HTTP Request