415代码使用httr和RCurl,但不仅仅是curl

415代码使用httr和RCurl,但不仅仅是curl,r,api,curl,rcurl,httr,R,Api,Curl,Rcurl,Httr,我正在尝试编写一个函数来处理Spotify API的一些身份验证。我可以用一个相当简单的curl命令让它工作,但是当我尝试使用httr或RCurl时,我会得到415个不受支持的媒体类型响应。我现在有点不知所措。我已经让POST()和GET()使用此API,但此端点不起作用 使用httr: response <- POST('https://accounts.spotify.com/api/token', accept_json(),

我正在尝试编写一个函数来处理Spotify API的一些身份验证。我可以用一个相当简单的curl命令让它工作,但是当我尝试使用httr或RCurl时,我会得到415个不受支持的媒体类型响应。我现在有点不知所措。我已经让
POST()
GET()
使用此API,但此端点不起作用

使用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')
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输出:

* Hostname was NOT found in DNS cache
*   Trying 194.132.198.228...
* Connected to accounts.spotify.com (194.132.198.228) port 443 (#9)
* found 173 certificates in /etc/ssl/certs/ca-certificates.crt
*    server certificate verification OK
*    common name: *.spotify.com (matched)
*    server certificate expiration date OK
*    server certificate activation date OK
*    certificate public key: RSA
*    certificate version: #3
*    subject: C=SE,ST=Stockholm,L=Stockholm,O=Spotify AB,CN=*.spotify.com
*    start date: Tue, 15 Apr 2014 00:00:00 GMT

*    expire date: Wed, 21 Jun 2017 12:00:00 GMT

*    issuer: C=US,O=DigiCert Inc,CN=DigiCert SHA2 Secure Server CA
*    compression: NULL
*    cipher: AES-256-CBC
*    MAC: SHA256
> POST /api/token/ HTTP/1.1
Host: accounts.spotify.com
Accept: */*
Authorization: Basic ZWE...zE=
Content-Length: 182
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------95ce917e6abd21b1

< HTTP/1.1 100 Continue
< HTTP/1.1 415 Unsupported Media Type
* Server nginx is not blacklisted
< Server: nginx
< Date: Wed, 21 Oct 2015 01:38:39 GMT
< Content-Length: 990
< Connection: keep-alive
< Keep-Alive: timeout=10
* HTTP error before end of send, stop sending
< 
* Closing connection 9
Error: Unsupported Media Type

不确定这在这一点上是否有用

> 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/devtools@0295d20)
 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/httr@f7593b7)    
 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)        
devtools::session_info() 会话信息------------------------------------------------------------------------------------------------------- 设定值 R版3.2.2版(2015-08-14) 系统x86_64,linux gnu 用户界面RStudio(0.99.441) 我们的语言 核对en_US.UTF-8 茨 日期2015-10-20 包裹----------------------------------------------------------------------------------------------------------- 包*版本日期源 bitops 1.0-6 2013-08-17起重机(R 3.2.1) caTools 1.17.1 2014-09-10起重机(R 3.2.1) 色彩空间1.2-6 2015-03-11克朗(R 3.2.1) 旋度0.9.3 2015-08-25起重机(R 3.2.2) DBI 0.3.1 2014-09-24起重机(R 3.2.1) devtools*1.9.1.9000 2015-10-21 Github(哈德利)/devtools@0295d20) 摘要0.6.8 2014-12-31起重机(R 3.2.1) git2r 0.11.0 2015-08-12起重机(R 3.2.2) httr*1.0.0.9000 2015-10-21 Github(哈德利)/httr@f7593b7) jsonlite*0.9.17 2015-09-06起重机(R 3.2.2) 克尼特1.11 2015-08-14起重机(R 3.2.2) magrittr 1.5 2014-11-22起重机(R 3.2.1) 备忘录0.2.1 2014-04-22克兰(R 3.2.1) R6 2.1.1 2015-08-19起重机(R3.2.2) Rcpp 0.12.1 2015-09-10起重机(R 3.2.2) RCurl*1.96-0 2015-07-27本地 RJSONIO*1.3-0 2014-07-28起重机(R 3.2.2) roxygen2 4.1.1 2015-04-15起重机(R 3.2.1) 放射性同位素*1.3.5 2014-10-26克兰(R3.2.2) rstudioapi 0.3.1 2015-04-07起重机(R 3.2.1) stringi 0.5-5 2015-06-29起重机(R 3.2.2) 纵梁*1.0.0 2015-04-30起重机(R3.2.2) XML*3.98-1.3 2015-06-30起重机(R 3.2.2)
特定的Spotify端点正在寻找
内容类型:application/x-www-form-urlencoded
vs JSON。这应该行得通(对我来说是这样):

库(httr)

响应HTTP 415响应代码通常表示您正在指定服务器不支持的
内容类型
头,或者您根本没有指定头

415不支持的媒体类型: 服务器拒绝为请求提供服务,因为的实体 请求的格式不受请求的资源的支持 请求的方法

上面的postForm示例指定
内容类型:multipart/formdata。我可以使用以下
curl
复制HTTP 415响应:

curl -v -X POST 'https://accounts.spotify.com/api/token' -H 'Content-Type: multipart/form-data'
如果将内容类型更改为application/x-www-form-urlencoded,它应该可以工作

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

在R中,它给出了什么?OP说他们的
curl
版本工作正常,所以我对这个
curl
answer.yes的需要有点困惑。这很有效。谢谢,我以前没有使用过authenticate函数,但是这看起来更干净。谢谢
curl -v -X POST 'https://accounts.spotify.com/api/token' -H 'Content-Type: multipart/form-data'
curl -v -X POST 'https://accounts.spotify.com/api/token' -H 'Content-Type: application/x-www-form-urlencoded'