【问题标题】:Swift HTTP POST request with Combine使用组合的 Swift HTTP POST 请求
【发布时间】:2021-07-18 09:35:41
【问题描述】:

在我的应用程序中,我使用 Combine 框架发出网络请求,它适用于 GET 请求。但我在 POST 请求中遇到了这个问题。

以下代码(没有合并)可以正常工作:

let data = ["statusTime": DateFormatter.iso8601Full.string(from: Date())]
let requestBody = try? JSONSerialization.data(withJSONObject: data, options: [])
let baseURL = "my-api.amazonaws.com"
let endpoint = "/my/endpoint"

var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = baseURL
urlComponents.path = endpoint
let url = urlComponents.url!
var request = URLRequest(url: url)

request.httpMethod = "POST"
request.httpBody = requestBody

request.addValue(authorizationToken, forHTTPHeaderField: "Authorization")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")

let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    if let error = error {
        print("error: \(error)")
        return
    }
    print("Response: \((response as! HTTPURLResponse).statusCode)")
}
task.resume()

我从上面的代码中得到一个 200 响应代码。

与 Combine 相同的代码:

let data = ["statusTime": DateFormatter.iso8601Full.string(from: Date())]
let requestBody = try? JSONSerialization.data(withJSONObject: data, options: [])
let baseURL = "my-api.amazonaws.com"
let endpoint = "/my/endpoint"

var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = baseURL
urlComponents.path = endpoint
let url = urlComponents.url!
var request = URLRequest(url: url)

request.httpMethod = "POST"
request.httpBody = requestBody

request.addValue(authorizationToken, forHTTPHeaderField: "Authorization")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")

let cancellable = URLSession.shared
    .dataTaskPublisher(for: request)
    .print()
    .sink(receiveCompletion: {
        if let error = $0.error {
            print("Failure: \(error)")
        }
    }, receiveValue: {
        print("\($0)")
    })

这是我收到的输出:

receive subscription: (DataTaskPublisher)
request unlimited
receive cancel

似乎使用 Combine 框架的请求以某种方式被取消了?我使用了一个网络跟踪应用程序,我可以看到第一个请求(没有合并),但看不到第二个请求。

我查看了许多帖子和文档,但看不出我的代码有什么问题。我错过了什么?提前致谢。

【问题讨论】:

    标签: swift post combine


    【解决方案1】:

    我看到您正在创建cancellable,但您是否对它进行了强烈引用?看起来您正在创建请求,然后可取消对象超出范围并被释放,从而取消了请求。

    在你的课堂上声明这样的事情:

    var cancellables = Set<AnyCancellable>()
    

    然后您将可取消的内容隐式存储为:

    URLSession.shared // You don't hold on to the returned cancellable here
        .dataTaskPublisher(for: request)
        .print()
        .sink(receiveCompletion: {
            if let error = $0.error {
                print("Failure: \(error)")
            }
        }, receiveValue: {
            print("\($0)")
        })
        .store(in: &cancellables) // This puts the cancellable into the variables so it stays in scope
    

    【讨论】:

    • 就是这样!感谢您指出这一点!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 2020-05-17
    • 1970-01-01
    • 2014-12-14
    相关资源
    最近更新 更多