2014-04-10 13 views
12

Tôi đang thực sự làm việc trên API sử dụng Rails 4. Tôi muốn đặt Content-Type yêu cầu JSON nếu khách hàng không chỉ định loại phương tiện trong tiêu đề Content-Type.Buộc tất cả các yêu cầu nhận được Kiểu nội dung vào JSON

Để có được hành vi đó tôi đã cố gắng để thêm before_action sau trong ApplicationController tôi:

def set_request_default_content_type 
    request.format = :json 
end 

Trong phương pháp RegistrationsController#create của tôi, tôi có một breakpoint để kiểm tra xem tất cả mọi thứ đang làm việc. Vâng, thủ thuật request.format không hoạt động, mặc dù giá trị được đặt thành application/json có vẻ như bộ điều khiển (hoặc Rails internals) không xem xét Content-Type của yêu cầu nhận được dưới dạng JSON.

Tôi đã làm một yêu cầu POST với cơ thể sau đây (và không có Content-Type):

{"user" : {"email":"[email protected]","password":"foobarfoo"}} 

Bằng cách gỡ lỗi với Pry tôi thấy rằng:

[2] api(#<V1::RegistrationsController>) _ request.format.to_s 
=> "application/json" 
[3] api(#<V1::RegistrationsController>) _ params 
=> { 
     "action" => "create", 
    "controller" => "v1/registrations" 
} 

Nó có nghĩa là Rails không có xem xét yêu cầu của tôi với request.format được định cấu hình với Mime::JSON, nhưng thay vào đó là Mime::ALL và do đó nó không phân tích cú pháp nội dung JSON của yêu cầu. :(

+0

tôi nghĩ bạn ne ed sử dụng [wrap_parameters()] (http://apidock.com/rails/ActionController/ParamsWrapper/ClassMethods/wrap_parameters) trong bạn 'ActionController' –

+0

' ActionController :: ParamsWrapper' được kích hoạt theo mặc định cho định dạng json. Nhưng nó không hoạt động. Tại thời điểm này tôi không sử dụng MetalController nhưng là một kiến ​​trúc Rails cổ điển với các bộ điều khiển tiêu chuẩn. – Mich

Trả lời

-1

bạn sẽ có thể thiết lập các định dạng mặc định sử dụng các tuyến đường: http://guides.rubyonrails.org/routing.html#defining-defaults

resources :registrations, ... defaults: { format: 'json' } 

also see:? How to set the default format for a route in Rails? định dạng-cho-một-đường-in-ray answertab = active # tab-top


Cũng có thể quan tâm:

Rails bỏ qua chấp nhận tiêu đề khi nó chứa “/” hoặc “/”, và trả về HTML (hoặc JS nếu đó là một yêu cầu XHR).

Điều này được thiết kế để luôn trả về HTML khi được truy cập từ trình duyệt.

Điều này không tuân theo đặc điểm thương lượng loại mime nhưng đó là cách duy nhất để phá vỡ các trình duyệt cũ với tiêu đề chấp nhận bị lỗi. Họ đã chấp nhận tiêu đề với loại mime đầu tiên là hình ảnh/png hoặc text/xml.

+0

Tôi đã cố gắng sử dụng thông số định dạng mặc định của cấu hình/route.rb và về cơ bản cũng giống như trước đây: [2] api (# ) _ request.format.to_s => " application/json " [3] api (# ) _ request.content_type =>" text/plain " [4] api (# ) _ params => { "định dạng" =>: json, "hành động" => "tạo ra", "điều khiển" => "v1/đăng ký" } :( – Mich

+1

request.format không thay đổi request.content_type – Mich

+0

tôi thấy bạn vấn đề, của nó với yêu cầu (content_type) không phải là đáp ứng (định dạng) – house9

0
class V1::RegistrationsController < ApplicationController 
    respond_to :json 
end 

Làm cho định dạng phản ứng mặc định json

0

Bạn có thể định nghĩa một any loại phản ứng bên trong khối respond_to, mà sẽ không hạn chế điều khiển của bạn để trả lời khi yêu cầu uri kết thúc với .json, nó cũng nhẹ nhõm bạn từ việc xác định loại phản hồi một cách rõ ràng và sẽ giữ, độc lập với loại nội dung yêu cầu, đáp ứng như bạn muốn, ví dụ:

respond_to do |format| 
    format.any {render :json => {foo: 'bar'}} 
end 
Các vấn đề liên quan