2014-01-30 1 views
3

Я пытаюсь опубликовать события в маленьком приложении CherryPy, которое отвечает на GET/POST, но при попытке с помощью AngularJS это просто не отправляет вещь.AngularJS http.post с cherrypy

Теперь я не знаю, связано ли это с AngularJS или с CherryPy (CP), кросс-домен включен в CP, но он просто не может получить метод POST. Однако это работает с CURL

POST в СР определяется как:

def POST(self, date, description): 
    # read items to catch any server side update 
    events = { 
     "date": int(date.encode('ascii','ignore')), 
     "description": description.encode('ascii','ignore'), 
     "status":"Active" 
    } 
    # storing changes 
    save_events(events) 
    return ('Event created\n') 

Заголовки включены по:

def enableCrossDomain(): 
cherrypy.response.headers["Access-Control-Allow-Origin"] = "*" 
cherrypy.response.headers["Access-Control-Allow-Methods"] = "GET, POST" 
cherrypy.response.headers["Access-Control-Allow-Headers"] = "Cache-Control, X-Proxy-Authorization, X-Requested-With" 

def OPTIONS(self): 
    enableCrossDomain() 
    return 

И CURL вызов выглядит следующим образом:

curl -d $EPOCH_DATE -d $EVENT -X POST 'myurl.com:1234/api/events/' 

Попробуйте это с помощью AngularJS:

var message = "'" + $scope.event_description + "' '" + $scope.datetime_start + "'"; 
      console.log(message); 
      $scope.post_url = "myurl.com:1234/api/events"; 
      $http.post($scope.post_url,message).success(); 

Уже пробовал отправить сообщение «сообщение» как JSON и указать его в заголовках, но просто не может заставить его работать. Любые идеи, что мне не хватает или что еще я должен здесь попробовать?

+0

Может быть угловой проходит в некоторых параметры, которые не находятся в подписи обработчика? – hayavuk

+0

Итак, вызов curl работает нормально, но вызов '$ http.post' не работает, верно? Если это так, я бы попытался захватить HTTP-трафик по сети и сравнить, если есть какие-либо существенные изменения. – hlovdal

ответ

1

Кажется, что ответ был довольно простым:

URL-адрес не был должным образом закодирован поэтому браузер собирается помешанным; изменено следующим образом:

$scope.post_url = "myurl.com:1234/api/events"; 

Для

$scope.post_url = "http://myurl.com:1234/api/events"; 

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

HTTPError: (404, 'Missing parameters: message') 

Для простоты изменял параметры всего лишь одно сообщение и разбить его внутри python, то весь мой запрос POST изменился на это:

$scope.post_url = "http://myurl.com:1234/api/events"; 
var message = 'message=' + $scope.datetime_start + ',' + $scope.event_description; 
$http({ 
    method: 'POST', 
    url: $scope.post_url, 
    data: message, 
    headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
}); 

И важно, как хорошо, на конце питона я не прилагая заголовки к сообщению POST, изменилось следующее:

def POST(self, date, description): 
# read items to catch any server side update 
events = { 
    "date": int(date.encode('ascii','ignore')), 
    "description": description.encode('ascii','ignore'), 
    "status":"Active" 
} 
# storing changes 
save_events(events) 
return ('Event created\n') 

Для этого:

def POST(self, message): 
    # read items to catch any server side update 
    events = { 
     "date": int(message.split(',')[0].encode('ascii','ignore')), 
     "description": message.split(',')[1].encode('ascii','ignore'), 
     "status":"Active" 
    } 
    # storing changes 
    save_events(events) 
    enableCrossDomain() # HEADERS HERE OR AJAX GETS ANGRY 
    return ('Event created\n') 
+0

Эй Рамон. Интересно, можете ли вы мне помочь. Я пишу приложение Angular, которое делает REST-звонки на сторонний продукт (на основе CherryPy). Я использую $ http, и все мои вызовы терпят неудачу, потому что заголовок Access-Control-Allow-Origin: не установлен. Из того, что я смог установить, вы можете установить заголовки ответов где-нибудь в CherryPy. Вы случайно не знаете, где? thanks Mark – mark1234

+0

@ mark1234 Мне кажется, что у вас были проблемы с CORS. Я бы посмотрел на определение глагола OPTIONS (если доступно), иногда браузеры останавливаются на этой точке; если это работает, и погрузитесь в конфигурацию вашего HTTP-сервера. –

 Смежные вопросы

  • Нет связанных вопросов^_^