Amplify.js - 类似CRUD的网址

时间:2012-05-29 23:55:02

标签: javascript amplifyjs

我正在使用amplify.request,我希望在向服务器发送数据和从服务器发送数据时使用类似CRUD的URL。这是一个例子:

定义资源

resources = {
"document_create"           : ['/d/crud/',           "POST"],
"document_read"             : ['/d/crud/{id}',       "GET"],
"document_update"           : ['/d/crud/{id}',       "PUT"],
"document_delete"           : ['/d/crud/{id}',       "DELETE"]
};

$.each(resources, function (resource, settings) {
  definition = {
    url     : settings[0],
    type    : settings[1],
    dataType: "json",  // what comes back
    decoder : 'jsend',
    contentType: 'application/json' // what goes there
  };

  amplify.request.define(resource, "ajax", definition);
});

使用资源

function make_request(resource, params, success_cb, error_cb) {
 if (this.is_post(resource)) {
   // this.is_post is a test, defined elsewhere, to see if this is a POST request
   params = JSON.stringify(params);
 }

 amplify.request(
   resourceId: resource
   data: params
   success: success_cb
   error: error_cb
 );
}

这适用于createread以及`删除,同样如此:

make_request('document_delete', {id: 1}, cb)

但是,对于update,由于内容是作为JSON传递的,因此URL替换不会按预期发生。

有没有办法在上述方案中利用{id}的URL替换?

我能想到的唯一选择是将数据传递给URL编码的服务器。不幸的是,这有些问题,如果可能的话,我希望能够保留使用类似CRUD的URL并使用JSON格式的数据保存。

我们将不胜感激。

2 个答案:

答案 0 :(得分:9)

您可以定义自己的请求类型,或者您可以只听取request.ajax.preprocess并在那里JSON.stringify - 在发生网址替换之后

is_post可能与您现在拥有的代码相同,只是放在不同的地方。这不是一个神奇的功能:)

 amplify.subscribe( "request.ajax.preprocess", function( defnSettings, settings, ajaxSettings ) {
    if ( is_post( defnSettings.resourceId ) ) {
         // This will still include the variable that matches the URL substitution:
         var _settings = $.extend( true, {}, defnSettings.data, settings.data, ajaxSettings.data );
         ajaxSettings.data = JSON.stringify( _settings );
    }
 });

您的make_request将不再stringify

function make_request(resource, params, success_cb, error_cb) {
 amplify.request(
   resourceId: resource
   data: params
   success: success_cb
   error: error_cb
 );
}

然后您的请求可以正常运行:

make_request('document_update', {id: 1, title: "New Title" }, cb)

重要:我编写预处理调用的方式,即使它与URL匹配也不会删除id(Amplify通常会删除匹配的密钥)。如果您希望它从字符串化的JSON中删除id,请将_settings赋值替换为:

_settings = ajaxSettings.data;

答案 1 :(得分:8)

从Amplify 1.1.0开始,在定义资源时会有一个dataMap选项。如果传递函数而不是散列对象,则放大将使用传递给请求的原始数据调用此函数。

在这个例子中,我将JSON.stringify传递给dataMap选项。

amplify.request.define("paqueteput", "ajax", {
    url: "/api/paquetes/{id}",
    dataType: "json",
    type: "PUT",
    contentType: "application/json; charset=utf-8",
    dataMap: JSON.stringify
});


// later we pass a raw object that gets stringified to JSON
var savePaquete = function(paquete, cb) {
    amplify.request({
         resourceId: "paqueteput",
         data: paquete,
         success: cb.sucess,
         error: cb.error
    });
};

我唯一不喜欢的是放大从数据对象中删除URL中映射的键。在这种情况下,id属性将从最终的JSON中删除,尽管它存在于url。

放大应该有一个选项来控制这种行为!