2014-10-11 46 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