Backbone: Синхронизация CORS отправляет запрос OPTIONS вместо POST

Созданный на 17 мая 2013  ·  17Комментарии  ·  Источник: jashkenas/backbone

I'm trying to use the model.save() with a rest service on another subdomain. Я пытаюсь использовать model.save() со службой отдыха в другом поддомене. I got the following request headers which are far from my expectations: Я получил следующие заголовки запроса, которые далеки от моих ожиданий:

OPTIONS /user HTTP/1.1
Host: not.public
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://not.public
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

How to fix this? Как это исправить?

Ofc. офк. my REST server responds 404 not found for an OPTIONS call... мой сервер REST отвечает 404, не найден для вызова OPTIONS...

To avoid unwanted questions: the server is ok, it handles REST calls and CORS calls well, tested with $.ajax and a REST interface tester application too. Чтобы избежать нежелательных вопросов: сервер в порядке, он хорошо обрабатывает вызовы REST и вызовы CORS, протестирован с помощью $.ajax и приложения для тестирования интерфейса REST.

en

Самый полезный комментарий

@inf3rno try this one. @inf3rno, попробуй это.

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Methods: POST');

This isn't Backbone issue at all. Это вовсе не проблема Backbone.

en

Все 17 Комментарий

Look up how CORS works -- this is the expected "preflight" request Посмотрите, как работает CORS — это ожидаемый «предполетный» запрос.

https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS#Preflighted_requests https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS#Preflighted_requests

en

Как я могу избежать этого запроса на повторную проверку?

en

Отправлять только «простой запрос», как определено здесь: https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS#Simple_requests

en

I tried this on server side to handle preflight calls: Я попробовал это на стороне сервера для обработки предварительных вызовов:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: X-Requested-With');
header('Access-Control-Allow-Methods: POST, GET, PUT, DELETE, OPTIONS');

but did not work, the browser does not send another request after the preflight... но не сработало, браузер не отправляет еще один запрос после предполетной проверки...

So you say that it is not possible with backbone.sync? То есть вы говорите, что с backbone.sync это невозможно?
Then it is a bug I think... Тогда это баг, я думаю...

en

В любом случае, это не проблема Backbone, поэтому я предлагаю задать вопрос в Stackoverflow или IRC.

en

Можете ли вы объяснить мне, почему это не проблема с магистралью?

en

Прочтите исходный код Backbone.sync ( http://backbonejs.org/docs/backbone.html#section-134 ), и вы увидите, что Backbone просто передает все в $.ajax.

en

@inf3rno try this one. @inf3rno, попробуй это.

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Methods: POST');

This isn't Backbone issue at all. Это вовсе не проблема Backbone.

en

These are my original headers without php: Это мои оригинальные заголовки без php:

HTTP/1.1 200 OK
Cache-Control: max-age=0, no-cache, no-store, must-revalidate
Pragma: no-cache
Content-Type: text/html
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Server: Microsoft-IIS/7.5
X-Powered-By: PHP/5.3.8, ASP.NET
access-control-allow-origin: http://x.y.loc
Access-Control-Allow-Methods: POST, GET, PUT, DELETE, OPTIONS
Date: Fri, 17 May 2013 01:33:02 GMT
Content-Length: 0

I think my server is well configured, but I tried out the headers you gave, and they did not work... Я думаю, что мой сервер хорошо настроен, но я попробовал заголовки, которые вы дали, и они не сработали...

Simple $.ajax calls work well, for example I load json files from the service with this: Простые вызовы $.ajax работают хорошо, например, я загружаю файлы json из службы следующим образом:

define(function (require, exports, module) {
    var $ = require("jquery");

    module.exports = {
        load: function (name, _require, load, config) {
            var params = name.split("|");
            var method, url;
            if (params.length == 1) {
                method = "GET";
                url = params[0];
            }
            else {
                method = params[0];
                url = params[1];
            }
            $.ajax({
                url: url,
                type: method,
                dataType: "json"
            }).success(load).error(function (xhr, status, error) {
                    throw error;
                });
        }
    };

});

I tried out this with any request method, and they responded well... Я пробовал это с любым методом запроса, и они хорошо ответили...

The collection.fetch() works well too, I have problems only with the model.save() ... collection.fetch() тоже работает хорошо, у меня проблемы только с model.save()...

I tried it this way, maybe I'm doing something wrong: Пробовал так, может что не так делаю:

        var User = Backbone.Model.extend({
            urlRoot: Application.service.Authorization.User.create.url
        });
        var form = new UserForm({
            model: new User({
                email: "[email protected]",
                name: "test"
            })
        }).render();
        form.on("submit", function (user) {
            console.log(user.attributes);
            user.save(null, {
                success: function (model, response, options) {
                    console.log("success");
                },
                error: function (model, xhr, options) {
                    console.log("error");
                }
            });
        });

I got the attributes and "error" in console. Я получил атрибуты и «ошибку» в консоли. I'll check what kind of error is.. посмотрю что за ошибка..

en

You were right, thanks! Вы были правы, спасибо! I added to server config the allow content-type, and it works now. Я добавил в конфигурацию сервера разрешающий тип контента, и теперь он работает. Firebug is not the best, the Chrome console printed that the content-type is not allowed... Firebug не самый лучший, консоль Chrome напечатала, что тип контента не разрешен...

en

Many tanks! Много танков! :D :D

en

GET and POST requests requires quite different headers. Запросы GET и POST требуют совершенно разных заголовков. When the API server uses cookies for authentication, the server should have Access-Control-Allow-Credentials: true header. Когда сервер API использует cookies для аутентификации, сервер должен иметь заголовок Access-Control-Allow-Credentials: true . And off course you need to make a XHR request with withCredentials: true on client-side. И, конечно же, вам нужно сделать запрос XHR с withCredentials: true на стороне клиента. When the API server uses Authorization header for BasicAuth request, you don't need withCredential . Когда сервер API использует заголовок Authorization для запроса BasicAuth, вам не нужно withCredential . Instead, the Access-Control-Allow-Headers need to include Authorization in this case, just like Вместо этого Access-Control-Allow-Headers Authorization , как и

header('Access-Control-Allow-Headers: Authorization, Content-Type');

Ah, it seems you solved the issue while I'm writing this. Ах, кажется, вы решили проблему, пока я пишу это.

en

Да все равно спасибо, вы очень помогли!

en

@inf3rno Thanks so much for the comment about Chrome giving better error messages than Firebug! @inf3rno Большое спасибо за комментарий о том, что Chrome выдает лучшие сообщения об ошибках, чем Firebug! That helped us solve the problem. Это помогло нам решить проблему.

en

You're welcome! Пожалуйста! :-) :-)

en

Can someone please help on this issue? Может ли кто-нибудь помочь в этом вопросе? http://stackoverflow.com/questions/32725249/cors-filter-issue-for-authentrypoint http://stackoverflow.com/questions/32725249/cors-filter-issue-for-authentrypoint

en

На случай, если у кого-то еще возникла эта проблема, мне пришлось добавить «x-http-method-override» в мой список Access-Control-Allow-Methods, который используется, когда вы устанавливаете Backbone.emulateHTTP = true

en
Была ли эта страница полезной?
0 / 5 - 0 рейтинги