ios 通过POST方法使用swift向www.example.com API请求授权Last.fm

pbgvytdp  于 2023-05-23  发布在  iOS
关注(0)|答案(1)|浏览(165)

我试图按照Last.fm的教程在iOS应用程序中使用他们的API(使用Swift),但我不知道我的代码出了什么问题。他们要求做一些叫做Last.fm方法签名的东西,我不知道如何将其插入到我的程序中。下面是我尝试遵循的教程的链接:https://www.last.fm/api/mobileauth
以下是我的当前代码:

import UIKit

struct LoginRequestBody: Codable { 
    var username: String 
    var password: String 
    var api_key: String 
    var api_sig: String 
}

enum AuthenticationError: Error { 
    case invalidCredentials 
    case custom(errorMessage: String) 
}

class APIService {
    func requestAPI(username: String, password: String, api_key: String, api_sig: String) {
        guard let url = URL(string: "http://www.last.fm/api/auth/?api_key=xxx") else {
            return
        }
        
        var urlRequest = URLRequest(url: url)
        urlRequest.httpMethod = "POST"
        
        let body = LoginRequestBody(username: username, password: password, api_key: api_key, api_sig: api_sig)
        let bodyStr = [
            "username": "\(body.username)",
            "password": "\(body.password)",
            "api_key": "\(body.api_key)",
            "api_sig": "\(body.api_sig)"]
        
        urlRequest.httpBody = try? JSONSerialization.data(withJSONObject: bodyStr, options: .fragmentsAllowed)
        
        let task = URLSession.shared.dataTask(with: urlRequest) { data, _, error in
            guard let data = data, error == nil else {
                return
            }
            
            do {
                let response = try JSONSerialization.jsonObject(with: data, options: .fragmentsAllowed)
                print(response)
            } catch {
                print(error)
            }
        }
        task.resume()
    }
}
0sgqnhkj

0sgqnhkj1#

您在评论中提到的错误是因为您尝试使用http而不是https连接到端点,而Apples App Transport Security机制阻止您这样做。
你有两个选择(可能更多:))
1.查看www.example.com是否Last.fm支持https,如果支持,则使用它
1.允许您的应用改用http。您可以通过将其添加到您的info.plist来实现此目的

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

但在此之前,请参阅this great answer,其中描述了在使用http而不是https时所承担的所有风险

相关问题