Ios 我想知道如何使用RESTAPI请求POST。(Swift)
我想根据下图使用http post接收令牌。 我像写底层代码一样写了它,但它不太好用。我该怎么办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
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