Как включить данные изображения и границы в теле сообщения? - PullRequest
0 голосов
/ 14 февраля 2019

Мне нужно включить изображение в текст запроса Post, используя Ruby.В примере используется API визуального поиска Bing для поиска изображений, похожих на изображения, отправленные в теле сообщения.Я получаю результат, но это пустой JSON.Очевидно, что-то не так с кодом для настройки тела сообщения.Я новичок в языке Ruby.

В теле сообщения есть границы текста, которые должны быть включены в данные изображения.Я знаю, что запрос работает, потому что я могу отправить тот же запрос с использованием C # или Java и получить результаты.Я пробовал base64encode данных изображения и просто считывал файл в массив Post.

# include libs
require 'net/https'
require 'uri'
require 'json'
require 'base64'

accessKey = "Access_Key_String"
uri  = "https://api.cognitive.microsoft.com"
path = "/bing/v7.0/images/visualsearch"
batchNumber = "097ad727-862d-4720-93c4-08f7038cea7c"
fileName = "ElectricBike.jpg"

if accessKey.length != 32 then
    puts "Invalid Bing Search API subscription key!"
    puts "Please paste yours into the source code."
    abort
end

def BuildFormDataStart(batNum, fileName)
    startBoundary = "--batch_" + batNum
    return startBoundary + "\r\n" + "Content-Disposition: form-data; 
    name=\"image\"; filename=" + "\"" + fileName + "\"" + "\r\n\r\n"    
end

def BuildFormDataEnd(batNum)
    return "\r\n\r\n" + "--batch_" + batNum + "--" + "\r\n"
end

# Construct the endpoint uri.
uri = URI(uri + path)

# Load the parts of the post body into an array.
post_body = []

# Add the file Data
post_body << BuildFormDataStart(batchNumber, fileName)

post_body << File.read(fileName) #Base64.encode64(File.read(fileName))

post_body << BuildFormDataEnd(batchNumber)

# Create the HTTP objects
header = {'Ocp-Apim-Subscription-Key': accessKey}

# Create the request.
request = Net::HTTP::Post.new(uri, 'knowledgeRequest' => "KnowledgeRequest")

request['Ocp-Apim-Subscription-Key'] = accessKey
request.content_type = "multipart/form-data; boundary=batch_" + batchNumber  
request.body = post_body.join


# Send the request and get the response.
response = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
http.request(request)
end

puts "\nRelevant Headers:\n\n"
response.each_header do |key, value|
    # Header names are lower-cased.
    if key.start_with?("bingapis-") or key.start_with?("x-msedge-") then
        puts key + ": " + value
    end
end

puts "\nJSON Response:\n\n"
puts JSON::pretty_generate(JSON(response.body))

Результат Ruby пуст, но пример C # онлайн работает:

https://docs.microsoft.com/en-us/azure/cognitive-services/bing-visual-search/quickstarts/csharp

  "tags": [
    {
      "displayName": "",
      "actions": [
        {
          "actionType": "MoreSizes"
        },
        {
          "actionType": "ImageById"
        }
      ]
    }
  ],
  "image": {
    "imageInsightsToken": ""
  }

1 Ответ

0 голосов
/ 15 февраля 2019

При рассмотрении класса Net::HTTP в Ruby я обнаружил ссылку , в которой говорится, что Net::HTTP#post_form используется для данных многоэлементной формы.Я бы попробовал рефакторинг вашего кода, чтобы использовать этот метод для заполнения тела формы, вместо того, чтобы напрямую устанавливать для него строковое значение.Возможно, данные вашей формы не читаются правильно, когда тело сообщения установлено напрямую.

...