Javascript 使用Ember.js在Post请求的服务器响应中接收JSON API
我有一个API,通过在post请求体中发送JSON对象与之进行接口。作为回报,在成功授权后,服务器将在其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
{
"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;
});
}
}
});