问题描述
我正在尝试使用两种不同的方法通过Ruby脚本执行curl,但两者都有一些错误。
第一种方法是使用shell命令
#!/usr/bin/ruby
`curl --cacert RepoCert --location --request POST 'https://test-service/rest/services/request/' --header 'Authorization: Basic amkkdksmmkk3XCf45DffSa23Ert' --header 'Content-Type: application/json' --data-binary "{ \"serviceID\": \"3\",\"TypeId\": \"52\",\"requestFieldValues\": { \"summary\": \"summary\",\"description\": \"something\",\"prority\": { \"id\": \"1\"},\"customfield\": \"5\" }} "`
"Unexpected character (\u0027s\u0027 (code 115)): was expecting double-quote to start field name\n at [Source: com.itlab.jira.plugins.extender.helper.RequestWrapper$5db70c75; line:1,column:5]"
还尝试使用Ruby Net :: HTTP(由https://jhawthorn.github.io/curl-to-ruby/生成的代码)
require 'net/http'
require 'uri'
require 'json'
uri = URI.parse("https://test-service/rest/services/request/")
request = Net::HTTP::Post.new(uri)
request.content_type = "application/json"
request["Authorization"] = "Basic amkkdksmmkk3XCf45DffSa23Ert"
request.body = JSON.dump({
"serviceID" => "3","TypeId" => "52","requestFieldValues" => {
"summary" => "summary","description" => "something","prority" => {
"id" => "1"
},"customfield" => "5"
}
})
req_options = {
use_ssl: uri.scheme == "https",}
response = Net::HTTP.start(uri.hostname,uri.port,req_options) do |http|
http.request(request)
end
我明白了
/usr/share/ruby/net/http.rb:921:in `connect': SSL_connect returned=1 errno=0 state=error: certificate verify Failed (OpenSSL::SSL::SSLError)
问题是在这种情况下我必须使用证书授权,所以我不能忽略它。
从命令行执行卷曲执行正常。知道如何解决其中一种方法(或两种方法)吗?
解决方法
谢谢大家的帮助,但我使用Net :: HTTP弄清楚了。如果有人找过类似案件,我在这里发表评论。
require 'net/http'
require 'uri'
require 'json'
uri = URI.parse("https://test-service/rest/services/request/")
http = Net::HTTP.new(uri.host,uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.ca_file = "/directory/to/cert/file"
request = Net::HTTP::Post.new(uri.request_uri)
request.content_type = "application/json"
request["Authorization"] = "Basic amkkdksmmkk3XCf45DffSa23Ert"
request.body = JSON.dump({
"serviceID" => "3","TypeId" => "52","requestFieldValues" => {
"summary" => "summary","description" => "something","prority" => {
"id" => "1"
},"customfield" => "5"
}
})
response = http.request(request)