Laravel 5.2 API Rest и Angular JS - $ HTTP_RAW_POST_DATA устарела

0

Я пытаюсь отправить данные 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.');
      }
    };

Как я могу это исправить?

Теги:
rest
laravel-5.2

4 ответа

2
Лучший ответ

У меня была такая же проблема с 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" }
  • 0
    Твои правила!!! Я рассмотрел тысячи постов и веб-сайтов для этого решения. Не могли бы вы немного объяснить свое решение (подумать о новых людях, которые приезжают сюда с той же проблемой)? Миллион спасибо!
0

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)
    })
0

Получил мою работу после отключения error_reporting в php.ini

  1. Открыть php.ini
  2. Поиск error_reporting
  3. Измените его на => error_reporting = E_ALL & ~ E_DEPRECATED & ~ E_STRICT
  4. Выйти и запустить/перезапустить сервер Apache
  5. Перезапустить сервер laravel
  • 0
    Это не решение, вы скрываете только реальную проблему.
  • 0
    Вы правы, но когда рекомендованное решение не работает и у вас есть сроки, чтобы его выполнить, это может помочь вам заставить ваше приложение работать, пока вы продолжаете искать постоянное решение.
Показать ещё 1 комментарий
0

У меня возникла аналогичная проблема с получением $ GLOBALS ['HTTP_RAW_POST_DATA'] в Laravel 5.2. Я решил проблему, используя Request::getContent() в моем контроллере

Ещё вопросы

Сообщество Overcoder
Наверх
Меню