【问题标题】:Issues accessing key value in JSON response from NSURLSession (Lyft API)从 NSURLSession (Lyft API) 访问 JSON 响应中的键值的问题
【发布时间】:2016-02-13 05:59:53
【问题描述】:

我正在使用新的 Lyft API,在“身份验证”部分,它表示要发送访问令牌的请求并显示示例响应,其中包含一个名为“access_token”的密钥。

示例响应

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token": <access_token>,
"token_type":"bearer",
"expires_in":3600,
"scope": "public"
}

然而,当我拨打电话时(是的,ClientID 和 Secret 是正确的,但我无法在此处发布它们)它会返回响应,但访问令牌为 nil。

一如既往地感谢您的帮助!文档链接如下,

API 文档,

https://developer.lyft.com/docs/authentication

func authorize() {

    let authString = NSString(format: "%@:@%", clientID, clientSecret)
    let authData = authString.dataUsingEncoding(NSUTF8StringEncoding)

    let base64String = authData!.base64EncodedDataWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)

    let url = NSURL(string: "https://api.lyft.com/oauth/token")
    let request = NSMutableURLRequest(URL: url!)

    request.HTTPMethod = "GET"
    request.setValue("Basic \(base64String)", forHTTPHeaderField: "Authorization")

    let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())

    let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in

        let dictionary = try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments)


        if let accessToken : String = dictionary["access_token"] as? String {

            print(accessToken)
        }
    }

    task.resume()

}

【问题讨论】:

  • 如果你调用base64EncodedStringWithOptions而不是base64EncodedDataWithOptions会发生什么?
  • 发生了完全相同的事情......虽然我确实从与 Lyft 的支持人员交谈中发现它应该是“POST”而不是“GET”,尽管即使那样我也是没有得到正确的回应。
  • @Echizzle:我也在做同样的集成,你有什么更新吗?

标签: ios api swift2 nsurlsession nsjsonserialization


【解决方案1】:

根据 Lyft 文档,我认为您的身份验证字符串的格式是错误的。

我认为你应该这样做

let authString = NSString(format: "%@:@%", clientID, clientSecret),不是

let authString = NSString(format: "%@, @%", clientID, clientSecret)

【讨论】:

  • 是的,之前有人发布过,但删除了他们的评论,我更新了它,我仍然收到 400 错误,虽然这意味着请求已收到但没有身份验证令牌。
  • 您收到 400 错误?根据文档页面的底部,您缺少 grant_type 参数。看起来它应该作为请求的主体传递。 NSURLRequest 有一个 HTTPBody 类型的属性 NSData
  • 我刚刚注意到,我像这样包含它,但仍然无法正常工作... 让 bodyDict : [String:AnyObject] = ["grant_type": ["client_credentials", "authorization_code ", "refresh_token"], "scope": "public"] 让 dataExample : NSData = NSKeyedArchiver.archivedDataWithRootObject(bodyDict) request.HTTPBody = dataExample
  • 如果你选择一个可能会起作用。制作你的字典[String:String],让它看起来像["grant_type" : "authorization_code", "scope" : "public"]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
相关资源
最近更新 更多