json - 如何使用不同的对象发出这个 POST 请求?
问题描述
概述:
我正在尝试发出一个 POST 请求,我之前只使用字符串完成了该请求。这一次,我有几个变量,分别是:String
、Int
和Bool
。
错误:
Cannot assign value of type [String : Any] to type Data
导致错误的行:
request.httpBody = paramToSend
问题:
- 如何将 a 转换
Dictionary
为Data
?
完整代码:
func sendComplimentAPI (message: String, recipient: Int, isPublic: Bool) {
let url = URL(string: "https://complimentsapi.herokuapp.com/compliments/send/")
let session = URLSession.shared
let preferences = UserDefaults.standard
let request = NSMutableURLRequest(url: url!)
request.addValue("\(preferences.object(forKey: "token") as! String)", forHTTPHeaderField: "Authorization")
request.httpMethod = "POST"
let paramToSend = ["message":message,"recipient":recipient,"is_public":isPublic] as [String : Any]
request.httpBody = paramToSend
let task = session.dataTask(with: request as URLRequest, completionHandler: {
(data, response, error) in
guard let _:Data = data else {return}
let json:Any?
do{json = try JSONSerialization.jsonObject(with: data!, options: [])}
catch {return}
guard let server_response = json as? NSDictionary else {return}
if let session_data = server_response["id"] as? String {
print("worked")
//do something
/*DispatchQueue.main.async (
execute:
)*/
} else {
print("error")
}
})
task.resume()
}
编辑:
我已经尝试过这个新代码,但它仍然没有发布到服务器。我附上了我所做的更改,并为我所做的两张打印写了控制台显示的内容。
let paramToSend = ["message":writeTextField.text!,"recipient":1,"is_public":isPrivate] as [String : Any] //messageString + recipientString + isPublicString
do {
var serialized = try JSONSerialization.data(withJSONObject: paramToSend, options: .prettyPrinted)
print(serialized)
request.httpBody = serialized
print(request.httpBody)
} catch {
print("found a problem")
}
控制台返回(序列化,然后是 HTTP 正文): 113 字节 可选(113 字节)
这是可选的导致问题吗?我如何解决它?
解决方案
要转换Dictionary
为Data
,请使用JSONSerialization.data
:
解决方案:
JSONSerialization.data(withJSONObject: paramToSend, options: .prettyPrinted)
检查请求:
- 打印请求,看看它是否符合您的期望
阅读回复:
//Check if there is any error (check if error != nil)
//Examine the response
let statusCode = (response as? HTTPURLResponse)?.statusCode
let statusCodeDescription = (response as? HTTPURLResponse)?.localizedString(forStatusCode: httpResponse.statusCode)
//Check Data
if let data = data {
let dataString = String(data: data, encoding: String.Encoding.utf8)
}
推荐阅读
- r - 如何计算数据框中两个日期之间的值?
- qutip - QuTiP TypeError:与张量积不兼容的 Qobj 形状
- android - “模拟位置应用”出现在列表中但无法选择
- javascript - 表单的 Web 自动化因设置输入值而失败
- laravel - Laravel 资源 - 如何检查给定值是否存在?
- javascript - 当成员加入服务器时尝试添加角色
- c++ - 完成搜索任务的空输出文件
- javascript - 如果我们已经将 dispatch 作为 props,为什么还需要 mapDispatchToProps?
- arcore - Google 增强图像页面上的增强图像示例
- python - Maya python找到最近的顶点以将变形器贴图从一个几何体复制到另一个几何体