Cross Origin $ http Запросы | Ресурс

Поэтому я писал приложение, когда столкнулся с этой проблемой.

Это PHP: Slimframework Соответствующий:

$app->delete('/products/:id',function($id) use($app){
$db = new mysqli('notsocoolhost','verycooluser','verycoolpassword','verycooldatabase');
$db->query("DELETE from products WHERE id='$id'");
});

Я удалил часть, где я подтверждаю, что вы действительно можете удалить его из базы данных.

Это Angular.JS:

   $scope.del = function(product){
$http({
method: "DELETE",
url: baseUrl + product.id
}).success(function(){ ......  //Returns 0 -> WTF?

Этот приятель возвращается с ошибкой: 0

и этот ниже возвращает 405:

$scope.delete(baseUrl + product.id).success ... //Returns 405 : Method Not Allowed

Подводя итог, я добавил пару тестов на Hurl.it, и RESTApi от Slimframework полностью функционирует. которая оставляет это как проблему Angular.js? Похоже?

ОБНОВИТЬ:

После дальнейшего осмотра я обнаружил следующее:

1) Загадочно: Метод запроса (поле от Firefox) — это ОПЦИИ.

2) Access-Control-Request-Method: «УДАЛИТЬ»

3) Access-Control-Allow-Methods: «GET, POST, DELETE, PUT»

1

Решение

Я надеюсь, что это послужит людям в будущем.

Возвращаясь к основам, проблемы с отправкой запросов $ http в запросах разных источников не имеют ничего общего ни с сервером, ни с Angular.js.

Если вы похожи на меня, размещающего ваше веб-приложение

https:\\www.beautifuldomain.com

и ваш API на:

https:\\api.beautifuldomain.com

Всякий раз, когда вы пытаетесь выполнить запрос между Webapp и API, вы выполняете Cross-Origin Request.

Что это значит?

Это означает, что ваше сообщение будет рассматриваться как перекрестное происхождение, и оно будет предварительно отправлено.

Preflighted?

Это означает, что при использовании любого другого метода, кроме GET, HEAD или POST.
Также POST, если используется для отправки данных запроса с Content-Type Кроме как application/x-www-form-urlencoded, multipart/form-data, or text/plain, e.g.

Будет отправлен как метод: OPTIONS, — Это уже на полпути.

ОК, хорошо, я понимаю, но что мне делать?

Теперь ясно, что у нас есть два варианта:

Первый вариант:

Оставляя структуру веб-сервера такой как:

www.example.com -> Угловое веб-приложение

api.example.com -> API — поддомен

ПОЧТА:
И добавьте параметр transformRequest в $ httpProvider следующим образом:

$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

(Запомните заранее, ну это позволяет нам отправить x-www-form-urlencoded.)

Осталось убедиться, что ваши данные в формате x-www-form-urlencoded выглядят так:

name=Andy&nickname=RainbowWarrior&....

ДЛЯ УДАЛЕНИЯ:

Это немного сложнее, так как вам нужно сделать некоторые настройки на стороне сервера.

Если вы используете Slimframework для PHP, как я, все, что вам нужно сделать, это:

$response = $app->response();
$response->header('Access-Control-Allow-Origin', '*');
$app->options('/path/to/resource',function(){}); // This one just so you can accept OPTIONS it does nothing.$app->delete('/path/to/resource',function()
{//your delete code is here
});

Теперь всякий раз, когда вы пытаетесь выполнить DELETE с угловой вы увидите на XHR вкладка в браузере вы используете, что есть OPTIONS запрос, который был сделан и сразу после DELETE,

Второй вариант:
Гораздо меньше головной боли.
Переместите ваш API в тот же домен, т.е.
www.example.com — Веб-приложение
www.example.com/api — API

И вы защищены от всего этого выше.
Это заняло у меня 7 часов исследований, надеюсь, это поможет вам, ребята, и сэкономит ваше время!

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]