2015-10-21 54 views
2

我正在嘗試編寫一個處理Spotify API的一些身份驗證的函數。我可以讓它使用一個相當簡單的curl命令,但是當我嘗試使用httr或RCurl時,我得到415不受支持的媒體類型響應。在這一點上我有點不知所措。我已經獲得POST()GET()以使用此API,但此端點不起作用。415代碼使用httr和RCurl,但不僅僅是捲曲

使用HTTR

response <- POST('https://accounts.spotify.com/api/token', 
       accept_json(), 
       add_headers('Authorization'=paste('Basic',base64(paste(client_id,':',client_secret)),sep=' ')), 
       body=list(grant_type='client_credentials'), 
       encode='json') 

,我收到了415 status_code(response)

使用RCurl

httpheader <- c('Authorization'=paste('Basic ',base64(paste(client_id,':',client_secret,sep='')),sep='')) 
jsonbody <- toJSON(list(grant_type='client_credentials')) 
postForm('https://accounts.spotify.com/api/token/', 
     postfields=jsonbody, 
     # grant_type='client_credentials', 
     .opts = list(httpheader=httpheader, 
         verbose=TRUE)) 

postForm輸出:

使用 捲曲通過 system電話

(或命令行)實際工作:

system(
    paste('curl https://accounts.spotify.com/api/token -H "Authorization: Basic ', 
     base64(paste(client_id,':',client_secret,sep='')), 
     '" -d grant_type=client_credentials ', 
     sep=''), 
    intern=TRUE) 


不知道這是在這一點上是有用的。

> devtools::session_info() 
Session info ------------------------------------------------------------------------------------------------------- 
setting value      
version R version 3.2.2 (2015-08-14) 
system x86_64, linux-gnu   
ui  RStudio (0.99.441)   
language en_US      
collate en_US.UTF-8     
tz  <NA>       
date  2015-10-20     

Packages ----------------------------------------------------------------------------------------------------------- 
package * version date  source       
bitops  1.0-6  2013-08-17 CRAN (R 3.2.1)     
caTools  1.17.1  2014-09-10 CRAN (R 3.2.1)     
colorspace 1.2-6  2015-03-11 CRAN (R 3.2.1)     
curl   0.9.3  2015-08-25 CRAN (R 3.2.2)     
DBI   0.3.1  2014-09-24 CRAN (R 3.2.1)     
devtools * 1.9.1.9000 2015-10-21 Github (hadley/[email protected]) 
digest  0.6.8  2014-12-31 CRAN (R 3.2.1)     
git2r  0.11.0  2015-08-12 CRAN (R 3.2.2)     
httr  * 1.0.0.9000 2015-10-21 Github (hadley/[email protected])  
jsonlite * 0.9.17  2015-09-06 CRAN (R 3.2.2)     
knitr  1.11  2015-08-14 CRAN (R 3.2.2)     
magrittr  1.5  2014-11-22 CRAN (R 3.2.1)     
memoise  0.2.1  2014-04-22 CRAN (R 3.2.1)     
R6   2.1.1  2015-08-19 CRAN (R 3.2.2)     
Rcpp   0.12.1  2015-09-10 CRAN (R 3.2.2)     
RCurl  * 1.96-0  2015-07-27 local       
RJSONIO * 1.3-0  2014-07-28 CRAN (R 3.2.2)     
roxygen2  4.1.1  2015-04-15 CRAN (R 3.2.1)     
RSelenium * 1.3.5  2014-10-26 CRAN (R 3.2.2)     
rstudioapi 0.3.1  2015-04-07 CRAN (R 3.2.1)     
stringi  0.5-5  2015-06-29 CRAN (R 3.2.2)     
stringr * 1.0.0  2015-04-30 CRAN (R 3.2.2)     
XML  * 3.98-1.3 2015-06-30 CRAN (R 3.2.2)   

回答

3

特定的Spotify終端正在尋找Content-Type: application/x-www-form-urlencoded vs JSON,因爲您擁有它。這應該工作(它確實對我來說):

library(httr) 

response <- POST('https://accounts.spotify.com/api/token', 
       accept_json(), 
       authenticate(Sys.getenv("SPOTIFY_CLIENT_ID"), Sys.getenv("SPOTIFY_CLIENT_SECRET")), 
       body=list(grant_type='client_credentials'), 
       encode='form', 
       verbose()) 

(你可以刪除在生產verbose()

注意encode='form'還要注意,您可以使用authenticate() VS建立你自己的基本認證頭(我存儲所有鍵在ENV變量,因此,使用的Sys.getenv()

+0

是的。這工作完美。謝謝,我之前沒有使用過身份驗證功能,但這看起來更乾淨。謝謝! – rjweyant

1

一個415響應代碼通常表明您指定一個Content-Type的服務器不支持,或者你沒有指定一個在所有。

415不支持的介質類型: 服務器拒絕服務請求,因爲 實體請求的格式不是請求的資源所支持的格式,對於 請求的方法。

上面的postForm示例指定了「Content-Type:multipart/form-data;」。如果更改內容類型爲application/X WWW的形式,進行了urlencoded它應該工作

curl -v -X POST 'https://accounts.spotify.com/api/token' -H 'Content-Type: multipart/form-data' 

:我可以重現415的響應與下面的捲曲。

curl -v -X POST 'https://accounts.spotify.com/api/token' -H 'Content-Type: application/x-www-form-urlencoded' 
+0

在R中,它給了什麼? – 2015-10-21 02:18:35

+1

OP表示他們的「curl」版本可以工作,所以我對這個「curl」答案的需求有點困惑。 – hrbrmstr