Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我想知道如何使用RESTAPI请求POST。(Swift)_Ios_Swift_Api_Authorization - Fatal编程技术网

Ios 我想知道如何使用RESTAPI请求POST。(Swift)

Ios 我想知道如何使用RESTAPI请求POST。(Swift),ios,swift,api,authorization,Ios,Swift,Api,Authorization,我想根据下图使用http post接收令牌。 我像写底层代码一样写了它,但它不太好用。我该怎么办 func login() { let username = "TestID" let password = "TestPW" let loginString = "\(username):\(password)" guard let loginData = loginString.data(us

我想根据下图使用http post接收令牌。 我像写底层代码一样写了它,但它不太好用。我该怎么办

 func login() {
    
    let username = "TestID"
    let password = "TestPW"
    let loginString = "\(username):\(password)"

    guard let loginData = loginString.data(using: String.Encoding.utf8) else {
        return
    }
    let base64LoginString = loginData.base64EncodedString()
            
    let param = "id=0000&password=1234&password2=1234&grantType=password"
    let paramData = param.data(using: .utf8)
    
    var request = URLRequest(url: URL(string: "https://TestUrl.com")!)
    request.httpMethod = "POST"

    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")
    request.setValue(String(paramData!.count), forHTTPHeaderField: "Content-Length")
    
    request.httpBody = paramData
    
    let session = URLSession.shared
    let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in
        print(response!)
        do {
            let json = try JSONSerialization.jsonObject(with: data!) as! Dictionary<String, AnyObject>
            print(json)
        } catch {
            print("error")
        }
    })
    
    task.resume()
}
func登录(){
让username=“TestID”
让password=“TestPW”
let loginString=“\(用户名):\(密码)”
guard let loginda=loginString.data(使用:String.Encoding.utf8)else{
返回
}
让base64LoginString=loginda.base64EncodedString()
让param=“id=0000&password=1234&password2=1234&grantType=password”
让paramData=param.data(使用:.utf8)
var request=URLRequest(url:url(字符串):https://TestUrl.com")!)
request.httpMethod=“POST”
request.addValue(“应用程序/json”,forHTTPHeaderField:“内容类型”)
request.addValue(“Basic\(base64LoginString)”,用于HttpHeaderField:“授权”)
request.setValue(字符串(paramData!.count),用于HttpHeaderField:“内容长度”)
request.httpBody=paramData
让session=URLSession.shared
让task=session.dataTask(带:request,completionHandler:{data,response,error->Void in)
打印(响应!)
做{
让json=try JSONSerialization.jsonObject(使用:data!)作为!字典
打印(json)
}抓住{
打印(“错误”)
}
})
task.resume()
}

根据API的图像,看起来您正在正确发送
身份验证
头。但是,正文数据似乎应为JSON对象:

{
    "id": 0000,
    "password": 1234,
    "password2": 1234,
    "gratType": "password"
}
因此,您需要创建一个
Codable
结构:

struct LoginData: Codable {
    let id: Int
    let password: Int
    let password2: Int
    let gratType: String
}
然后将其转换为JSON:

let loginData = LoginData(id: 0, password: 1234, password2: 1234, gratType: "password")
request.httpBody = try JSONEncoder().encode(loginData)

请注意,我根据您的示例创建了这个结构,它将
id
password
password2
字段显示为数字字段(而不是字符串),这对我来说有点奇怪,我希望至少密码字段是字符串。而且
gratType
可能拼写错误(应该是
gratType
?)。但这是以后可以调整的。

欢迎使用堆栈溢出!你能更详细地描述一下“它不好用”是什么意思吗?服务器响应是什么?您收到了什么错误?@VadimBelyaev API只返回错误。他们想让我使用Oauth2.0获得一个令牌,但我问我是否处理错了。。TT