Запрос API POST возвращает 404 маршрут не найден - PullRequest
1 голос
/ 21 июня 2019

Rails 5.2.2.1 ruby 2.6.3p62

Я пишу конечную точку API, которая должна принимать почтовый запрос. Я создал маршрут:

namespace :api do
   scope module: :v1, constraints: Example::ApiVersionConstraint.new(1) do
     resources 'books', only: [:create]
   end
 end

bundle exec rails routes | grep books возвращает:

api_books POST /api/books(.:format) api/v1/books#create

app/controllers/api/v1/books_controller.rb:

class Api::V1::BooksController < Api::BaseController
   attr_reader :book

   def create
      book = Book.build(title: 'test')

      if book.save
         render json: book
      else
         render json: { error: 'error' }, status: 400
      end
   end
end

сервер работает на порте 3000 и при отправке запроса POST на http://localhost:3000/api/books.json с помощью Почтальона я получаю этот ответ:

{
"errors": [
    {
        "code": "routing.not_found",
        "status": 404,
        "title": "Not found",
        "message": "The path '/api/books' does not exist."
    }
],
"request": ""
}

lib/example/api_version_constraint.rb:

module Example
  class ApiVersionConstraint

     def initialize(version)
        @version = version
     end

     def matches?(request)
        request.headers.fetch(:accept).include?("version=#{@version}")
     rescue KeyError
        false
     end
   end
end

почему запрос не находит маршрут?

1 Ответ

1 голос
/ 21 июня 2019

Возможно, что-то не так в ApiVersionConstraint.Для устранения неполадок вы можете сделать что-то вроде:

 def matches?(request)
    byebug
    request.headers.fetch(:accept).include?("version=#{@version}")
 rescue KeyError
    false
 end

Предполагая, что это проблема с тем, как вы нацеливаете заголовок, так что-то вроде этого может работать:

request&.headers&.fetch("Accept")&.include?("version=#{@version}")

Поскольку у вас естьrescue предложение, вы никогда не получите полную ошибку;только false, так что вы можете попробовать удалить это и посмотреть, получите ли вы более описательную ошибку.

...