Запрос http.get в контроллере agularJs отлично работает, когда мое клиентское приложение и api находятся в локальном хосте. когда api перемещается на сервер., возникает проблема.
клиентская сторона с использованием угловыхJs
$http.get('http://domain.com/api/spots/2/0').success(function(datas){ console.log(datas); });
log дает: запрос на перекрестный запрос заблокирован: политика одинакового происхождения запрещает чтение удаленного ресурса по адресу http://domain.com/api/spots/2/0 . Это можно устранить, переместив ресурс в тот же домен или включив CORS.
я добавил эти две строки к моей конструкции контроллера
header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: GET");
все та же ошибка.
Попробуйте добавить OPTIONS
к разрешенным методам.
header("Access-Control-Allow-Methods: GET, OPTIONS"); header("Access-Control-Allow-Headers: Content-Type, Content-Length, Accept-Encoding");
и сразу же возвращаются, когда запрос является «ОПЦИИ» метода, когда вы устанавливаете заголовки.
if ( "OPTIONS" === $_SERVER['REQUEST_METHOD'] ) { die(); }
См. Также этот ответ .
Угловой отправляет запрос предварительной проверки W3C CORS, соответствующий проверке правильных разрешенных методов, прежде чем пытаться его выполнить.
Лично я считаю, что страницу CORS для разработчиков Mozilla Developer Network немного легче читать по этому вопросу, чтобы помочь понять поток CORS.
Если кто-то еще сталкивается с проблемой, включение CORS в файл rest.php Codeigniter REST Controller сработало для меня. Это также четко описано в комментариях здесь https://github.com/chriskacerguis/codeigniter-restserver/blob/master/application/config/rest.php
//Change this to TRUE $config['check_cors'] = TRUE; //No change here $config['allowed_cors_headers'] = [ 'Origin', 'X-Requested-With', 'Content-Type', 'Accept', 'Access-Control-Request-Method' ]; //No change here $config['allowed_cors_methods'] = [ 'GET', 'POST', 'OPTIONS', 'PUT', 'PATCH', 'DELETE' ]; //Set to TRUE to enable Cross-Origin Resource Sharing (CORS) from any source domain $config['allow_any_cors_domain'] = TRUE; //Used if $config['check_cors'] is set to TRUE and $config['allow_any_cors_domain'] is set to FALSE. //Set all the allowable domains within the array //eg $config['allowed_origins'] =['http://www.example.com','https://spa.example.com'] $config['allowed_cors_origins'] = [];
если вы можете использовать jQuery Ajax, используйте эту строку в своем скрипте.
jQuery.support.cors = true; // force cross-site scripting (as of jQuery 1.5)
он решил проблему для меня, когда я попытался опубликовать некоторую строку, используя jQuery Ajax из гаджета рабочего стола в файл xppp php.
Сторона клиента => AngularJs (работает с Grunt в localhost: 9000) Сторона сервера => php (решение codeIgniter) (работает в localhost: 80)
Единственное, что сработало для меня, это добавить эти строки в контроллер веб-сервисов в моем проекте php:
/* here you do whatever you do to build the $data */ //but just before returning the method data add this header('Content-type: application/json'); header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: GET"); header("Access-Control-Allow-Methods: GET, OPTIONS"); header("Access-Control-Allow-Headers: Content-Type, Content-Length, Accept-Encoding"); echo json_encode($data, JSON_NUMERIC_CHECK);
Я добавил следующий конструктор в свой класс контроллера
public function __construct($config = 'rest') { header('Access-Control-Allow-Origin: *'); header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE"); parent::__construct(); }