POST 使用带有响应密钥和校验和的 REST API 进行身份验证

POST authentication using REST API with response key and checksum

我正在尝试使用 POST 方法向 API 进行身份验证。这是我指的文档 Kite Connect API。 我无法理解我哪里出错了。错误是校验和或 POST ?

library(digest)
require("httr")

my_api <- "xxx"
my_req_token <- 'yyy'
my_secret <- 'zzz'

check<-hmac(my_req_token,paste0(paste0(my_api,my_req_token),my_secret),algo=c('sha256'))

url <- 'https://api.kite.trade/session/token'
login <- list(api_key=my_api,
              request_token = my_req_token,
              checksum = check)

response<- POST(url,body= login)

这是我收到的回复。

> response
Response [https://api.kite.trade/session/token]
Date: 2017-08-27 12:34
Status: 400
Content-Type: application/json
Size: 81 B

> content(response, "parsed", "application/json")
$status
[1] "error"

$message
[1] "Missing api_key"

$error_type
[1] "InputException"

试一试

#devtools::install_github("hrbrmstr/curlconverter")

library(curlconverter)

curlExample <- 'curl https://api.kite.trade/session/token
   -d "api_key=xxx"
   -d "request_token=yyy"
   -d "checksum=zzz"'

resp <- make_req(straighten(curlExample))
resp

问题已解决。 post 数据应作为 'application/x-www-form-urlencoded' 发送,将编码 arg 设置为表单可以做到这一点

library(digest)
require("httr")

my_api <- "xxx"
my_req_token <- 'yyy'
my_secret <- 'zzz'

#use digest insted of hmac; digest serializes argument first, use serialize arg to disable that
check<-digest(paste0(my_api, my_req_token, my_secret), algo='sha256', serialize=FALSE)

url <- 'https://api.kite.trade/session/token'
login <- list(api_key=my_api,
              request_token = my_req_token,
              checksum = check)

#post data should be sent as 'application/x-www-form-urlencoded', setting encode arg to form does this
response<- POST(url,body= login, encode='form')

parsed_content <- content(response, "parsed", "application/json")