2014-10-11 47 views
1

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

我想这三种方法:

  1. 我试着将它作为一个字符串,并没有工作,因为我想我不能在该类型传递给HTTPBody构建失败。
  2. 我试图将字符串转换为NSData,然后发送请求,如下所示:Creating NSData from NSString in Swift - 但这似乎不起作用 - 当我将NSData变量输出到控制台时,它看起来像这样:“httpbody:Optional(< 6772616e 745f7479 70653d63 6c69656e 745f6372 6564656e 7469616c 73>)“,并且当我在创建它之前打印请求时,甚至没有看到任何内容 - 只能看到我之前设置的标题字段。
  3. 我试着制作一个像这样的方法的NSDictionary对象:http://jamesonquave.com/blog/making-a-post-request-in-swift/#jumpSwift但我再次发送请求之前看不到正确的正文,并且我没有从Twitter端点获得正确的响应。

任何提示,非常感谢!下面的代码显示了我上面列出的第二种方法。

//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
当我打印的NSData变量控制台,它看起来像这样

: “httpbody:可选(< 6772616e 745f7479 70653d63 6c69656e 745f6372 6564656e 7469616c 73>)”,

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

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

然后你可能需要data转换回string看到的数据,你会预期(“grant_type = client_credentials”)

+0

爽哦,这是很容易其实我只是用你的建议的最终结果我从Twitter获得回来,他们实际上向我发送了我需要的JSON响应,当我将其转换回字符串时! – bkopp 2014-10-12 17:11:48