net / http PUT与身体导致问题

时间:2016-02-03 16:26:52

标签: ruby curl net-http

我想使用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。

有人知道我的要求是什么问题吗?

1 个答案:

答案 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) }