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.
enLook 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
enI 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... Тогда это баг, я думаю...
В любом случае, это не проблема 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.
enThese 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.. посмотрю что за ошибка..
enYou 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 напечатала, что тип контента не разрешен...
enMany tanks! Много танков! :D :D
enGET
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. Это помогло нам решить проблему.
enYou're welcome! Пожалуйста! :-) :-)
enCan 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
Самый полезный комментарий
@inf3rno try this one. @inf3rno, попробуй это.
This isn't Backbone issue at all. Это вовсе не проблема Backbone.
en