Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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 来自具有正确标题的客户端的Post请求始终返回401-未经授权_Ruby_Curl_Sinatra_Rest Client_Net Http - Fatal编程技术网

Ruby 来自具有正确标题的客户端的Post请求始终返回401-未经授权

Ruby 来自具有正确标题的客户端的Post请求始终返回401-未经授权,ruby,curl,sinatra,rest-client,net-http,Ruby,Curl,Sinatra,Rest Client,Net Http,我是ruby的新手。我试图从ruby代码中调用RESTAPI。我已经将该代码作为独立的ruby代码和在使用sinatra的应用程序中进行了尝试。但我在任何地方都面临着同样的问题。以下是我尝试过的选项 使用RestClient调用Post API的代码。已修改数据以使其通用 url="https://myapiurl.com/endpointname" person={"name"=>"Sample Name","age"=>"20"} headers={

我是ruby的新手。我试图从ruby代码中调用RESTAPI。我已经将该代码作为独立的ruby代码和在使用sinatra的应用程序中进行了尝试。但我在任何地方都面临着同样的问题。以下是我尝试过的选项

使用RestClient调用Post API的代码。已修改数据以使其通用

    url="https://myapiurl.com/endpointname"
    person={"name"=>"Sample Name","age"=>"20"}
    headers={
        "Content-Type"=>"application/json",
        "api-key"=>"ABCDEFGHIJKL"
    }

    response=RestClient.post url,person.to_json,headers
    puts response
我在函数中编写了上述代码块,并尝试调用。但我得到的回应如下

{"status": 401, "error":"Unauthorized Access"}
我通过postman尝试了相同的api,设置如下,并且能够从api获得正确的响应

URL : https://myapiurl.com/endpointname
Headers : Content-Type: application/json, api-key:"ABCDEFGHIJKL"
Body: Raw:application/json: {"name":"Sample Name","age":"20"}
当我尝试不通过postman传递头中的
api键时,我得到了与ruby代码类似的响应

接下来,我尝试从postman选项生成代码。下面是从postman for Ruby(Net::Http)生成的代码。 我从ruby代码中删除了
缓存控制
邮递员令牌
的post参数,并尝试运行ruby代码。我再次得到同样的“未经授权”的回应

require 'uri'
require 'net/http'

url = URI("https://myapiurl.com/endpointname")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Post.new(url)
request["content-type"] = 'application/json'
request["api-key"] = 'ABCDEFGHIJKL'
request["cache-control"] = 'no-cache'
request["postman-token"] = 'some value got generated'
request.body = "{\"name\":\"Sample Name\",\"age\":\"20\"}"

response = http.request(request)
puts response.read_body
我怀疑是某个IP级别的问题阻塞了,因此尝试使用curl命令来攻击api,如下所示。我从API得到了正确的响应

curl -X POST \
  https://myapiurl.com/endpointname \
  -H 'content-type: application/json' \
  -H 'api-key: ABCDEGHIJKL' \
  -d '{"name":"Sample Name","age":"20"}'

我认为,
api键
没有通过ruby代码传递给请求。我通过ruby代码在标题中发送
api键
的方法正确吗

这很奇怪。尝试将您的url更改为
http://localhost/
并使用诸如tcpdump或fiddler之类的工具捕获TCP数据包,然后查看是否有标头
api键
。不要担心请求失败。只要确保它是普通的
http
,而不是
https
。我检查过它是否是http。我试着将我的请求发送到。发送的报头为“x-api-key”。但它被作为“X-Api-Key”发送。我找到了这个答案。我们是否有其他方法可以做到这一点?