我是Ember的新手,这是我关于stackoverflow的第一个问题。我在Ember项目的客户端上工作,我需要从Rest Api中提取JSON数据。以前我可以提取如下数据:
// app \ adapters \ product.js
export default DS.RESTAdapter.extend({
host:"http://10.1.7.13,
pathForType(){
return "content.php?method=list&pr1=product&pr2=all&uname=aaa&upass=1234"; }});
// app \ serializers \ product.js
export default DS.RESTSerializer.extend({
normalizeResponse (store, primaryModelClass, payload, id, requestType){
payload={
products:payload
};
return this._super(store,primaryModelClass, payload, id, requestType)
} });
然后更改了后端的url,现在username和userpassword不再是url的参数,而是作为表单数据发送。
在新表格中,列表产品的网址为“ http://10.1.7.13/content.php?method=list&pr1=product&pr2=all”
尽管如果我仅使用此URL页面进行访问,则会给出警告,因为用户名和userpassword未定义。所以我无法访问json数据。
但是如果我发送如下的ajax发布请求
$.ajax({
type:"POST",
url: "http://10.1.7.13/content.php?method=list&pr1=product&pr2=all",
data: {
"uname":"aaa",
"upass":1234
},
success: function(response){
console.log(response);
}
});
我已经看到了我的JSON数据,因为已经输入了用户名和密码作为表单数据。 我的问题是,在哪里可以将其称为ajax帖子,如何将响应加载到产品模型?理想情况下,我想调用适配器并将响应发送到序列化器,然后像以前一样将其添加到模型中。但是我研究了适配器方法,却没有找到对我有帮助的方法。我是新来休息api的人,所以您能告诉我该怎么办吗?
答案 0 :(得分:0)
您需要覆盖适配器的 findAll 方法,该方法用于获取多个记录。在这种情况下,您需要将HTTP方法从GET修改为POST以传递数据。
我假设您正在使用DS.RESTAdapter,因此代码为:
import DS from "ember-data";
export default DS.RESTAdapter.extend({
host: "http://10.1.7.13",
pathForType() {
return "content.php?method=list&pr1=product&pr2=all";
},
findAll(store, type, sinceToken, snapshotRecordArray) {
let query = this.buildQuery(snapshotRecordArray);
let url = this.buildURL(type.modelName, null, snapshotRecordArray, 'findAll');
return this.ajax(url, "POST", { data: {uname: "aaa", upass: "1234"} });
}
});
我认为密码是您帖子中的字符串。如果您的序列化程序可以在更改URL之前使用数据,则它应该仍然有效。
当试图确定需要定制哪些适配器时,我将methods的Ember Data源代码粘贴到定制适配器中,并逐步完成代码。学习内部原理的好方法。修改序列化器也一样
最后一点,在代码中硬编码用户名和密码是不安全的。我不知道这是否仅是示例,但想对其进行说明。