【问题标题】:Base64Encoded JSON data as param in URLRequest in swift 5Base64Encoded JSON 数据作为 swift 5 中 URLRequest 中的参数
【发布时间】:2019-11-28 19:13:26
【问题描述】:

我需要在我正在开发的 swift 应用程序中发出 API 请求,要求是,它需要先进行 json 编码,然后再进行 base 64 编码。

我以为我已经弄明白了,但是我在 Xcode 中收到一个错误提示

无法将“字符串”类型的值分配给“数据”类型?

这是我正在做的简化版本...

let params: [String: Any] = ["connection_id": 123456]
var request = URLRequest(url: url!) //url is stored as a variable in my class
let jsonData = try? JSONSerialization.data(withJSONObject: params)
request.httpMethod = "POST"
request.httpBody = Data(jsonData!).base64EncodedString() //<--This is where the error is
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
//send out the request with URLSession.shared.dataTask

如果 Xcode 告诉我类型必须是 Data,我如何才能将 json 对象的 base64 编码字符串作为请求中的参数?

【问题讨论】:

    标签: json swift base64 urlsession


    【解决方案1】:

    base64EncodedString 在 httpBody 期待 Data 时返回一个字符串。你只需要改用base64EncodedData

    另外,请注意,天哪,这段代码很危险。如此多的强制展开(使用感叹号)。我建议学习如何避免在绝大多数地方使用强制展开。

    编辑:由于它返回可选数据,因此您需要将其解包。对强制展开的轻微改进是提供一个空主体的默认值:

    request.httpBody = jsonData?.base64EncodedData() ?? Data()
    

    【讨论】:

    • 似乎使用 base64EncodedData 给了我“可选(44 字节)”而不是实际数据。
    • @NeglectedSanity 那是因为它是可选数据,我更新了我的答案来告诉你如何处理
    • 这是有道理的。谢谢你。错误消失了,但现在我的服务器显示一个空数组作为 POST。使用我最初的问题并更新您的答案,我可以发送请求,但在服务器上我有一个简单的“print_r($_POST, true);”它显示一个空数组,就像应用程序实际上没有发送任何东西一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    相关资源
    最近更新 更多