我在尝试使用在ruby上有密码的证书时遇到了很多麻烦.我正在使用rest-client,但这不是必需的.
这是我需要进行的cURL等效调用:
curl -E certificate.pem:PASSWORD -d ident=language -d data="test" "https://theurl"
Run Code Online (Sandbox Code Playgroud)
我尝试了很多东西,但我无法让密码部分工作.这是我到目前为止所拥有的:
cert = OpenSSL::X509::Certificate.new(File.read("#{RAILS_ROOT}/certificate.pem"))
reply = RestClient.post("https://theurl", {:ident => 'language', :data => 'test'}, {:ssl_client_cert => cert})
Run Code Online (Sandbox Code Playgroud)
我已经尝试将密码放在任何地方,如:密码和:ssl_client_key,我查看了我能找到的所有文档但是没有任何地方可以接受这个密码.
这是我总是得到的错误:
SSL_connect returned=1 errno=0 state=SSLv3 read finished A: sslv3 alert handshake failure
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
我有一个cURL,我试图转换成Ruby.
cURL是这样的:
curl -i -k -H "Accept: application/json" -H "Authorization: token" -H "Content-Type: image/jpeg" -H "Content-Length: 44062" --data-binary "gullfoss.jpg" http://www.someurl.com/objects
Run Code Online (Sandbox Code Playgroud)
我的Ruby代码是这样的:
image = File.read('uploads/images/gullfoss.jpg')
result = RestClient.post('http://www.someurl.com/objects',image,{'upload' => image, 'Accept' => 'application/json', 'Authorization' => 'token', 'Content-Type' => 'image/jpeg', 'Content-Length' => '44062'})
Run Code Online (Sandbox Code Playgroud)
Ruby代码给了我一个400 Bad Request.授权或其他标题不是问题.我认为问题在于将--data-binary转换为Ruby.
任何帮助赞赏.
谢谢,阿德里安
如何使用rest client 执行以下查询(在doc中给出).
curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{
"query" : {
"term" : { "user" : "kimchy" }
}
}
'
Run Code Online (Sandbox Code Playgroud)
我试过这样做:
q = '{
"query" : {
"term" : { "user" : "kimchy" }
}
}
'
r = JSON.parse(RestClient.get('http://localhost:9200/twitter/tweet/_search', q))
Run Code Online (Sandbox Code Playgroud)
这引发了一个错误:
in `process_url_params': undefined method `delete_if' for #<String:0x8b12e18> (NoMethodError)
from /home/socialapps/.rvm/gems/ruby-1.9.3-p194/gems/rest-client-1.6.7/lib/restclient/request.rb:40:in `initialize'
from /home/socialapps/.rvm/gems/ruby-1.9.3-p194/gems/rest-client-1.6.7/lib/restclient/request.rb:33:in `new'
from /home/socialapps/.rvm/gems/ruby-1.9.3-p194/gems/rest-client-1.6.7/lib/restclient/request.rb:33:in `execute'
from /home/socialapps/.rvm/gems/ruby-1.9.3-p194/gems/rest-client-1.6.7/lib/restclient.rb:68:in `get'
from get_check2.rb:12:in `<main>'
Run Code Online (Sandbox Code Playgroud)
当我使用相同的时候RestClient.post,它给了我正确的结果!但是elasticsearch doc XGET在curl命令中使用搜索查询而不是XPOST.如何使该RestClient.get方法工作?
如果有其他/更好的方法来执行此操作,请建议.
在本地运行Rails应用程序时,我可以配置Charles Proxy来显示该应用程序的所有请求/响应详细信息,可从lvh.me:3000访问。
但是,我无法捕获Rails应用程序内部对外部URL的http调用。例如,当我在Rails应用程序中进行外部呼叫说http://www.google.com时使用rest-client / httparty时,Charles代理不会显示服务器对google.com发起的http请求。
有人可以建议我缺少什么配置吗?在“记录设置”>“包含”>中,我添加了http://www.google.com。
我正在通过使用Pocket API构建Rails应用程序来测试RoR,我必须授权用户.对于HTTP请求,我使用的是https://github.com/rest-client/rest-client库.
第一步,获取请求令牌工作正常:
require 'rest_client'
response = RestClient.post 'https://getpocket.com/v3/oauth/request', :consumer_key => @consumer_key, :redirect_uri => @redirect_uri
@code = response.split("=")[1]
Run Code Online (Sandbox Code Playgroud)
但是我在第二步遇到错误请求错误,即使用上面步骤中收到的请求令牌获取访问令牌:
access_token = RestClient.post 'https://getpocket.com/v3/oauth/authorize', :consumer_key => @consumer_key, :code => @code
Run Code Online (Sandbox Code Playgroud)
400错误请求是我在Ruby应用程序错误屏幕上得到的.我也尝试过使用cURL和POSTMan Chrome扩展程序的相同请求,我得到的状态代码是:403 Forbidden.我得到的X-Error Code是158,它转换为X-Error消息"User rejects code".在Pocket API文档上:http://getpocket.com/developer/docs/authentication.
由于我已经尝试了几个不同的通道来测试这个请求并且每次都失败了,我猜测问题不在于解析,而是我可能缺少重要的细节或步骤(可能是HTTP请求头?).感谢您的帮助!
我在Ruby中执行GET请求,但不确定为什么我有时会得到以下堆栈跟踪.
RestClient::MethodNotAllowed: 405 Method Not Allowed
[GEM_ROOT]/gems/rest-client-1.6.8/lib/restclient/abstract_response.rb:48:in return!
[GEM_ROOT]/gems/rest-client-1.6.8/lib/restclient/request.rb:269:in process_result
[GEM_ROOT]/gems/rest-client-1.6.8/lib/restclient/request.rb:212:in block in transmit
/usr/lib/ruby/2.0.0/net/http.rb:852:in start
[GEM_ROOT]/gems/rest-client-1.6.8/lib/restclient/request.rb:206:in transmit
[GEM_ROOT]/gems/rest-client-1.6.8/lib/restclient/request.rb:68:in execute
[GEM_ROOT]/gems/rest-client-1.6.8/lib/restclient/request.rb:35:in execute
[GEM_ROOT]/gems/rest-client-1.6.8/lib/restclient.rb:70:in get
Run Code Online (Sandbox Code Playgroud)
这特别令人困惑,因为堆栈跟踪没有说明哪种方法不允许.可能是导致此错误的原因是什么?
我正在使用spring创建一个异步休息调用
@GetMapping(path = "/testingAsync")
public String value() throws ExecutionException, InterruptedException, TimeoutException {
AsyncRestTemplate restTemplate = new AsyncRestTemplate();
String baseUrl = "https://api.github.com/users/XXX";
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
String value = "";
HttpEntity entity = new HttpEntity("parameters", requestHeaders);
ListenableFuture<ResponseEntity<User>> futureEntity = restTemplate.getForEntity(baseUrl, User.class);
futureEntity.addCallback(new ListenableFutureCallback<ResponseEntity<User>>() {
@Override
public void onSuccess(ResponseEntity<User> result) {
System.out.println(result.getBody().getName());
// instead of this how can i return the value to the user ?
}
@Override
public void onFailure(Throwable ex) {
}
});
return "DONE"; // instead of …Run Code Online (Sandbox Code Playgroud) 我正在编写一个库来调用第三方 API,以便 Rails 应用程序可以使用它。为了进行身份验证,API 最初使用基本身份验证来返回用于所有其他请求的令牌。令牌的有效期为 1 小时,并且可以使用相同的基本身份验证凭据获取多个令牌,而不会使任何其他令牌失效。
这是我到目前为止所拥有的精简版本:
# frozen_string_literal: true
require "rest-client"
class AcmeClient
ACME_API_URL = Application.secrets.acme[:url]
ACME_API_KEY = Application.secrets.acme[:key]
ACME_API_SECRET = Application.secrets.acme[:secret]
def health_check
url = ACME_API_URL + "api/health"
token = fetch_token
RestClient.get url, { Authorization: "Bearer #{token}"}
end
private
def fetch_token
url = ACME_API_URL + "/api/token"
response = RestClient::Request.execute(
method: :post,
url: url,
user: ACME_API_KEY,
password: ACME_API_SECRET,
payload: "grant_type=client_credentials"
)
JSON.parse(response.body)["access_token"]
end
end
Run Code Online (Sandbox Code Playgroud)
我已将该health_check方法作为可用 API 端点的示例。
之前只使用现有的 gem 来调用 API,我不确定如何处理返回的令牌。我不想在每次 API 调用之前获取一个新的,因为这似乎不必要地过多,所以我猜将它存储在某个地方是有意义的。
在这种情况下,是否最好创建一个acme_tokens包含 …
我正在尝试使用RestClient将数据作为multipart上传,如下所示:
response = RestClient.post(url, io, {
:cookies => {
'JSESSIONID' => @sessionid
},
:multipart => true,
:content_type => 'multipart/form-data'
})
Run Code Online (Sandbox Code Playgroud)
该io参数是包含我的文件StringIO的,所以它从内存而不是从磁盘.
服务器(Tomcat servlet)无法读取多部分数据,从而出错:
org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
Run Code Online (Sandbox Code Playgroud)
所以我相信RestClient不会以多部分格式发送它?有谁看到了问题?我假设问题出在Ruby(客户端)端,但如果有人认为它可能是服务器端问题,我可以发布我的servlet(Spring)代码.
我也想知道RestClient会用于上传的文件名,因为没有实际的文件...你有没有文件名的多部分请求吗?
请帮我解决以下问题:我有许多申请和相关记录.
app with id 1 has: record1, record2 and record3.
app with id 2 has: record1 ... record1000
Run Code Online (Sandbox Code Playgroud)
使用curl过滤app 1 Im的记录.我可以使用以下命令获取记录:
curl -i -H "accept: application/json" -H "Content-type: application/json" -X GET -d '{ "filters": { "app_id":"1" }}' http://[rails_host]/v1/records?token=[api_token]
Run Code Online (Sandbox Code Playgroud)
我怎么能用ruby RestClient(gem'rest-client''1.7.2')做同样的事情
要获取所有记录,请执行以下操作:
RestClient.get("http://[rails_host]/v1/records?token=[api_token]", { :content_type => 'application/json', :accept => 'application/json'})
Run Code Online (Sandbox Code Playgroud)
问题是不会返回应用ID,因此我无法解析响应并获取app id = 1的记录
任何想法如何添加有效负载到Restclient.get来过滤掉记录?
rest-client ×10
ruby ×6
curl ×2
asynchronous ×1
file-upload ×1
http ×1
httprequest ×1
java ×1
multipart ×1
oauth ×1
openssl ×1
pocket ×1
proxy ×1
rest ×1
spring ×1
wireshark ×1