2013-03-09 3 views
0

My restler 3 api отлично работает на локальном тестовом сервере и отлично работает на рабочем сервере, если звонки с этого же сервера, но если я сделаю звонок удаленно, тогда он терпит неудачу.restler 3 перекрестный домен не работает

Использование одного и того же клиента для отдыха с онлайн-примерами luracast прекрасно работает с удаленным вызовом, поэтому должно быть что-то в моей конфигурации (либо мой api, либо мой производственный сервер).

я нашел упоминание о необходимости отправки заголовков и поэтому попытался добавить эти заголовки в файле index.php:

header('Access-Control-Allow-Origin: *'); 
header('Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, PATCH, DELETE'); 
header('Access-Control-Max-Age: 1000'); 
header('Access-Control-Allow-Headers: *'); 

Но это не помогло. Используя аддон RESTClient в firefox, я вижу, что эти заголовки отправляются, и браузер будет показывать данные как локально, так и удаленно, независимо от того, использую ли эти команды заголовка или нет.

Вот вызов примера: https://api.masterpiecesolutions.org/v1/artists/?key=A4oxMOYEUSF9lwyeFuleug==

Моего index.php для этого вызова использует это, с 2 парами для отображения на корневой уровень

$r->addAPIClass('Artists', ''); 

Не знаю, если это уместно.

Кроме того, производственный сервер Amazon EC2, возможно, что-то связано с политикой безопасности?

Или, может быть, это еще одна проблема с заголовком? В google chrome, используя расширение Advanced Rest Client, он дает статус 403 Forbidden, а Content-Type - text/plain (с использованием локального или удаленного сервера), поэтому он не будет работать вообще, в отличие от админа Firefox.

Я также вижу использование $_SERVER['HTTP_ORIGIN'] в Restler.php, и это, похоже, не поддерживается повсюду?

ответ

1

Проблема, для меня, по крайней мере, использовала SSL, а класс restclient не учитывал это.

Поэтому я добавил (к моему RestClient.class.php с phpclasses.org) curl_setopt ($ this-> curl, CURLOPT_SSL_VERIFYPEER, false); // для SSL и теперь он работает.

Также требуется установка public static $ crossOriginResourceSharing = true; в Defaults.php для Restler 3.

+0

Просто FYI: если вы используете завиток внутри, вам не нужна поддержка CORS. CORS требуется только в запросах кросс-домена браузера – Luracast

1

* недействительное значение для заголовка ответа Access-Control-Allow-Headers. Вам нужно указать каждый непростой заголовок запроса. Например:

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

рассмотреть также положить одно значение происхождения или просто * для заголовка Access-Control-Allow-Origin. Я только что посетил ваш образец url, и в этом заголовке есть несколько значений. Хотя это должно работать в соответствии со спецификацией CORS, оно пока не принято.

Наконец-то я заметил, что сервер установил Access-Control-Allow-Credentials: true. Если вы установите это значение true, то вам необходимо сделать две вещи:

  1. Значение заголовка Access-Control-Allow-Origin должно быть значение происхождения (например http://localhost, он не может быть *).
  2. Вам необходимо будет установить xhr.withCredentials = true; в код вашего JavaScript-клиента.

Если вы просто тестируете, вам следует попытаться заставить все работать, не устанавливая заголовок Access-Control-Allow-Credentials. Это упростит процесс отладки.

+0

Спасибо, я установил Access-Control-Allow-Credentials в false и Access-Control-Allow-Origin в *, но все равно не повезло. Я прокомментировал код в Restler.php, который устанавливает эти заголовки и устанавливает их вручную в файле index.php API. Кажется, что я должен что-то пропускать в настройках Restler или server, потому что мой клиент тестового клиента отлично работает, делая удаленные вызовы в примерах Restler 3 на сервере Luracast. – twiddly

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