如何传递不记名令牌以使用 URLSessoin 进行 Yelp API 调用

Posted

技术标签:

【中文标题】如何传递不记名令牌以使用 URLSessoin 进行 Yelp API 调用【英文标题】:How to pass bearer token to make Yelp API call with URLSessoin 【发布时间】:2018-10-14 03:40:00 【问题描述】:

U P D A T E D... 这个功能有什么用! 我想将 yelp api 合并到应用程序中,但无法在 URL 字符串上成功传递我的授权令牌。我需要做些什么来将 URLRequest 连接到 URLSessoin 调用并且它不使用标头吗?也许键值对是错误的?以下函数返回:

error =     
        code = "TOKEN_MISSING";
        description = "An access token must be supplied in order to use this endpoint.";
    ;

我能够使用邮递员来使 yelp API 调用正常工作,但只能通过单击邮递员上的“标题”部分并输入 Bearer,然后输入我的 yelp 键。我用谷歌搜索了一下,发现一些链接表明您可以向 URLSession 添加一个标题,我认为它可以像邮递员那样工作,但我无法让它工作。

我知道有一些带有 yelp API 存储库的 github,但我试图不将大量我不理解的代码安装到我的应用程序中,而我想要的只是我能看到的 JSON 正在通过邮差。谁能帮我理解我将如何编辑类似于下面的示例的代码,以便我可以获得 yel​​p 所需的授权/承载?

func getYelp() 
        let appSecret = "Bearer <YELP APIKEY>"
        let link = "https://api.yelp.com/v3/businesses/search?latitude=37.786882&longitude=-122.399972"
        if let url = URL(string: link) 
            // Set headers
            var request = URLRequest(url: url)
            request.setValue("Accept-Language", forHTTPHeaderField: "en-us")
            request.setValue(appSecret, forHTTPHeaderField: "Authorization")

            print("Attempting to get places around location from Yelp")
            let task = URLSession.shared.dataTask(with: request)  (data, response, error) in
                if error != nil 
                    print(error!)
                 else 
                    if let urlContent = data 
                        do 
                            let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject // Added "as anyObject" to fix syntax error in Xcode 8 Beta 6
                            print("Printing all JSON/n/n//n--------------------------")
                            print(jsonResult)
                            print("Printing from results/n/n//n--------------------------")

                            if let description = ((jsonResult["search"] as? NSDictionary)?["context"] as? NSDictionary)?["href"] as? String 

                             else 
                                print("JSON pull failed/n/n//n--------------------------")
                            

                         catch 
                            print("JSON Processing Failed/n/n//n--------------------------")
                        

                    
                
            
            task.resume()
         else 
            resultLabel.text = "Couldn't get results from Here"
        
    

【问题讨论】:

【参考方案1】:

您在标题和网址之间混淆了,您需要正确设置标题

if let url = URL(string: "https://places.cit.api.here.com/places/v1/discover/around?at=37.776169%2C-122.421267&app_id=\(app_id)&app_code=\(app_code)") 
    var request = URLRequest(url: url)
    // Set headers
    request.setValue("Accept-Language", forHTTPHeaderField: "en-us")
    request.setValue("Authorization", forHTTPHeaderField: "Bearer " + token // Token here)

    print("Attempting to get places around location")
    let task = URLSession.shared.dataTask(with: url)  (data, response, error) in
        // ...

【讨论】:

我添加了您推荐的代码,但仍然显示未提供令牌。我还尝试使用“with:url”和“with:request”,是否可能还有其他我遗漏的东西?我用当前的完整功能更新了问题。 您需要检查文档以获取所需的标头 想通了...名称值对参数只是颠倒了... request.setValue(appSecret, forHTTPHeaderField: "Authorization")【参考方案2】:

假设您有一个带有“https://google.com”的 api(这只是一个带有假密钥的示例) 和一个 api 密钥“ApiKey: 92927839238293d92d98d98d92”。

然后您将获取此信息并执行此操作。

let uri = URL(string:"https://google.com")
    if let unwrappedURL = uri 
      var request = URLRequest(url: unwrappedURL)request.addValue("92927839238293d92d98d98d92", forHTTPHeaderField: "ApiKey")
let dataTask = URLSession.shared.dataTask(with: request)  (data, response, error) in
    // you should put in error handling code, too
    if let data = data 
        do 
            let json = try JSONSerialization.jsonObject(with: data, options: [])
            // HERE'S WHERE YOUR DATA IS
            print(json)
         catch 
            print(error.localizedDescription)
        
    

dataTask.resume()

请记住,您可以将 google.com 替换为您的 GET 地址,并将 APIKey 标头替换为您自己的 api 密钥值。 此外,这将像 PostMan 一样打印出所有 JSON。 如果这对您有用,那么我还有一个访问 JSON 对象的链接。

【讨论】:

以上是关于如何传递不记名令牌以使用 URLSessoin 进行 Yelp API 调用的主要内容,如果未能解决你的问题,请参考以下文章

如何让不记名令牌通过rails中的标头传递?

在标头中传递 openid-connect oauth2 不记名令牌

如何在 laravel 中使用不记名令牌从 api 请求中获取响应?

Alamofire 5.0+ MultipartFormData 上传不记名令牌

如何从 Flask 返回不记名 JWT 令牌?

如何使用节点请求发送不记名令牌和 x-www-form-urlencoded 数据