Rails 5.1 API CORS problems
我有一个生成json的Rails 5.1.6 API。 我有一个单独的Vue.js客户端,旨在使用它。
该模型是实体。 GET请求可以很好地查看数据库中所有实体的索引。 但是,当我尝试发布新实体时,在控制台中出现以下错误:
Access to XMLHttpRequest at 'http://localhost:3000/entities' from origin > 'http://localhost:8080' has been blocked by CORS policy: Response to
preflight request doesn't pass access control check: No 'Access-Control-
Allow-Origin' header is present on the requested resource.
在rails应用程序中,我已经安装了rack-cors gem和
1 2 3 4 5 6 7 8 | Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do origins 'localhost:3000' resource '*', headers: :any, methods: %i(get post put patch delete options head) end end |
在routes.rb中:
1 2 3 4 5 6 7 8 9 | Rails.application.routes.draw do # For details on the DSL... post 'auth/login', to: 'authentication#authenticate' post 'signup', to: 'users#create' resources :entities do resources :transactions end end |
在客户端层:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | src/services/Api.js: import axios from 'axios' export default() => { return axios.create({ baseURL: 'http://localhost:3000' }) } src/services/EntitiesService.js: import Api from '@/services/Api' export default { fetchEntities () { return Api().get('/entities') }, addEntity (params) { return Api().post('entities', params) } } |
和
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | src/components/newEntity.vue: <template> Add Entity <input type="text" name="title" placeholder="TITLE" v-model="title"> <textarea rows="15" cols="15" placeholder="DESCRIPTION" v-model="description"></textarea> <button class="app_entity_btn" @click="addEntity">Add</button> </template> import EntitiesService from '@/services/EntitiesService' export default { name: 'NewEntity', data () { return { title: '', description: '' } }, methods: { async addEntity () { await EntitiesService.addEntity({ title: this.title, description: this.description }) this.$router.push({ name: 'Entities' }) } } } <style type="text/css"> .form input, .form textarea { width: 500px; padding: 10px; border: 1px solid #e0dede; outline: none; font-size: 12px; } .form div { margin: 20px; } .app_entity_btn { background: #4d7ef7; color: #fff; padding: 10px 80px; text-transform: uppercase; font-size: 12px; font-weight: bold; width: 520px; border: none; cursor: pointer; } </style> |
这是怎么了
显然在请求中包含标头之后,此方法现在正在工作...
这是新的请求:
1 2 3 4 5 6 7 8 9 10 11 12 13 | src/services/Api.js import axios from 'axios' export default() => { return axios.create({ baseURL: 'http://localhost:3000', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Access-Control-Allow-Origin': '*' } }) } |