2015-11-29 1 views
0

Я пытаюсь получить класс (с GET) из Parse с помощью клиентского ключа. Я смог отправить успешный запрос с помощью Advanced Rest Client для Google Chrome; Я использовал X-Parse-Application-Id и X-Parse-Client-Key заголовки.Использование ключа ключа анализа в Angular дает ошибку CORS

[править] [edit2] заголовки отклика (полученные из Инструментов разработчика Chrome OPTIONS):

HTTP/1.1 200 OK

Access-Control-Allow-Headers: X-Parse-REST-API-Key, 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: OPTIONS, POST, GET, PUT, DELETE

Access-Control-Allow-Origin: *

Access-Control-Max-Age: 86400

Content-Type: application/json; charset=utf-8

Date: Sun, 29 Nov 2015 04:23:08 GMT

Server: nginx/1.6.0

X-Parse-Platform: G1

X-Runtime: 0.000118

Content-Length: 0

Connection: keep-alive

Однако, пытаясь сделать то же самое в угловом приложение дает мне следующую ошибку:

XMLHttpRequest не может загрузить https://api.parse.com/1/classes/GenResources. Поле заголовка запроса X-Parse-Client-Key не разрешено заголовками Access-Control-Allow-Headers в предполетном ответе.

Parse говорит, что он поддерживает использование cross-origin resource sharing, и я смог сделать запрос раньше, используя другой клиент, поэтому я уверен, что сервер не является проблемой. Я бы не смог изменить то, что заголовок ответа в любом случае.

Вот код, который я использовал для формирования запроса 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); 
    } 
); 
}]); 

ответ

3

Вы настраиваете пользовательские заголовки в запросе, что вызовет запрос перед полетом (ОПЦИИ). Ответ от этого запроса должен включать заголовок, называемый «access-control-allow-headers», при этом значение представляет собой список заголовков, которые вы пытаетесь установить.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS См

специально раздел запросов перед полетом.

Предлагаю использовать средства разработки браузера, чтобы посмотреть заголовки запросов и ответов, чтобы узнать, соответствуют ли они спецификации CORS. Из сообщения об ошибке, которое вы указали, похоже, что сервер, на котором выполняется вызов перекрестного домена, который вы создаете, не поддерживает настраиваемые заголовки. Если вы видите иначе, обновите свой вопрос заголовками, и я могу предоставить дополнительную помощь.

+0

Как указано в документах API на странице https://parse.com/docs/rest/guide/#quick-reference-request-format, Parse поддерживает совместное использование ресурсов с использованием разных источников и я смог получить успешный ответ с запрошенными мной данными. Я обновлю исходный вопрос с заголовками. Заголовки ответов содержат * Access-Control-Allow-Methods * и * Access-Control-Allow-Origin *, но не тот, который вы упомянули ... – dook

+1

Отключите кеширование в инструментах разработчика Chrome и щелкните правой кнопкой мыши на перезагрузке, затем выберите, чтобы очистить кеш и перезагрузить. Вы должны увидеть новый вызов OPTIONS перед основным запросом на вкладке сети. Обновите вопрос с заголовками этого предполетного вызова OPTIONS. Благодаря! – allenru

+0

Спасибо, что сообщили мне, как проверить заголовки ответов. Теперь я вижу, что разрешенные заголовки не содержат «X-Parse-Client-Key», в отличие от того, что говорится в документации.Проблема в том, что клиент Advanced REST работает и извлекает данные, но я мог бы определить проблему на этом этапе. – dook

0

Это, по-видимому, проблема с Parse.com. После того, как ровно один нарушенный часа, я наткнулся на this Google Groups post

Соответствующей цитаты

From my testing, this never (client or javascript key) worked via javascript rest interactions through the browser.

I actually created a Parse Bug on this:

https://developers.facebook.com/bugs/488204124680438

Because I thought both of those keys should work through the browser (WITHOUT NEEDING TO USE A SDK).

I’d suggest reading reading my bug. I still think the the correct implementation is to enable these keys to work properly with browser requests because it works if you do it outside the browser.

But alas, they don’t seem to get the issue, or don’t understand why disabling it only in the browser doesn’t make sense since you can use it on any other platform without issues. Just… Doesn’t… Make… Sense.

вместо этого я использовал мой JavaScript ключ X-Parse-Javascript-Key (который, согласно документации по состоянию на сегодняшний день, работает только с их JavaScript SDK) и его отлично работает в качестве замены на замену для X-Parse-Client-Key

Смежные вопросы