使用 REST 代理访问 Ext.data.Model.save() 回调中的 HTTP 响应

Posted

技术标签:

【中文标题】使用 REST 代理访问 Ext.data.Model.save() 回调中的 HTTP 响应【英文标题】:Access to HTTP response in Ext.data.Model.save() callbacks using REST proxy 【发布时间】:2012-08-07 18:41:40 【问题描述】:

我成功实现了客户端编辑器和服务器端 API。

现在我在服务器端添加更多验证,除了返回正确的 HTTP 代码(200 表示 OK,4xx 用于其他用途,500 表示错误等)之外,我还想返回一个失败的验证列表Model.save() 生成的提交。

我是这样运行的:

myModel.save(
  success: function (a, operation, c) ...,
  failure: function (a, operation, c) ...
);

但是如果发生故障,操作对象只有响应状态和它的statusText,全部通过

operation.error.status // i.e. 409
operation.error.statusText // "Conflict"

但服务器端正在将失败验证的详细信息(主要是域级别的验证)添加到响应中。

有没有一种方法可以让我获得服务器发送的作为 HTTP 响应正文发送到 PUT/POST 提交的内容?

我必须使用特定的 JSON 结构返回它吗?

编辑: 我现在将其作为 HTTP 响应的主体返回(代码为 4xx):


 data: /* the record serialized */,
 success: false, // or true if everything went ok
 message: "This failed because X and Y."

提前致谢。

【问题讨论】:

虽然你的描述性很强,但我对这个问题不是很清楚。 1)目前尚不清楚“失败验证的服务器端详细信息(?)是否已添加到响应中”是否按预期工作? 2) 服务器响应是否在您的控制范围内? 3)你知道 json_encode 的可能性吗? 4)你看过/examples文件夹下的restful例子了吗? 1) 是的,失败的验证细节在响应中 2) 我有服务器在我的控制中 3) 一切都是 JSON 编码在一个带有属性数据、消息和成功的 JS 对象中(参见编辑question) 4) 我看了下,也是一样的。 好的,如果我理解正确,您只想检查从服务器返回的内容,对吗?如果是这种情况,您能否告诉我您如何发送请求(Direct / Ajax)以及您是否需要全局响应处理程序或每个请求唯一的响应处理程序。 我评估 mymodel.save() ,它在内部使用 XHR 将消息发送到服务器,如果代码为 2xx,则评估成功处理程序,否则评估失败处理程序。两者都显示在我上面的代码中。 【参考方案1】:

由于某种原因,Ext 没有将响应内容附加到错误对象,但如果出现故障,它会触发exception 事件。

所以我们所做的就是处理模型代理的"exception" 事件,然后我们将可以访问 XHR 响应,并能够用它做任何我们想做的事情。

myModel.getProxy().on('exception', this.onProxyException, this);

处理程序如下:

onProxyException : function (proxy, response, operation) 
    var errors;
    errors = Ext.JSON.decode(response.responseText).message;
    /* Whatever is needed with the errors */

在此示例中,我们假设错误以 JSON 格式出现,它们可以是简单的文本字符串,不需要使用 decode()

【讨论】:

Sencha Touch 与 save() 有同样的问题,建议的解决方案工作得很好。【参考方案2】:

根据此博客: http://code.tonytuan.org/2013/07/extjs-get-server-response-in-modelsave.html

你可以这样写代码:

model.save(
    success: function (record, operation) 
    // json response from server         
    console.log(operation.response);                  
    ,
    failure: function (record, operation) 
        // undefined
        console.log(operation.response); 
        // json response from server
        console.log(operation.request.scope.reader.jsonData);
    
);

【讨论】:

在我需要在无法移动的现有故障回调中的响应数据的情况下,为有用而投票。【参考方案3】:
    在阅读器块中添加:messageProperty: 'message' 从服务器返回:success:false, message: 'error test'

    来自failure 得到错误:

    failure: function (records, operation) 
        Ext.Msg.alert('error', operation.error);
    
    

【讨论】:

以上是关于使用 REST 代理访问 Ext.data.Model.save() 回调中的 HTTP 响应的主要内容,如果未能解决你的问题,请参考以下文章

用JS反向代理访问SSO下的REST服务

如何通过 JSONP 或 HTTP 代理访问 Rally REST API 的 JSON 响应?

NGINX 反向代理背后的 Spring Boot API REST

二十九、nginx反向代理自调用时小心Header里的host

使用反向代理解决 CORS 问题

使用 ExtJS 4.1 REST 代理创建“批处理”请求