AngularJS не может отправить почтовый запрос с Content-Type:application/json

В настоящее время я использую angularJS и CoffeeScript, чтобы попытаться отправить почтовый запрос, и мой пример кода:

login: (user, callback)=>
baseUrl = 'http://localhost:3000/api/v1/sessions'
@$http({
  method: 'POST',
  url: baseUrl,
  data: user
}).success (result)->
  callback(result)

Но когда я его вызываю, он просто отправляет запрос «OPTIONS» вместо запроса POST.
И детали запроса: «введите Если я добавлю заголовок к этому методу,

login: (user, callback)=>
baseUrl = 'http://localhost:3000/api/v1/sessions'
@$http({
  method: 'POST',
  url: baseUrl,
  data: user,
  headers:
    'Content-Type': 'application/json'
}).success (result)->
  callback(result)

Это по-прежнему не работает, но если я изменю заголовки на 'Content-Type': 'application/x-www-form-urlencoded', тогда он сможет отправлять почтовые запросы.
Но запрос Content-type это не не хочу.

Я также пытаюсь изменить данные запроса на JSON с помощью: data: JSON.stringify(user), но все еще не работает.

ОБНОВЛЕНИЯ

Ребят, я сделал очередной спайк по этому вопросу. То есть я jquery для отправки запроса, и он отлично работает, но я нашел проводную вещь, которая заключается в том, что у них разные данные запроса.

JQuery

$.ajax({
  type: "POST",
  url: "http://localhost:3000/api/v1/sessions",
  data: {
    "user":{
      "email":"[email protected]",
      "password":"123456"
    }
  },
  success: function(){

  }

Скриншот для Jquery введите здесь описание изображения

Угловой

login: (user, callback)=>
baseUrl = 'http://localhost:3000/api/v1/sessions'
@$http({
  method: 'POST',
  url: baseUrl,
  data: {
    "user":{
      "email":"[email protected]",
      "password":"123456"
    }
  },
  headers:
    'Content-Type': 'application/x-www-form-urlencoded'
}).success (result)->
  callback(result)

Теперь он может отправить запрос, но я только что получил 401 при попытке сделать запрос.
Скриншот для Angular введите здесь описание изображения

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


person Junv    schedule 28.01.2014    source источник
comment
Также взгляните на: stackoverflow.com/a/18834609/2674883   -  person Nicolae Olariu    schedule 28.01.2014


Ответы (1)


Вы сталкиваетесь с ограничениями CORS и той же политикой происхождения.

Самое простое решение — развернуть веб-интерфейс и API вместе как одно приложение. Если порты разные даже на одной машине, то нужно иметь дело с одной и той же политикой происхождения.

Options — это предварительный запрос. Сделайте так, чтобы ваш бэкэнд принял это, и все должно быть в порядке.

Дополнительная информация: http://www.html5rocks.com/en/tutorials/cors/

person stride    schedule 28.01.2014
comment
Но почему я изменил заголовки на «Content-Type»: «application/x-www-form-urlencoded», тогда это работает. Кстати, я использую Rails на своей стороне сервера, и я уже решил эту проблему, установив заголовки CORS. - person Junv; 28.01.2014
comment
Потому что для этого типа контента нет необходимости в запросе OPTIONS. Я связал статью: Простые запросы - это запросы, которые соответствуют следующим критериям: HTTP-метод соответствует (с учетом регистра) одному из: HEAD GET POST HTTP-заголовки соответствуют (без учета регистра): Accept Accept-Language Content-Language Last-Event-ID Content -Type, но только если значение является одним из: application/x-www-form-urlencoded multipart/form-data text/plain - person stride; 28.01.2014
comment
Поэтому вам нужно включить OPTIONS на стороне рельсов. Вероятно, по методу действия. - person stride; 28.01.2014
comment
Я не отправил запрос OPTIONS, почему запрос POST стал запросом OPTIONS? Даже если я запрашиваю несуществующий URL-адрес, он все равно становится запросом OPTIONS. - person Junv; 29.01.2014
comment
Это браузер. Он видит, что ему нужно применить политику безопасности и сделать ее автоматической для вас. Так что вам просто нужно, чтобы ваша серверная часть реагировала правильно. - person stride; 29.01.2014
comment
Привет @stride, я уже внес изменения в свою сторону рельсов, но все еще не работает. В моем приложении Controller у меня есть: def allow_cors headers[Access-Control-Allow-Origin] = * headers[Access-Control-Allow-Methods] = %w{GET POST PUT DELETE HEAD}.join(,) headers[Access- Control-Allow-Headers] = %w{Accept Accept-Language Content-Language Last-Event-ID Content-Type}.join(,) head(:ok) if request.request_method == OPTIONS end. У меня также есть before_filter : allow_cors в моем классе целевого контроллера. - person Junv; 29.01.2014
comment
Я не могу помочь вам с рельсами. Я использую другой стек бэкэнда. - person stride; 29.01.2014