ruby 到Azure ML Endpoint的TCPSocket连接

nvbavucw  于 2023-04-20  发布在  Ruby
关注(0)|答案(1)|浏览(110)

因为我只能使用一组受限的Ruby 1.9.3基础库来处理打包应用程序的脚本环境,所以我只能使用TCPSocket来访问互联网。特别是,我不能使用net/http或json或uri...
尽管如此,我还是想称之为Azure ML模型端点。
下面是我正在尝试做的事情,但不幸的是,我从“socket.gets”得到一个错误:
Errno::ECONNRESET(远程主机强制关闭了一个现有的连接。@ io_fillbuf - fd:3)

require 'socket'

data =  '{
            "Inputs": {
              "data": [
                {
                  "Column1": "example_value",
                  "Column2": 0
                }
              ]
            },
            "GlobalParameters": {
              "method": "predict"
            }
          }'

# Send the HTTP request
socket = TCPSocket.open('xxxxx-ml-yyyyy.northeurope.inference.ml.azure.com', 443)
request = "POST 'xxxxx-ml-yyyyy.northeurope.inference.ml.azure.com HTTP/1.1\r\n"
request += "Host: xxxxx-ml-yyyyy.northeurope.inference.ml.azure.com\r\n"
request += "Content-Type: application/json\r\n"
request += "Authorization: Bearer 1234567890abcdefghjklmnopqrstuvwx\r\n"
request += "Content-Length: #{data.bytesize}\r\n"
request += "\r\n"
request += data
socket.print(request)

# Get the response
response = ""
while line = socket.gets
  response += line
end

# Close the socket
socket.close

puts response

(可与irb 2.5.3重现)
在同一台机器上通过Python调用Endpoint工作得很好。所以我想我的HTTP请求是错误的?

d8tt03nd

d8tt03nd1#

试试下面的代码

require 'net/http'
uri = URI('https://xxxxxxxxxxx.centralindia.inference.ml.azure.com/score')
data = <<~JSON {
  "data": [
    [1,2,3,4,5,6,7,8,9,10],
    [10,9,8,7,6,5,4,3,2,1]
  ],
"GlobalParameters": {
  "method": "predict"
    } 
}
JSON
res = Net::HTTP.post(uri, data, 'Authorization' => 'Bearer e3QYxI3Cxxxxxxxxxxxxxxxxxxx4NOcFFu','Content-Length' => '#{data.bytesize}', 'Content-Type' => 'application/json')
puts res.body

这是我得到的结果。我也和 Postman 验证了这一点。

相关问题