您好,开发人员正在尝试使用带有用户名和密码的基本身份验证来执行类似邮递员的请求,但我无法存档,这是到目前为止我所做的事情
首先我尝试这种方式
func postDataFormRequest(resource: TokenRequest, completion: @escaping (Result<Token, NetworkError>) -> Void) {
let headers = [
"Username": "example_api",
"Password": "example_api_password",
"Content-Type": "application/form-data"
]
//this information comes from TokenRequestStruct once i call it form my VC
let body = "grant_type=\(resource.grant_type)&username=\(resource.username)&password=\(resource.password)"
guard let url = URL(string: "example/") else { return }
var request = URLRequest(url: url)
request.httpMethod = HTTPMethods.POST
request.timeoutInterval = 60
request.httpBody = body.data(using: .utf8)
request.allHTTPHeaderFields = headers
URLSession.shared.dataTask(with: request) { (data, response, error) in
guard let data = data, error == nil else {
completion(.failure(.domainError))
return
}
let result = try? JSONDecoder().decode(Token.self, from: data)
if let result = result {
DispatchQueue.main.async {
completion(.success(result))
}
} else {
DispatchQueue.main.async {
completion(.failure(.decodingError))
}
}
}.resume()
}
使用此方法的响应=
CredStore - performQuery - Error copying matching creds.
Error=-25300, query={
atyp = http;
class = inet;
"m_Limit" = "m_LimitAll";
ptcl = http;
"r_Attributes" = 1;
sdmn = "oauth2/client";
srvr = "3.216.253.237";
sync = syna;
}
试图通过使用任意载荷来修复它=是 没用
第二种方式
static func getPostString(params:[String:Any]) -> String
{
var data = [String]()
for(key, value) in params
{
data.append(key + "=\(value)")
}
return data.map { String($0) }.joined(separator: "&")
}
static func formData(url:URL, params:[String:Any], finish: @escaping ((message:String, data:Data?)) -> Void)
{
var request = URLRequest(url: url)
request.httpMethod = "POST"
let postString = self.getPostString(params: params)
request.httpBody = postString.data(using: .utf8)
var result:(message:String, data:Data?) = (message: "Fail", data: nil)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if(error != nil)
{
result.message = "Fail Error not null : \(error.debugDescription)"
}
else
{
result.message = "Success"
result.data = data
}
finish(result)
}
task.resume()
}
用法: 在我的VC中
let dict:[String:String] = ["username": view.emailField.text ?? "", "password": view.passField.text ?? "", "grant_type": "password"]
let url = URL(string: “example”)!
NetworkManager.formData(url: url, params: dict) { (message, data) in
print(message)
print(data)
它说Mising grant_type也不起作用
第三种方式:
public static func LoginGenerateTokenPOST(userName: String, password: String, completion: @escaping (Bool) -> ()) {
let baseUrl = "example"
let url = URL(string: "\(baseUrl)example")!
var request = URLRequest(url: url)
request.setValue("application/form-data", forHTTPHeaderField: "Content-Type")
//request.setValue("application/json", forHTTPHeaderField: "Accept")
request.setValue("example_api", forHTTPHeaderField: "example_api_password")
request.httpMethod = "POST"
let postString = "username=\(userName.lowercased())&password=\(password.sha256())&grant_type=password"
request.httpBody = postString.data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else { // check for fundamental networking error
completion(false)
print("error")
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
completion(false)
}
do {
if let convertedJsonIntoDict = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary {
print(convertedJsonIntoDict)
}
}
catch let error as NSError {
completion(false)
print(error.localizedDescription)
}
}
task.resume()
}
这是我的第三个功能也不起作用
所以我的问题是:
使用基本身份验证URLSession POST的最佳方法是什么,在这3种情况中的任何一种情况下我做错了什么?还是全部3种都没有用?