簡體   English   中英

AngularJS POST發出空請求?

[英]AngularJS POSTs empty requests?

我是AngularJS的新手,當我嘗試使用AngularJS發出POST請求並且沒有POST參數時,我遇到了一個問題。 我使用Sinatra作為RESTful接口。

這就是我的Sinatra后端的樣子:

post '/layer/:layer_id' do
  @layer = PageLayer.where(id: params[:layer_id]).first
  @layer.content = params[:content]
  @layer.save
end

如果嘗試使用Postman chrome擴展程序POST - 它可以工作! Sinatra會正確保存內容。 所以我確信后端可以正常工作。

這就是我的角度測試代碼的樣子:

TestCtrl = ($scope, $routeParams, $http, $resource) ->
    $scope.layer = []

    Layer = $resource('/layer/:id', {id:'@id'})

$scope.layer = Layer.get {id: $routeParams.layerId}, ->
    console.log "Got you!"

$scope.saveContent = ->
    $scope.layer.$save()
    console.log "Saved!"

angular.module('appDirectives', []).directive "test", ->
    return (scope, element, attrs) ->
        element.bind "blur", ->
            console.log("blur!")
            scope.saveContent()

和HTML代碼:

<div>Content: {{layer.content}}</div>

<div>
    <form>
        <input type="text" test ng-model="layer.content">
    </form>
</div>

所以,唯一的問題是:出了什么問題? 為什么我可以向Postman提出正確的請求而不是使用angularJS? Angular返回空的“內容”,因此Sinatra每次都將其保存為“”。

我還附加了一個圖層的結構:

g {id: 27245, page_id: 2302, external_id: 26518, original_upload: null…}
content: "dfgdfg"
external_id: 26518
id: 27245
layerNumber: 8
page_id: 2302

我怎樣才能記錄究竟有角度的POST?

嘿,這是我遇到的確切問題,現在答案顯而易見。 我知道Angular正在發送json,但不管我做了什么都沒有用。 這導致我朝着正確的方向發展,但至於解析json我必須寫

ng_params = JSON.parse(request.body.read)

我不得不將“字符串”更改為“閱讀”。 也許我有一個json gem或更高版本的東西。 我的完整保存過程如下:

post '/api/v1/test' do
  ng_params = JSON.parse(request.body.read)
  @foo = Foo.new(ng_params)
  if @foo.save
    puts "Page Saved"
    content_type :json
    rabl :foos, format: "json"
  end
end

我使用rabl格式化json來控制Sinatra發回的json數據(請不要發送電子郵件或密碼)

我的Angular代碼就是這樣(尚未實現put,patch或delete,還沒有自動更新數據。你仍然需要刷新頁面才能看到新帖子。)要清楚,我有一個名為'的表foos',其中ActiveRecord模型是'Foo',一列名為'anything'(除了timestamps和id,我確定它總是在那里)。

// app declaration
var app = angular.module("App", ['ngResource']);

// data service
app.factory('Foo', ['$resource', function($resource) {
  return $resource('/api/v1/test/:id', {id: '@id'});
}]);

// the controller
app.controller('Controller', function($scope, Foo) {

  $scope.foos = Foo.query();

  $scope.create = function(anything) {
    Foo.save({anything: anything}, function(foo){
      $scope.foos.push(foo);
    });
  };
});

然后在我的標記中,表單看起來像這樣,重要的是在'ng-submit'中使用'anything'作為參數調用'create'。 如果表中有多個列,則使用多個參數ex調用“create”。 '創造(任何事物,酒吧)'。

<h3>Add something new</h3>
<form ng-submit="create(anything)">
  <input ng-model="anything" type="text">
  <button type="submit">Do it</button>
</form>

顯示數據的同時

<li ng-repeat="foo in foos">
  <p>{{foo.anything}}</p>
</li>

鏈接解決了問題。 只需添加

寶石“機架解析器”

到您的Gemfile並將此代碼添加到config.ru。 會像魅力一樣工作。

require 'rack/parser'
use Rack::Parser, content_types: {
  'application/json' => Proc.new {|body| JSON.parse body }
}

好的,我已經解決了這個問題。 不知怎的,Sinatra沒有正確地從Angular獲得POST,並沒有自動將它們放入params。 因此,如果我們手動解析請求 - 它可以工作。 像那樣:

post '/layer/:layer_id' do
  @updated_layer = JSON.parse(request.body.string)
  @layer = PageLayer.where(id: params[:layer_id]).first
  @layer.content = @updated_layer['content']
  @layer.save 
end 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM