Javascript 使用Ember.js在Post请求的服务器响应中接收JSON API

Javascript 使用Ember.js在Post请求的服务器响应中接收JSON API,javascript,ajax,ember.js,ember-data,Javascript,Ajax,Ember.js,Ember Data,我有一个API,通过在post请求体中发送JSON对象与之进行接口。作为回报,在成功授权后,服务器将在其post响应的主体中使用JSON API提要进行响应 { "auth": { "type" : "basic", "password": "xxx", "username": "someone" }, "requestId" : 15, "method": { "name": "getUserAva

我有一个API,通过在post请求体中发送JSON对象与之进行接口。作为回报,在成功授权后,服务器将在其post响应的主体中使用JSON API提要进行响应

{
    "auth": {
        "type" : "basic",
        "password": "xxx",
        "username": "someone"
    },
    "requestId" : 15,
    "method": {
        "name": "getUserAvailabilityAndInfo",
        "params": {
            "userId" : "000",
            "peopleOnly" : "1"
        }
    }
}
如何使用Ember.js接收发送JSON请求后从服务器返回的负载?我看到了余烬数据,余烬模型允许使用标题,但它看起来没有发送帖子正文的能力

下面是一个JSON示例,我需要发送服务器以在post响应中接收JSON API

{
    "auth": {
        "type" : "basic",
        "password": "xxx",
        "username": "someone"
    },
    "requestId" : 15,
    "method": {
        "name": "getUserAvailabilityAndInfo",
        "params": {
            "userId" : "000",
            "peopleOnly" : "1"
        }
    }
}

我不能权威性地谈论ember数据(尽管我知道它肯定支持HTTP POST动词),除了引用以下文档:

在没有任何配置的情况下,只要遵循某些约定,Ember数据就可以通过RESTful JSON API加载和保存记录及其关系

如果您需要将您的Ember.js应用程序与不遵循严格约定的现有JSON API集成,那么Ember数据设计为可以轻松配置,以处理服务器返回的任何数据

上面Ember数据提到的“某些约定”是一个移动的目标,但是Ember团队已经接近于最终编纂(见jsonapi.org)

也从该文件:

对于简单的应用程序,可以使用jQuery从服务器加载JSON数据,然后将这些JSON对象用作模型

我将演示如何做到这一点

最简单的入门方法是在Ember代码库中的任意位置使用Ember的includedjQuery.ajax()方法:

App.examplePost = function () {
    return Em.$.ajax('http://example.com/api/serviceXYZ', {
        "type": 'POST', // HTTP method
        "dataType": 'JSON', // type of data expected from the API response
        "data": { // Begin data payload
            "auth": {
                "type" : "basic",
                "password": "xxx",
                "username": "someone"
            },
            "requestId" : 15,
            "method": {
                "name": "getUserAvailabilityAndInfo",
                "params": {
                    "userId" : "000",
                    "peopleOnly" : "1"
                }
            }
        }, // End data payload
        "success": function (data, textStatus, jqXHR) {
            return data;
        },
        "error": function (jqXHR, textStatus, errorThrown) {
            window.console.log(jqXHR);
        }
    });
};
(有关上述内容的更多详细信息,请参阅标准jquery ajax()文档。)

如何在您的ember应用程序中实际使用上述内容的一些示例:

“模型钩” 在适当的路由定义中,我们将覆盖默认的model()方法:

App.ExamplePostRoute = Ember.Route.extend({
    model: function (params) {
        return App.examplePost();
    }
});
要查看运行中的模型挂钩,您需要导航到通过其关联URL(例如http:/myemberapp.example.com/#/examplePost)映射到“examplePost”路由状态的路由路径。由于App.examplePost()执行的ajax调用最终会返回一个已实现承诺的API数据(请参阅success()函数),因此模型钩子知道如何使用该响应作为其模型对象(并且它知道如何使用承诺异步执行此操作)

“静态对象”控制器 一个更人为的例子是覆盖默认的setupController()方法,也在路由定义中

App.ExamplePostRoute = Ember.Route.extend({
    setupController: function (controller, model) {
        return App.examplePost().then(
            function (data) {
                controller.set(model, data);
            }
        );
    }
});
setupController路由方法(无论您是否通过URL或其他转换方法转换到路由状态,总是被调用)不知道承诺,因此上面的用法是.then()

同样,您通常不会在每次进入路由状态时静态加载文本模型,但这是一种开始的方式,使用Chrome Ember Inspector将帮助您证明这实际上是可行的!此外,jquery和Promission是一个复杂的主题,在实践中,如果您滚动自己的客户端API代码,您可能希望通过Ember.Deferred.promise()将jquery的promise对象转换为标准的promise对象(参见promises.org)。这超出了本问题的范围,但供您近期探索参考。

可以使用该服务和/或ES2015

这是处理API请求和响应以及响应负载/数据的一种较新的传统方法(Ember 2.x),不依赖于Ember数据,因为
Ember ajax ver 2
可以直接使用,它旨在取代
Ember.$.ajax
API

使用通过公开的
ajax
服务,可以发送请求并处理响应:

import Ember from 'ember';

export default Ember.Controller.extend({
  ajax: Ember.inject.service(),
  actions: {
    someAction(someObject) {
      let payload = { foo: Ember.get(someObject, 'someProperty') };
      this.get('ajax').post('/url', {
        data: payload
      }).then(({ response }) => {
        ...
        // handle response;
      });
    }
  }
});