Дразнить почтовый запрос с двоичными данными в Синатре

У меня есть конечная точка в приложении Sinatra, которая будет получать двоичные данные как часть тела. Другое приложение, отправляющее данные, будет иметь запрос Фарадея, который выглядит следующим образом:

    connection = Faraday.new(url: "https://example.com/post_data") do |conn|
      conn.request :multipart
      conn.adapter :net_http
      conn.headers['Content-Type'] = 'octet/stream'
    end

    @response ||= connection.post do |req|
      req.params = { :host => host,
                     :verification => "false"}
      req.body = my_base64_encoded_binary
    end

Затем в Синатре у меня будет конечная точка, которая получает эти параметры запроса и двоичные данные и передает их в модель, например:

post '/post_data' do
  request.body.rewind
  payload = request.body.read

  raise Sinatra::NotFound unless payload and params[:host]
  output = MyOutput.new(params, payload)

  content_type 'application/json'
  body output.data
end

Когда я пытаюсь проверить эту конечную точку, используя Rack::Test помощники, я попадаю в странную ситуацию. Я не могу создать правильный макет, чтобы правильно проверить эту конечную точку. Основываясь на ручном тестировании с PostMan, я почти уверен, что моя конечная точка работает правильно. Это просто тест, который держит меня. Вот спецификация:

 it "should return a json response" do
    post(url, :host => host, :verification => "false") do |req|
      req.body = [my_binary]
      req.content_type = "application/octet-stream"
    end

    expect(last_response.status).to eq(200)
    expect(last_response.content_type).to eq("application/json")
  end

И когда я проверяю, как выглядит входящий запрос в тесте, он не содержит правильного тела. params правильно установлен на host а также verification настройки я установил, но тело также настраивается на параметры (проверено через payload = request.body.read) вместо двоичного.

Есть ли другой способ настроить макет так, чтобы двоичный файл был правильно установлен в теле запроса, а параметры по-прежнему были правильно установлены в параметрах запроса?

1 ответ

Решение

Ответ в том, что единственный способ опубликовать тело - это то, где я добавляю параметры в помощник по тестированию стойки. Мне нужно было взять params и переместить их в строку запроса URL-адреса в запросе, а затем только добавить двоичный файл в качестве body из post запрос в тестовом помощнике.

  let(:url) { "http://example.com/post_data?host=>#{host}&verification=#{verification}" } 
  it "should return a json response" do
    post(url, my_binary)

    expect(last_response.status).to eq(200)
    expect(last_response.content_type).to eq("application/json")
  end
Другие вопросы по тегам