【问题标题】:Amplify.js - CRUD-like urlsAmplify.js - 类似 CRUD 的网址
【发布时间】:2012-05-29 23:55:01
【问题描述】:

我正在使用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 以及`delete,like-so:

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

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

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

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

想法将不胜感激。

【问题讨论】:

    标签: javascript amplifyjs


    【解决方案1】:

    您可以定义自己的请求类型,或者您可以只监听request.ajax.preprocess 并在那里执行您的JSON.stringify - 这是在发生 URL 替换之后

    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)
    

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

    _settings = ajaxSettings.data;
    

    【讨论】:

      【解决方案2】:

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

      在本例中,我将 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
          });
      };
      

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

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

      【讨论】:

        猜你喜欢
        • 2020-12-07
        • 2010-12-12
        • 2013-03-25
        • 2015-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-29
        相关资源
        最近更新 更多