swift - URLSession POST 调用
问题描述
我对 URLSession 没有太多经验,但我正在尝试进行 POST 调用,但我不断收到两个不同的错误。
这是我的功能:
func test() {
let parameters = ["username": "myUsername", "password": "myPassword"]
guard let url = URL(string: "https://example.com:443/Auth/") else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) else { return }
request.httpBody = httpBody
let session = URLSession.shared
session.dataTask(with: request) { (data, response, error) in
if let response = response {
print(response)
}
if let data = data {
do {
let json = try JSONSerialization.jsonObject(with: data, options: [])
print(json)
} catch {
print(error)
}
}
}.resume()
}
这是我遇到的错误:
这第一个有一个堆栈溢出链接:CredStore Perform Query error。我添加了他们说要添加的代码,但我最终遇到了同样的错误。
CredStore - performQuery - Error copying matching creds. Error=-25300, query = {
class = inet;
"m_Limit" = "m_LimitAll";
ptcl = htps;
"r_Attributes" = 1;
sdmn = "/Auth/";
srvr = "example.com";
sync = syna;
}
我得到的下一个错误是:
<NSHTTPURLResponse: 0x600000b94180> { URL: https://example.com:443/Auth/ } { Status Code: 401, Headers {
"Content-Length" = (
31
);
"Content-Type" = (
"text/plain"
);
Date = (
"Mon, 24 Sep 2018 23:16:45 GMT"
);
"Www-Authenticate" = (
"Basic realm=\"/Auth/\""
);
} }
Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}
我收到 401 未经授权的错误。我看到它给我 401 的唯一原因是它没有正确读取用户名/密码?我不能 100% 确定标题“用户名”和“密码”是否正确。实际的用户名和密码绝对正确。
解决方案
对于遇到此问题的人:
我弄清楚出了什么问题:
func test() {
let username = "myUsername"
let password = "myPassword"
let loginString = String(format: "%@:%@", username, password)
let loginData = loginString.data(using: String.Encoding.utf8)!
let base64LoginString = loginData.base64EncodedString()
let url = URL(string: "https://example.com:443/Auth/")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")
let session = URLSession.shared
session.dataTask(with: request) { (data, response, error) in
if let response = response {
print(response)
}
if let data = data {
do {
let json = try JSONSerialization.jsonObject(with: data, options: [])
print(json)
} catch {
print(error)
}
}
}.resume()
}
我的用户名和密码以纯文本形式发送。必须将我的凭据编码为 base64。
推荐阅读
- javascript - 如何将日期从 2018-04-29 格式转换为 29 Apr,2018 格式?
- javascript - d3.js 上的双面树
- javascript - 通过js键码允许带有数值的点/句号
- ios - ViewModel 函数:无法赋值:'error' 是 'let' 常量
- python - 引用和打印字典中的值 (Python)
- spring - 如何将 JWT 令牌用于 Spring Boot 安全性
- c# - Nethereum C# 自动以太传输
- python - Python/Django/Q 搜索,如何查找 B 字段信息。通过搜索A字段信息
- c# - 如何获取特定的标签?
- apache - 虚拟主机重定向在 apache 中不起作用