$ http.post не работает в AngularJS

0

Я пытаюсь сделать запрос $ http.post, но у меня есть следующая ошибка:

XMLHttpRequest не может загрузить https://mipage.com/examplephp. Поле заголовка запроса Content-Type не разрешено заголовками Access-Control-Allow-Headers в предполетном ответе.

Если я изменю $ http.post на $ http.get, запросите ответ сервера с JSON, так что.. Я думаю, что это не проблема CORS. Также я поставил прокси в ионный проект.

Это моя функция:

function obtenerSesion() {
        debugger;
        return $http.post(iniciarSesionUrl,
                 {params: {username: 'prueba123',password: 'prueba123'}}).then(function(response) {
            canchas = response.data;        
            return canchas;
        })
        .catch(generarError);
    }

Также сервер возвращает JSON с параметрами или без них, потому что я думал, что, возможно, проблема была $ _POST ["username"]; $ _POST [ "пароль"];

Но нет. Я жестко закодировал данные на сервере, так что... проблема в Angular JS

Можете ли вы помочь мне решить мою проблему? Благодарю!

  • 0
    Это действительно проблема с конфигурацией CORS сервера. Чтобы разрешить заголовок Content-Type (который Angular устанавливает для application/json для запроса POST), он должен быть частью списка разрешенных заголовков.
Теги:
ionic-framework

2 ответа

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

XMLHttpRequest не может загрузить https://mipage.com/examplephp. Поле заголовка запроса Content-Type не разрешено заголовками Access-Control-Allow-Headers в предполетном ответе.

Если я изменю $ http.post на $ http.get, запросите ответ сервера с JSON, так что.. Я думаю, что это не проблема CORS. Также я поставил прокси в ионный проект.

Объяснение:

Когда вы делаете HTTP-запрос GET из объекта http: http.get(), передающего params, они добавляются в querystring, а поскольку запрос не имеет тела сообщения, угловой httpProvider удаляет заголовок Content-Type запроса.

Итак, ваши параметры $ http.get в querystring:

username=prueba123&password=prueba123

В противном случае для HTTP POST-запроса из объекта http http.post(), передающего объект params, они разбираются в json и вставляются в тело сообщения запроса, тогда httpProvider добавляет заголовок HTTP-запроса Content-Type: application/json.

Итак, ваши параметры $ http.post в теле сообщения запроса:

{"username":"prueba123","password":"prueba123"}

Это делается по умолчанию transformRequest функцией углового httpProvider

Как-то вы нарушаете политику CORS, тогда вам нужно настроить веб-сервер api или ваш api-сервер для обработки нарушения политики CORS, в частности, ваша ошибка возникает из-за отсутствия содержимого в Access-Control-Request -Отчетное поле ответа.

Возможное решение (в вашем конкретном случае)

Если вы запускаете приложение из локального с помощью ионного фреймворка, вам необходимо настроить файл ionic.config.json и добавить прокси-адрес того же адреса и порта, на котором размещено ваше приложение, поэтому вы не нарушаете политику CORS.

пример:

    {
  "name": "example project",
  "app_id": "11ffxxxx",
   //etc etc..
  "proxies": [
    {
      "path": "/api",
      "proxyUrl": "http://192.168.1.152:9083/api"
    }
  ]
}

наконец, в вашем угловом приложении вам необходимо правильно настроить API-конечную точку при запуске из локального:

function obtenerSesion() {
        debugger;
        return $http.post("/api",
                 {params: {username: 'prueba123',password: 'prueba123'}}).then(function(response) {
            canchas = response.data;        
            return canchas;
        })
        .catch(generarError);
    }

Я советую вам автоматизировать этот процесс, используя javascript task runner (gulp, grunt)

  • 0
    Спасибо за ответ. Я использую grunt serve --lab для запуска своего проекта. Что вы имеете в виду, когда говорите: я советую вам автоматизировать этот процесс с помощью javascript runner (gulp, grunt) , какой процесс вы используете? Спасибо!
  • 0
    при условии, что ваше программное обеспечение имеет несколько этапов выпуска: локальный, разработка, производство. Это также относится к бэкэнду, который может иметь разные адреса для каждого этапа. То, что я предлагал, если вам когда-либо понадобится управлять другой средой для конечных точек API в интерфейсе, это автоматизировать процесс, например, путем создания файла конфигурации json и внедрения модуля, который получает правильный адрес на основе рабочей области, если мой Ответ решил вашу проблему, и вам нужно было управлять приложением, вы можете открыть новый вопрос, и я объясню вам подробно.
0

Сервер, на который отправляется запрос POST, должен включать в свой ответ заголовки Access-Control-Allow-Headers. Завершение их в ваш клиент не влияет.

До сервера указывается, принимает ли он запросы на кросс-поиск, поэтому клиент не может решить для себя, если он разрешает CORS.

Здесь объясняется в этой теме

  • 0
    черт, извините, я печатаю слишком медленно, уже помечен как дубликат

Ещё вопросы

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