基本身份验证URLSession POST

时间:2020-06-06 05:36:10

标签: swift post basic-authentication urlsession

您好,开发人员正在尝试使用带有用户名和密码的基本身份验证来执行类似邮递员的请求,但我无法存档,这是到目前为止我所做的事情

这就是邮递员的样子 enter image description here enter image description here

首先我尝试这种方式

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种都没有用?

0 个答案:

没有答案
相关问题