Swift 3 URLSession 发送空请求

Posted

技术标签:

【中文标题】Swift 3 URLSession 发送空请求【英文标题】:Swift 3 URLSession sending empty request 【发布时间】:2016-12-17 05:08:56 【问题描述】:

我无法让 URLSession 在 POST 请求的正文中发送任何内容。

这是我的代码:

// Set up the request
var request = URLRequest(url: URL(string: baseURL + url)!)
request.httpMethod = "POST"
let jsonData = try JSONSerialization.data(withJSONObject: values,
                                                  options: .prettyPrinted)
request.httpBody = jsonData
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
let config = URLSessionConfiguration.ephemeral
let session = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.main)
let task = session.dataTask(with: request)  data, response, err in
    if let err = err 
        print(err)
    
    else 
        let jsondata = data!
        do 
            let sessionData =
                        try JSONSerialization.jsonObject(with: jsondata, options: .mutableLeaves)
                            as? Dictionary<String, String>
            callback.taskComplete(response: sessionData, task: task)
        
        catch 
            print(error)
        
    

task.resume()

服务器接收到请求,但是正文为空,内容类型标头为空。我不能使用默认会话,因为我正在使用自签名证书进行开发,所以我需要我的班级成为 URLSession 委托。

我正在使用 Swift 3、XCode 8 和 ios 10。任何帮助将不胜感激。

【问题讨论】:

jsonData 属性中真的有数据吗? 在 jsondata 调试您的项目或打印并检查日志 一切看起来都不错,唯一可能有问题的是你的httpBody request.HTTPBody = jsonData 替换你的行。 @HimanshuMoradiya - HTTPBody 是 Swift 2.3。在 Swift 3 中,它是 httpBody 【参考方案1】:

问题解决了。这是错误的组合。如果 URL 没有结尾的“/”,Jetty 会发送一个 302 重定向到相同的 URL,并附加斜杠。 iOS 客户端使用“GET”进行重定向,因此正文中没有任何内容。当我添加尾随“/”时,请求工作正常。

我希望这个答案能对做 iOS 开发的人有所帮助。在发布这个问题之前,我在 Google 上搜索了几个小时。我终于在一篇关于 Apache Java HttpClient 的帖子中找到了答案。它具有相同的行为。

感谢大家的回复。

【讨论】:

以上是关于Swift 3 URLSession 发送空请求的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 - 发送make同步http请求

使用 URLSession 将数据获取到 PHP 方法 - swift

如何在 Swift 3 中使用带有代理的 URLSession

通过证书进行客户端身份验证的 Swift 3 UrlSession

迁移到 Swift3 的问题,URLSession.GET 的编译错误

Swift POST 请求发送一个空的正文