如何在Swift中发出API请求,就像工作的Python请求I';我现在在用什么?

如何在Swift中发出API请求,就像工作的Python请求I';我现在在用什么?,python,swift,urlrequest,Python,Swift,Urlrequest,我希望将此Python请求转换为Swift脚本 这是我的工作python脚本,它返回accessToken #!/usr/bin/python import requests import json #MAKE THE REQUEST URL = "http://this/is/the/url" headers = { 'Accept': "application/json", "Accept-Language": "en_US" } data = { "grant_type": "

我希望将此Python请求转换为Swift脚本

这是我的工作python脚本,它返回accessToken

#!/usr/bin/python

import requests
import json

#MAKE THE REQUEST
URL = "http://this/is/the/url"
headers = {
'Accept': "application/json",
"Accept-Language": "en_US"
}
data = {
    "grant_type": "password",
    "username" : "GROUP\SITE\USERNAME",
    "password" : "somepassword"
}
r = requests.get(url = URL, params = headers, data = data)
data = r.json()



accessToken = data['access_token']
print(accessToken)
当我运行Swift游乐场以获取下面的代码时,不会返回任何内容! 脚本似乎在guard let data=data else{return}处退出

如何获得与上面的Python脚本相同的结果。


如果我没记错的话,从iOS 13开始,您不能让httpBody进行GET调用,因此您需要切换到POST/PUT或将参数添加到url字符串中(见下文) python和swift中的
Accept
头也不同。一个是xml,另一个是json

var urlComponents = URLComponents(string: "http://this/is/the/url")
urlComponents?.queryItems = [
    URLQueryItem(name: "grant_type", value: "password"),
    URLQueryItem(name: "username", value: "username"),
    URLQueryItem(name: "password", value: "somepassword")
]

guard let url = urlComponents?.url else { return } // You can print url here to see how it looks
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.setValue("en_US", forHTTPHeaderField: "Accept-Language")

let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data,
            let response = response as? HTTPURLResponse,
            error == nil else {
            print("error", error ?? "Unknown error")
            return
        }
        print(response)
        guard (200 ... 299) ~= response.statusCode else {
            print("response = \(response)")
            return
        }

        let responseString = String(data: data, encoding: .utf8)
        print(responseString)
    }
    task.resume()

问题是以下几点

 request.httpMethod = "GET"
我不得不更改“帖子”的获取方式,现在我有了令牌!!!! 我很困惑,因为python脚本使用GET。我有一个bash脚本,它使用curl将令牌显示在日志中


简言之,我上面的Swift playway现在可以通过将request.httpMethod更改为“POST”来工作。谢谢你的帮助

你已经写了
所有HttpHeaderFields
三次了。。。您需要设置一次,使用一个包含所有3个头键/值的dictionAnry。好的,我已经更新了上面的代码,我仍然得到{“error”:“unsupported_grant_type”}在python脚本中,grant_type、password、username在数据而不是头中传递。它们是否需要作为url请求中编码的正文或url发送?是@valosip查看更新的swift游乐场。现在没有返回任何内容。@Mdoyle1这是您试图与之集成的私有api还是公共第三方api?
 request.httpMethod = "GET"