我想使用ruby中的Cloudera API。所以我想 更新cloudera管理器的配置,完成 使用包含一些json数据的HTTP PUT请求。
网址为 $query = DB::table('parameters');
if ($query === 1) {
$query->where('param1', '=', 100)
->where('param2', '=', 100)
->where('param3', '=', 100);
}elseif ($query === 2) {
$query->where('param1', '<', 80)
->where('param2', '<', 80)
->where('param3', '<', 80);
}else{
$query->whereBetween('param1', [80, 100])
->whereBetween('param2', [80, 100])
->whereBetween('param3', [80, 100]);
}
$result = $query->get();
,我的第一个方法是以下代码:
http://localhost:7180/api/v11/cm/config
此变体返回带有消息的400 Bad Request响应
require 'net/http'
require 'base64'
port = 7180
host = 'localhost'
req = Net::HTTP::Put.new('/api/v11/cm/config')
req.body = '{"items":[{"name":"TSQUERY_STREAMS_LIMIT","value":1000},{"name":"parcel_proxy_server","value":"proxy"},{"name":"parcel_proxy_port","value":"8080"},{"name":"parcel_update_freq","value":"1"}]}'
req['Content-Type'] = 'application/json'
req['Authorization'] = "Basic #{Base64.encode64('admin:admin')}"
client = Net::HTTP.new(host, port)
resp = client.request(req)
puts resp
puts resp.to_hash
puts resp.body
如果我想在wireshark中使用"message" : "No content to map due to end-of-input\n at [Source: org.apache.cxf.transport.http.AbstractHTTPDestination$1@4561cbc9; line: 1, column: 1]"
设置进行跟踪,则此请求会以某种方式显示。
然后我转而使用tcp.port == 7180
使用以下源代码:
Net::HTTP.start
这件事也回复了一个糟糕的要求,但没有任何身体或其他。与第一种方法相反,这一方法出现在wireshark中,但它发布的主体被描述为使用超文本传输协议。如果我使用cURL执行相同的请求,请求正文将正确显示为JavaScript Object Notation。
有人知道我的要求是什么问题吗?
答案 0 :(得分:0)
好的,所以我试了几个小时,但这种行为很奇怪:
要解决此问题,我首先使用Net::HTTP.start
代替Net::HTTP.new
。其次,甚至更重要:
我曾经通过手动设置标题值进行基本身份验证,如您在
req['Authorization'] = "Basic #{Base64.encode64('admin:admin')}"
但是Net::HTTP::Put
已经提供了basic_auth
方法。如果不使用这个,我会得到奇怪的错误。
所以工作版看起来像这样:
req = Net::HTTP::Put.new('/api/v11/cm/config')
req.body = '{"items":[{"name":"TSQUERY_STREAMS_LIMIT","value":1000},{"name":"parcel_proxy_server","value":"proxy"},{"name":"parcel_proxy_port","value":"8080"},{"name":"parcel_update_freq","value":"1"}]}'
req['Content-Type'] = 'application/json'
req.basic_auth 'admin', 'admin'
resp = Net::HTTP.start(host, port) { |client| client.request(req) }