Поэтому я писал приложение, когда столкнулся с этой проблемой.
Это 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»
Я надеюсь, что это послужит людям в будущем.
Возвращаясь к основам, проблемы с отправкой запросов $ 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 часов исследований, надеюсь, это поможет вам, ребята, и сэкономит ваше время!
Других решений пока нет …