2014-10-10 3 views
0

Я могу успешно выполнить POST от AngularJS до моего маршрута Sinatra, чтобы получить статус «200».

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

{"input":"testing"} 

Но ответ пуст.

Вот как я POST-ки:

 $http({ 
     method: "POST", 
     url: "http://floating-beyond-3787.herokuapp.com/angular", 
     /*url: "https://worker-aws-us-east-1.iron.io/2/projects/542c8609827e3f0005000123/tasks/webhook?code_name=botweb&oauth=LOo5Nc0x0e2GJ838_nbKoheXqM0",*/ 
     data: {input: $scope.newChat} 
    }) 

    .success(function (data) 
    { 
    // $scope.chats.push(data); 
     $scope.chats.push($scope.newChat) 
    // if successful then get the value from the cache? 

    }) 
    .error(function (data) 
    { 
     $scope.errors.push(data); 
    }); 

    }; 

    $scope.newChat = null 

Chrome под Request Payload показывает, что он должным образом - как указано выше.

Когда я проверяю журналы в Heroku, где я запускаю приложение Sinatra, я не могу сказать, правильно ли я обрабатываю полезную нагрузку запроса. И я определенно не получаю что-нибудь в ответ:

post '/angular' do 
    puts "params: #{params}" 
    puts params[:input] 
    puts @json = JSON.parse(request.body.read) 

    return RestClient.post 'https://worker.io' {:send => params[:input]} 

end 

Я ожидаю:

  1. приложение Sinatra может получить полезную нагрузку: вход
  2. Он может успешно разместить на мой рабочий на железо .io
  3. Он может вернуть что-то обратно в ответ на Angular JS вместе с успехом.

Возможно ли это, и если да, то каким образом?

ответ

0

Возможно, вы столкнулись с тем случаем, когда request.body уже прочитали цепочку, прежде чем попасть в ваш маршрут.

Попробуйте следующее

request.body.rewind 
request_payload = JSON.parse request.body.read 

Это довольно распространенная проблема встречается в Синатра так, если это решает проблему вы можете поместить его в перед фильтром.

before do 
    request.body.rewind 
    @request_payload = JSON.parse request.body.read 
end 

Также не работает с полезной нагрузкой JSON.

params[:input] 

params[:field] стиль работы, если Content-Type является application/x-www-form-urlencoded разрешить доступ к данным формы в традиционном стиле веб-приложений. Он также работает, чтобы вытащить параметры с параметризованного маршрута; что-то вроде следующего.

post '/angular/:data' 
    puts params[:data] 

    # Do whatever processing you need in here 
    # assume you created a no_errors var to track problems with the 
    # post 

    if no_errors 
    body(json({key: val, key2: val2, keyetc: valetc})) 
    status 200 
    else 
    body(({oh_snap: "An error has occurred!"}).to_json) # json(hash) or hash.to_json should both work here. 
    status 400 # Replace with your appropriate 4XX error here... 
    end 
end 

Что-то я в последнее время, чтобы использовать этот последний стиль post 'myroute/:myparam, а затем Base64 кодирование полезной нагрузки JSON на стороне клиента и отправить его в URL: слот MyParam. Это немного взломать и не то, что я бы рекомендовал в качестве общей практики. У меня было клиентское приложение, которое не могло правильно кодировать заголовки данных JSON + в тело запроса; поэтому это было жизнеспособным решением.

+0

Спасибо, да, у меня были параметры [: input], чтобы я мог проверить, была ли проблема на конце клиента или нет. – Angela

+0

Моя альтернатива заключалась в том, чтобы публиковать сообщения непосредственно на worker.io, но работник отвечает на создание задачи - но тогда нет способа вернуть ответ после выполнения задания. – Angela

+0

Как только я получаю полезную нагрузку, есть ли способ для меня, чтобы вернуть рабочего обратно в AngularJS, который сделал сообщение? – Angela

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