HTTPBody - Swift POST请求 - Twitter

时间:2014-10-11 20:45:49

标签: ios post twitter swift httprequest

我正在尝试向Twitter API发送POST请求以获取bearer_token作为仅应用程序身份验证的一部分。我已按照他们的文档(https://dev.twitter.com/oauth/application-only)进行URL编码,并通过我的消费者密钥和消费者秘密进行连接。然后我把它放在一个名为auth_string的字符串中,你会在请求中看到它。我还按照文档将静态标头值添加到请求中。问题是将HTTPBody传递为“grant_type = client_credentials”(Twitter在文档中要求的方式)。

我尝试了三种方法:

  1. 我尝试将其作为字符串传递但是没有用,构建失败,因为我想我无法将该类型传递给HTTPBody。
  2. 我尝试在发送请求之前将字符串转换为NSData:Creating NSData from NSString in Swift - 但这似乎也不起作用 - 当我将NSData变量打印到控制台时,它看起来像这样:“httpbody :可选(< 6772616e 745f7479 70653d63 6c69656e 745f6372 6564656e 7469616c 73>)“,当我在制作它之前打印请求时,我甚至看不到身体中的任何内容 - 只看到我之前设置的标题字段。
  3. 我尝试使用这种方法创建一个NSDictionary对象:http://jamesonquave.com/blog/making-a-post-request-in-swift/#jumpSwift但是在发送之前我再也看不到请求中的正确主体,而且我没有从Twitter端点获得正确的响应。
  4. 非常感谢任何提示!下面的代码显示了我上面列出的第二种方法。

    //auth_string is used as authorization field in header of http request
        let auth_string:NSString = "Basic \(key_sec_base64)"
    
        let http_body = "grant_type=client_credentials".dataUsingEncoding(NSUTF8StringEncoding)
    
        var bearer_token_request = NSMutableURLRequest(URL: NSURL(string: "https://api.twitter.com/oauth2/token"))
        var bearer_token_session = NSURLSession.sharedSession()
        bearer_token_request.HTTPMethod = "POST"
    
        var err: NSError?
    
        bearer_token_request.addValue("application/x-www-form-urlencoded;charset=UTF-8", forHTTPHeaderField: "Content-Type")
        bearer_token_request.addValue((auth_string), forHTTPHeaderField: "Authorization")
        bearer_token_request.addValue("gzip", forHTTPHeaderField: "Accept-encoding")
        bearer_token_request.addValue("api.twitter.com", forHTTPHeaderField: "Host")
        bearer_token_request.HTTPBody = http_body
    
        println("httpbody: \(bearer_token_request.HTTPBody)")
    
        println(bearer_token_request)
    
        let task = bearer_token_session.dataTaskWithRequest(bearer_token_request, completionHandler: {(data, response, error) in
            println(data)
    
        })
    
        task.resume()
    

1 个答案:

答案 0 :(得分:1)

  

当我将NSData变量打印到控制台时,它看起来像这样:   " httpbody:可选(< 6772616e 745f7479 70653d63 6c69656e 745f6372   6564656e 7469616c 73>)",

这是因为它是一个可选类型:类型为Optional<NSData>

如果你执行println(data!),它将摆脱Optional<>部分。

然后您可能需要将data转换回string以查看您预期的数据(&#34; grant_type = client_credentials&#34;)