Я пытаюсь отправить данные AJAX $ http.post на маршрут, настроенный в Laravel 5.2, все работает отлично, но сервер возвращает эту ошибку:
Устаревшее: автоматическое заполнение $ HTTP_RAW_POST_DATA устарело и будет удалено в будущей версии. Чтобы избежать этого предупреждения, установите "always_populate_raw_post_data" в "-1" в php.ini и вместо этого используйте поток ввода php://. в Unknown в строке 0
Предупреждение: невозможно изменить информацию заголовка - заголовки, уже отправленные в Unknown в строке 0
Это мой код. PHP:
public function save(Request $request){
$input = $request->all();
try {
$direccion = urlencode($input['Calle']." ".$input['Numero'].", ".$input['Ciudad']);
$geocode = "https://maps.googleapis.com/maps/api/geocode/json?address=$direccion&key=APIKEY";
$datosGoogle = json_decode($this->curl($geocode), true);
$latitud = $datosGoogle['results'][0]['geometry']['location']['lat'];
$longitud = $datosGoogle['results'][0]['geometry']['location']['lng'];
if(is_double($latitud) && is_double($latitud)){
$input['Latitud'] = $latitud;
$input['Longitud'] = $longitud;
$new = MyModel::create($input);
$data = ["status"=>"ok", "message"=>"Agregado correctamente"];
}else{
$data = ["status"=>"fail", "message"=>"Dirección desconocida, compruebe que los datos son correctos para que podamos agregarla al sistema."];
}
} catch (Exception $e) {
$data = ["status"=>"error", "message"=>$e->getMessage()];
}
return response()->JSON($data);
}
JS:
$scope.registrar = function(form, datos) {
$scope.submitted = true;
if(form.$valid) {
var toSendData = JSON.stringify({
Nombre: datos.nombre,
Calle: datos.calle,
Numero: datos.numero,
Piso: datos.piso,
Puerta: datos.puerta,
CP: datos.cp,
Ciudad: datos.ciudad,
Email: datos.email,
Necesidades: datos.necesidades,
Telefono: datos.telefono
});
console.log(toSendData);
$http.post($rootScope.recibirNuevoUrl, toSendData).then(function(response){
$scope.hideLoading();
if(response.data.status == "ok"){
$state.go('registro');
}else{
$scope.$parent.showAlert("Error al introducir los datos", response.data.message);
}
})
}else{
$scope.$parent.showAlert('Validacion de datos', 'El formulario contiene errores. Por favor revise los campos marcados para comprobar los errores.');
}
};
Как я могу это исправить?
У меня была такая же проблема с Laravel 5.2 и Angular, я получил ее, добавив в контроллер одну строку:
editorApp.controller('EditorCtrl', function ($scope, $sce, $http, $location, $interval, $document){
$http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";
...
Я нашел, что это работает для меня в этом сообщении: qaru.site/questions/21123/.... Ответ, помеченный как правильный, не работал для меня, строка выше - это другой ответ в том же сообщении. Правильный ответ (qaru.site/questions/21123/...) действительно говорит вам, зачем вам это нужно.
Короче говоря, эта проблема существует, потому что Angular (по умолчанию) отправляет данные с использованием сериализации JSON: Content-Type: application/json
и PHP не отделяют JSON от нуля. Изменяя тип контента на x-www-form-urlencoded
данные будут отправлены как:
foo=bar&bar=foo
вместо (JSON):
{ "foo": "bar", "bar": "foo" }
laravel 5.2
/resource/assets/js/bootstrap.js
window.axios = require('axios');
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = window.Laravel.csrfToken;
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
//add default Content-Type
window.axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
2 мачта данных - строка
const qs = require('qs')
axios.post('/api/code/create', qs.stringify(this.formItem),)
.then(function (response) {
console.log(response)
})
.catch(function (error) {
console.log(error)
})
Получил мою работу после отключения error_reporting в php.ini
У меня возникла аналогичная проблема с получением $ GLOBALS ['HTTP_RAW_POST_DATA'] в Laravel 5.2. Я решил проблему, используя Request::getContent()
в моем контроллере