Я пытаюсь получить класс (с GET) из Parse с помощью клиентского ключа. Я смог отправить успешный запрос с помощью Advanced Rest Client для Google Chrome; Я использовал заголовки X-Parse-Application-Id
и X-Parse-Client-Key
.
[edit] [edit2] Заголовки ответов (полученные из инструментов разработчика Chrome Developer OPTIONS):
HTTP/1.1 200 OK
Access-Control-Allow-Headers: X-Parse-REST-API-ключ, X-Parse-Javascript-Key, X-Parse-Application-Id, X-Parse-Client-Version, X-Parse-Session-Token, X-Requested-With, X-Parse-Revocable-Session, Content-Type
Access-Control-Allow-Methods: ОПЦИИ, POST, GET, PUT, DELETE
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 86400
Content-Type: application/json; кодировка = UTF-8
Дата: Вс, 29 Ноя 2015 04:23:08 GMT
Сервер: nginx/1.6.0
X-Parse-Platform: G1
X-Runtime: 0.000118
Контент-длина: 0
Подключение: сохранить жизнь
Однако попытка сделать то же самое в приложении "Угловое" дает мне следующую ошибку:
XMLHttpRequest не может загрузить https://api.parse.com/1/classes/GenResources. Поле заголовка запроса X-Parse-Client-Key не разрешено заголовками Access-Control-Allow-Headers в предполетном ответе.
Parse говорит, что он поддерживает использование совместного использования ресурсов с использованием разных источников, и я смог сделать запрос раньше, используя другой клиент, поэтому я уверен, что сервер не является проблемой. Я бы не смог изменить то, что заголовок ответа в любом случае.
Здесь код, который я использовал для формирования запроса GET.
var ng_portal = angular.module("ngPortal", []);
ng_portal.controller("GenResourcesCtrl", ["$http", function($http) {
$http({
method: "GET",
url: PARSE_URL + "/1/classes/GenResources",
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": PARSE_APP_ID,
"X-Parse-Client-Key": PARSE_CLIENT_KEY
}
}).then(
function success(res) {
console.log(res);
},
function error(res) {
console.log(res);
}
);
}]);
Вы задаете пользовательские заголовки в запросе, что вызовет запрос перед полетом (ОПЦИИ). Ответ от этого запроса должен включать заголовок, называемый "access-control-allow-headers", при этом значение представляет собой список заголовков, которые вы пытаетесь установить.
См. Https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
в частности раздел о предполетных запросах.
Я предлагаю использовать инструменты разработчика браузера, чтобы посмотреть заголовки запросов и ответов, чтобы убедиться, что они соответствуют спецификации CORS. Из сообщения об ошибке, которое вы указали, похоже, что сервер, на котором выполняется вызов перекрестного домена, который вы создаете, не поддерживает настраиваемые заголовки. Если вы видите иначе, обновите свой вопрос заголовками, и я могу предоставить дополнительную помощь.
Наверное, это проблема Parse.com. После всего одного разочарованного часа я столкнулся с этой записью в Google Groups
Соответствующая цитата
Из моего тестирования этот никогда (клиентский или javascript-ключ) не работал через javascript-взаимодействия в браузере.
Я на самом деле создал ошибку Parse Bug:
https://developers.facebook.com/bugs/488204124680438
Потому что я думал, что оба этих ключа должны работать через браузер (БЕЗ ПОЛЬЗОВАНИЯ SDK).
Id предлагает прочитать чтение моей ошибки. Я по-прежнему считаю, что правильная реализация заключается в том, чтобы эти ключи могли корректно работать с запросами браузеров, потому что они работают, если вы делаете это за пределами браузера.
Но, увы, они, похоже, не понимают проблемы, или не понимают, почему отключение этого только в браузере не имеет смысла, поскольку вы можете использовать его на любой другой платформе без проблем. Просто... Не... Делать... Смысл.
Вместо этого я использовал свой JavaScript-ключ X-Parse-Javascript-Key
(который, согласно документам на сегодняшний день, работает только с их SDK для JavaScript), и он отлично работает в качестве замены для замены X-Parse-Client-Key