【问题标题】:Get url shortened with Google API, AFNetworking in Swift在 Swift 中使用 Google API、AFNetworking 缩短 url
【发布时间】:2015-05-06 18:21:41
【问题描述】:

在谷歌文档 (https://developers.google.com/url-shortener/v1/getting_started) 中,要使用谷歌 URL 缩短器,我应该提出如下要求:

发帖https://www.googleapis.com/urlshortener/v1/url

内容类型:application/json

{"longUrl": "http://www.google.com/"}

他们还说我必须进行身份验证:

“您的应用程序向 Google URL Shortener API 发送的每个请求 需要向 Google 识别您的应用程序。有两种方法可以 识别您的应用程序:使用 OAuth 2.0 令牌(也 授权请求)和/或使用应用程序的 API 密钥。”

我选择了公共 API 密钥作为身份验证方法:我为我的 iOS 应用程序创建了一个公共密钥。然后我使用以下代码 POST(AFNetworking,使用 Swift):

func getShortURL(longURL: String){
    let manager = AFHTTPRequestOperationManager()
    let params = [
        "longUrl": longURL
    ]
    manager.POST("https://www.googleapis.com/urlshortener/v1/url?key={my_key_inserted}", parameters: params, success: {
        (operation: AFHTTPRequestOperation!,responseObject: AnyObject!) in
            println("JSON: " + responseObject.description)
        },
        failure: { (operation: AFHTTPRequestOperation!,error: NSError!) in
            println("Error while requesting shortened: " + error.localizedDescription)
    })
} 

但是,我得到了日志:请求缩短时出错:请求失败:错误请求 (400)。

请告诉我如何解决它。

【问题讨论】:

    标签: api swift url afnetworking


    【解决方案1】:

    您缺少的是为此请求设置正确的 AFNetworking 序列化程序。

    由于 Google 响应是 JSON 格式,您应该使用 AFJSONRequestSerializer

    像这样添加manager.requestSerializer = AFJSONRequestSerializer()

        let manager = AFHTTPRequestOperationManager()
        manager.requestSerializer = AFJSONRequestSerializer()
        let params = ["longUrl": "MYURL"]
        manager.POST("https://www.googleapis.com/urlshortener/v1/url?key=MYKEY", parameters: params, success: {(operation: AFHTTPRequestOperation!,responseObject: AnyObject!) in
            println("JSON: " + responseObject.description)
                }, failure: { (operation: AFHTTPRequestOperation!,error: NSError!) in
            println("Error while requesting shortened: " + error.localizedDescription)
        })
    

    【讨论】:

    • 谢谢。虽然在 Xcode 6 中我必须定义特定的类如下:manager.requestSerializer = AFJSONRequestSerializer() as AFJSONRequestSerializer。否则我会得到“'init()' 不可用:被 -[NSObject init] 的导入所取代”。现在它确实起作用了!
    • 啊,奇怪了,我测试的时候不用给类型,编译器推断出来的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多