Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 关于使用ruby代码进行http POST api调用的问题_Ruby On Rails_Ruby_Api_Net Http - Fatal编程技术网

Ruby on rails 关于使用ruby代码进行http POST api调用的问题

Ruby on rails 关于使用ruby代码进行http POST api调用的问题,ruby-on-rails,ruby,api,net-http,Ruby On Rails,Ruby,Api,Net Http,我将访问Riskscreen api来验证用户。为了测试该api,我编写了一个ruby代码片段来进行示例POST调用,以获取我从Riskscreen api获得的令牌数 我的代码是: require 'uri' require 'net/http' require 'net/https' require 'json' @toSend = {}.to_json uri = URI.parse("https://api.riskscreen.com/api/v1/user/tokens") ht

我将访问Riskscreen api来验证用户。为了测试该api,我编写了一个ruby代码片段来进行示例POST调用,以获取我从Riskscreen api获得的令牌数

我的代码是:

require 'uri'
require 'net/http'
require 'net/https'
require 'json'

@toSend = {}.to_json

uri = URI.parse("https://api.riskscreen.com/api/v1/user/tokens")
https = Net::HTTP.new(uri.host,uri.port)
https.use_ssl = true
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
header = {'api-key': 'my api key','Content-Type': 'application/json', 'Accept': 'application/json'}
req = Net::HTTP::Post.new(uri.path, header)
req.body = "[ #{@toSend} ]"
res = https.request(req)


puts "------------"
puts "Response #{res.code} #{res.message}: #{res.body}"
但我得到了以下错误:

Response 400 Bad Request
如果我将标题行更改为

header = {'api-key'=> 'my-api-key','Content-Type'=> 'application/json', 'Accept'=> 'application/json'}
然后我得到了这个错误:

Response 401 Unauthorized
坚持一段时间。请帮我整理一下。

您能试着删除:

req.body = "[ #{@toSend} ]"
并替换为:

req.set_form_data({})
# or 
req.body = "{}"

抱歉,我不确定。标题的键必须是字符串而不是符号

header = {'api-key' => 'my api key','Content-Type' => 'application/json', 'Accept' => 'application/json'}
另一个问题是
net/http
是头自动大写,
api键
->
api键
,这会导致服务器上出现
授权错误
。一种解决方案是创建一个新类来包装
api键
,以防止Ruby这样做

class HeaderCaseSensitive < String
  def capitalize
    self
  end

  def split(*args)
    super.each do |str|
      HeaderCaseSensitive.new(str)
    end
  end

  def to_s
    self
  end
end
总而言之,以下代码将起作用:

require 'uri'
require 'net/http'
require 'net/https'
require 'json'

class HeaderCaseSensitive < String
  def capitalize
    self
  end

  def split(*args)
    super.each do |str|
      HeaderCaseSensitive.new(str)
    end
  end

  def to_s
    self
  end
end

@toSend = {}.to_json

uri = URI.parse("https://api.riskscreen.com/api/v1/user/tokens")
https = Net::HTTP.new(uri.host,uri.port)
https.use_ssl = true
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
header = {HeaderCaseSensitive.new('api-key') => 'xxx','Content-Type' => 'application/json', 'Accept' => 'application/json'}
https.set_debug_output($stdout)
req = Net::HTTP::Post.new(uri.path, header)
req.body = "[ #{@toSend} ]"


res = https.request(req)


puts "------------"
puts "Response #{res.code} #{res.message}: #{res.body}"
require'uri'
需要“net/http”
需要“net/https”
需要“json”
类标题CaseSensitive<字符串
def资本化
自己
结束
def拆分(*args)
超级。每个都有|
HeaderCaseSensitive.new(str)
结束
结束
def至美国
自己
结束
结束
@toSend={}.to_json
uri=uri.parse(“https://api.riskscreen.com/api/v1/user/tokens")
https=Net::HTTP.new(uri.host,uri.port)
https.use_ssl=true
https.verify\u mode=OpenSSL::SSL::verify\u NONE
header={HeaderCaseSensitive.new('api-key')=>'xxx','Content-Type'=>'application/json','Accept'=>'application/json'}
https.set_debug_输出($stdout)
req=Net::HTTP::Post.new(uri.path,头)
req.body=“[#{@toSend}]”
res=https.request(请求)
放置“-------------”
放置“Response{res.code}{res.message}:{res.body}”

您确定请求正文没有问题吗?你能添加到API描述的链接吗?这里是:这需要一个帐户。我已经编辑了这篇文章并提供了凭据。请检查。我认为您不应该将您的私人信息共享给stackoverflow(用户名、密码、api密钥)。这是有风险的。@Abhradip 401与400不同,请检查您的身份验证是否正确以及api密钥是否正确。api密钥没有问题。它在邮递公司工作得很好,我不明白它为什么不工作。我尝试set
http.set\u debug\u output$stderr
来查看头中包含了什么Ruby请求、api键。我认为您应该联系Riskscreen支持部门。祝你好运@Abhradip您还应该联系RiskScreen,并要求他们在他们这边解决这个问题,因为标题不区分大小写!您还需要要求他们更改您的访问令牌。。。
require 'uri'
require 'net/http'
require 'net/https'
require 'json'

class HeaderCaseSensitive < String
  def capitalize
    self
  end

  def split(*args)
    super.each do |str|
      HeaderCaseSensitive.new(str)
    end
  end

  def to_s
    self
  end
end

@toSend = {}.to_json

uri = URI.parse("https://api.riskscreen.com/api/v1/user/tokens")
https = Net::HTTP.new(uri.host,uri.port)
https.use_ssl = true
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
header = {HeaderCaseSensitive.new('api-key') => 'xxx','Content-Type' => 'application/json', 'Accept' => 'application/json'}
https.set_debug_output($stdout)
req = Net::HTTP::Post.new(uri.path, header)
req.body = "[ #{@toSend} ]"


res = https.request(req)


puts "------------"
puts "Response #{res.code} #{res.message}: #{res.body}"