ODATA javascript 客户端库(与简单的 Fetch 或 AJAX 相比,它们的价值是多少)?
ODATA javascript client libraries (what is their value over simple Fetch or AJAX)?
目前我们正在使用客户端 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 库 (Apache OLINGO, O.js, JayData (or other ones suggested at: https://www.odata.org/libraries/)
但我没有看到 objective 指南,帮助开发人员了解这些库提供的原因和内容。
即我认为他们读取了特定 ODATA 服务的元数据。很好,但这增加了什么力量?
也许我的心理障碍是我们只是:
- 仅搜索 JSON 数据
- 不做任何嵌套查询(只有简单的 $filter,$select)
- 只是做简单的 GET,POST,PATCH
- 或者 ODATA V4 之前缺少的功能可能需要这些库
任何人都可以向开发人员简要描述这些库的功能及其独特的价值主张(借用风险投资术语)吗?我敢打赌其他人会觉得这很有用。
简答
你是对的。如果您只做简单的操作,则不需要任何这些库,因为归根结底,它们只是遵循某些特定约定(即 OData 规范)的 REST 调用。
长答案
我们拥有所有这些客户端 API 的原因是 OData offers/defines 有更多的东西。
让我们试着用一个例子来理解它。我使用的示例是 OData 中的 Batch Requests。我最简单的术语 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_<Unique identifier>
开始批处理请求,并使用批处理边界分隔各个 HTTP 请求,完成后以 batch__<Unique identifier>--
结束
- 您将批标识符设置为 header 并正确发送额外的 headers(如 content-type、content-length),您可以在 .
现在回到你原来的问题,确保你可以在你的 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 字符串(如果过滤器、导航属性等)和调试代码,以防您错过括号或拼错 header 名称,这可用于构建 application/product 的核心逻辑并让标准化、重复的无聊(固执己见)为你工作。
目前我们正在使用客户端 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 库 (Apache OLINGO, O.js, JayData (or other ones suggested at: https://www.odata.org/libraries/)
但我没有看到 objective 指南,帮助开发人员了解这些库提供的原因和内容。
即我认为他们读取了特定 ODATA 服务的元数据。很好,但这增加了什么力量?
也许我的心理障碍是我们只是:
- 仅搜索 JSON 数据
- 不做任何嵌套查询(只有简单的 $filter,$select)
- 只是做简单的 GET,POST,PATCH
- 或者 ODATA V4 之前缺少的功能可能需要这些库
任何人都可以向开发人员简要描述这些库的功能及其独特的价值主张(借用风险投资术语)吗?我敢打赌其他人会觉得这很有用。
简答
你是对的。如果您只做简单的操作,则不需要任何这些库,因为归根结底,它们只是遵循某些特定约定(即 OData 规范)的 REST 调用。
长答案
我们拥有所有这些客户端 API 的原因是 OData offers/defines 有更多的东西。
让我们试着用一个例子来理解它。我使用的示例是 OData 中的 Batch Requests。我最简单的术语 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_<Unique identifier>
开始批处理请求,并使用批处理边界分隔各个 HTTP 请求,完成后以batch__<Unique identifier>--
结束
- 您将批标识符设置为 header 并正确发送额外的 headers(如 content-type、content-length),您可以在 .
现在回到你原来的问题,确保你可以在你的 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 字符串(如果过滤器、导航属性等)和调试代码,以防您错过括号或拼错 header 名称,这可用于构建 application/product 的核心逻辑并让标准化、重复的无聊(固执己见)为你工作。