ODataJavaScript客户端库(它们相对于简单获取或AJAX有什么价值)?

ODataJavaScript客户端库(它们相对于简单获取或AJAX有什么价值)?,odata,jaydata,olingo,Odata,Jaydata,Olingo,目前,我们正在使用客户端javascript获取连接到我们的ODATA V4 ERP服务器: const BaseURL = 'https://pwsepicorapp.com/ERP10.2/api/v1/Erp.BO.JobEntrySvc/' const fetchJobNum = (async () => { let url = BaseURL + 'GetNextJobNum' const reply = await fetch(url,{ me

目前,我们正在使用客户端javascript获取连接到我们的ODATA V4 ERP服务器:

const BaseURL = 'https://pwsepicorapp.com/ERP10.2/api/v1/Erp.BO.JobEntrySvc/'

const fetchJobNum = (async () => {
    let url = BaseURL + 'GetNextJobNum'
    const reply = await fetch(url,{
        method: 'POST',
        mode: 'cors',
        headers: {
            'Accept': 'application/json',
            'Authorization': 'Basic xxxx',
            'x-api-key' : '0HXJZgldKZjKIXNgIycD4c4DPqSrzn2UFCPHbiR1aY7IW',
            'Access-Control-Allow-Origin': '*',
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({})
    })
    let rsp = await reply.json()
    let job = rsp.parameters.opNextJobNum
    return job
})
这对我们来说很好。我们最近开始研究javascript ODATA库(,(或其他建议的库:)

但我没有看到一个客观的指南,让开发人员理解这些库为什么提供这些库以及它们提供了什么

也就是说,我认为他们读取了特定ODATA服务的元数据。很好,但是power会增加什么呢

也许我的心理障碍是我们只是:

  • 仅搜索JSON数据
  • 不执行任何嵌套查询(仅简单的$filter、$select)
  • 只是简单的获取、发布、修补
  • 或者这些库是ODataV4之前缺失的功能所必需的

  • 有人能向开发者简要介绍这些库的功能及其独特的价值主张(借用风险投资术语)吗?我打赌其他人会觉得这很有用。

    简短回答

    你说得对。如果你所做的只是简单的操作,那么你不需要这些库中的任何一个,因为在一天结束时,它们只是遵循一些特定约定(即OData规范)的REST调用

    长答案

    我们拥有所有这些客户端API的原因是OData提供/定义了更多的东西

    让我们试着用一个例子来说明它。我使用的例子是OData。我用最简单的术语Olingo定义了一种将多个HTTP请求合并到一个中的方法。它有一个定义良好的语法。看起来像这样

    POST /service/$batch HTTP/1.1 
    Host: host 
    OData-Version: 4.0
    Content-Type: multipart/mixed; boundary=batch_36522ad7-fc75-4b56-8c71-56071383e77b
    Content-Length: ###
    
    --batch_36522ad7-fc75-4b56-8c71-56071383e77b
    Content-Type: application/http 
    
    GET /service/Customers('ALFKI') 
    Host: host
    
    --batch_36522ad7-fc75-4b56-8c71-56071383e77b 
    Content-Type: application/http 
    
    GET /service/Products HTTP/1.1 
    Host: host 
    
    --batch_36522ad7-fc75-4b56-8c71-56071383e77b--
    
    现在这里有很多东西

    • 您必须使用
      batch\uuu
      启动批处理请求,并使用批处理边界分隔各个HTTP请求,完成后,您将使用
      batch\uuuu--
    • 将中的批处理标识符设置为标题,并正确发送可以在中看到的其他标题(如内容类型、内容长度)
    现在回到您最初的问题,确保您可以在JavaScript代码中使用大量字符串连接,生成正确的负载,进行ajax调用,然后解析回类似的响应,但是作为一名应用程序开发人员,您所关心的只是批处理GET、POST、PUT和DELETE请求以及您需要执行的操作埃塞尔

    现在,如果您使用一个客户机库(示例是通用的,每个库可能不同),代码应该如下所示

    OData.request( {
        requestUri: "http://ODataServer/Myservice.svc/$batch",
        method: "POST",
        data: { __batchRequests: [
           { requestUri: "Customers('ALFKI')", method: "GET" },
           { requestUri: "Products", method: "GET" }
        ]}
    },
    function (data, response) {
        //success handler
    }, undefined, OData.batchHandler);
    

    因此,在一个纯粹的业务命题上,根据应用程序大小,这样的术语库可以为您节省相当多的工时,这些工时将用于生成正确的有效负载字符串或正确的URL字符串(在过滤器、导航属性等的情况下)如果你遗漏了一个括号或拼错了标题名,你可以用它来构建应用程序/产品的核心逻辑,让标准化、重复和枯燥(固执己见的想法)为你工作。

    简短回答

    你说得对。如果你所做的只是简单的操作,那么你不需要这些库中的任何一个,因为在一天结束时,它们只是遵循一些特定约定(即OData规范)的REST调用

    长答案

    我们拥有所有这些客户端API的原因是OData提供/定义了更多的东西

    让我们试着用一个例子来说明它。我使用的例子是OData。我用最简单的术语Olingo定义了一种将多个HTTP请求合并到一个中的方法。它有一个定义良好的语法。看起来像这样

    POST /service/$batch HTTP/1.1 
    Host: host 
    OData-Version: 4.0
    Content-Type: multipart/mixed; boundary=batch_36522ad7-fc75-4b56-8c71-56071383e77b
    Content-Length: ###
    
    --batch_36522ad7-fc75-4b56-8c71-56071383e77b
    Content-Type: application/http 
    
    GET /service/Customers('ALFKI') 
    Host: host
    
    --batch_36522ad7-fc75-4b56-8c71-56071383e77b 
    Content-Type: application/http 
    
    GET /service/Products HTTP/1.1 
    Host: host 
    
    --batch_36522ad7-fc75-4b56-8c71-56071383e77b--
    
    现在这里有很多东西

    • 您必须使用
      batch\uuu
      启动批处理请求,并使用批处理边界分隔各个HTTP请求,完成后,您将使用
      batch\uuuu--
    • 将中的批处理标识符设置为标题,并正确发送可以在中看到的其他标题(如内容类型、内容长度)
    现在回到您最初的问题,确保您可以在JavaScript代码中使用大量字符串连接,生成正确的负载,进行ajax调用,然后解析回类似的响应,但是作为一名应用程序开发人员,您所关心的只是批处理GET、POST、PUT和DELETE请求以及您需要执行的操作埃塞尔

    现在,如果您使用一个客户机库(示例是通用的,每个库可能不同),代码应该如下所示

    OData.request( {
        requestUri: "http://ODataServer/Myservice.svc/$batch",
        method: "POST",
        data: { __batchRequests: [
           { requestUri: "Customers('ALFKI')", method: "GET" },
           { requestUri: "Products", method: "GET" }
        ]}
    },
    function (data, response) {
        //success handler
    }, undefined, OData.batchHandler);
    

    因此,在一个纯粹的业务命题上,根据应用程序大小,这样的术语库可以为您节省相当多的工时,这些工时将用于生成正确的有效负载字符串或正确的URL字符串(在过滤器、导航属性等的情况下)如果你遗漏了一个括号或拼错了一个标题名,你可以用它来构建应用程序/产品的核心逻辑,让代码变得标准化、重复和枯燥(固执己见的想法)为你工作。

    考虑周全的回答很好。我现在使用o.js,但我仍然看不到批量(这是我的拦截器)有多大价值。我看不到如何将相互依赖的get/patch/post/get/post操作作为单个事务进行链(管道)。至于粘贴一堆帖子作为原子更新批处理块。我不认为V4有事务锁(或者有事务锁)?您可能需要的是更改集。如果正确实现了OData支持的事务,则变更集中的操作是事务。就相互依赖性而言,您可以在变更集中使用像
    $1
    这样的占位符来引用其他依赖性。您可以在这里找到经过深思熟虑的响应文档。我现在正在使用o.js,但我仍然看不到批处理有多大价值(这是我的拦截器)。我不知道如何做一系列相互依赖的get/pat