技术文章
web服务调用的最佳实践
嗨,我是SAP的Alexis Gaillot,我在SAP智能RPA产品的采用团队工作。
在这篇博文中,我将向你展示如何使用ajax处理web服务。调用函数of SAP Intelligent RPA 1.0 and how to investigate if your call does not work as expected.
这篇博文将被分成不同的部分
- 上下文
- 原因
- 原因及解决方法
- 客户端证书
- 服务器证书
- 饼干
- 令牌
- 最佳实践示例
- 邮递员
- 旋度
- 终端的命令
- Ajax调用
- 结论
上下文
当你使用ajax时。调用函数to communicate with a web service, you receive a status from the server such as:
- 200.
- 300.
- 等等。
有时,调用似乎不起作用,您会收到一条通用的错误消息。这可以是:
- 只是状态。
- 一般的信息。
很难知道这个问题来自哪里。
原因
Web服务可以组合许多不同的设置:
- 服务器端/客户端证书。
- SSL证书,用于加密信息,提供身份验证等。如果您想在服务器上进行身份验证,它们是必需的。
- 令牌。
原因及解决方法
在本部分中,您可以找到问题的主要原因以及如何解决问题。
在以下主题中,您将了解更多:
- 客户端证书
- 服务器证书
- 饼干
- 令牌
客户端证书
使用客户端证书在服务器上进行身份验证。有时无法使用证书连接到服务器。
你可以使用这个选项ignoreClientCertificate避免使用证书认证。
ctx.ajax.call({ url: url, method: 'GET', contentType: "application/json", headers: headers, ignoreClientCertificate: true, success: function(res, status, xhr) { rootData.xCSRF = xhr.headers["x-csrf-token"]; var value = xhr.headers["Set-Cookie"]; rootData.Cookies = value.split('; ')[0] + "; "; sc.endStep(); }, error: function(xhr, status, statusText) { ctx.log('error get') sc.endStep(); } });
服务器证书
API可能需要这样的证书。它们通常是强制性的。
ctx.ajax.call在没有这些证书的情况下无法强制调用。
此外,由于不在浏览器环境中,因此无法指定要使用哪些证书。
在这种情况下,您将需要使用cURL,有关更多信息,请参阅章节最佳实践示例在下面。
饼干
cookie允许您验证客户端请求并保存所有会话信息。
如果您需要在通话中使用cookie,则必须设置cookie以保存此信息。然后,您将能够在另一个呼叫中使用它。
ctx.ajax.call({ //First call, get the cookies information url: "[url]", method: e.ajax.method.get, contentType: e.ajax.content.json, usePassport: true, ignoreClientCertificate:true, headers : { 'Authorization': 'Basic [base 64 login:password]', 'X-CSRF-Token': 'Fetch' }, success: function(res, status, xhr) { try { var csrf = xhr.headers['x-csrf-token']; var cookie = xhr.headers['Set-Cookie']; var myUrl = "https://domainName/sap/opu/odata/sap/xxx"; ctx.ajax.call({ //Second call, use the cookies in the headers object url: myUrl, method: e.ajax.method.post, ignoreClientCertificate:true, contentType: 'application/json;charset=utf-8', headers : { 'Content-type': 'application/json;charset=utf-8', 'X-CSRF-TOKEN': csrf, 'Cookie': cookie }, success: function(res, status, xhr) { ctx.log("Good call"); }, error: function(xhr,res,status) { ctx.log("Something went wrong with the call"); } }); } catch (ex) { ctx.log("Something went wrong : " + ex.description); } }, });
令牌
令牌是服务器创建的一段数据,其中包含标识用户和令牌有效性的信息。如果在Ajax调用中不正确地使用令牌,可能会导致问题。与cookie一样,令牌需要两次调用。
例如,在工厂中进行API调用。使用第一个调用来获取令牌。第二个调用触发API调用,它在作业队列中创建一个作业。在本例中,调用是链接的。如果第一次调用成功,就会发生第二次调用。
ctx.ajax.call({ //First call, get the token url: serviceAccount.urls.accessTokenURL, //Url got from the service key “url parameter + /oauth/token?grant_type=client_credentials” method: e.ajax.method.get, contentType: e.ajax.content.json, header:{ Accept: e.ajax.content.json, Authorization: 'Basic ' + ctx.base64.encode(serviceAccount.credentials.clientID + ':' + serviceAccount.credentials.clientSecret, false) // clientID and clientSecret got from the service key }, success: function(res, status, xhr) { ctx.log('Token generated'); sc.localData.Token = 'Bearer ' + ctx.get(res, 'access_token'); ctx.ajax.call({ // Second call url: serviceAccount.urls.apiTriggerURL, //Url from the API trigger (end with “/run”) method: e.ajax.method.post, contentType: e.ajax.content.json, header:{ Accept: e.ajax.content.json, 'irpa-api-key': serviceAccount.urls.irpaTriggerToken, //Token get from the API trigger Authorization: sc.localData.Token }, data:{ //Payload of your API Trigger }, success: function(res, status, xhr) { ctx.log('success'); sc.endStep(); return; }, error: function(xhr, status, statusText) { //web service failed sc.setError(e.error.Fail, 'Web service failed: [' + status + ']' + statusText + ' - ' + xhr.responseText); sc.endScenario(); return; } }); }, error: function(xhr, status, statusText) { //web service failed sc.setError(e.error.Fail, 'Web service failed: [' + status + ']' + statusText + ' - ' + xhr.responseText); sc.endScenario(); return; } });
最佳实践示例
下面是一些Web服务调用的最佳实践示例。
如前所述,由于Ajax调用的复杂性,您可能会面临不同的问题。
要用Ajax调用评估这些问题,您可以使用多个工具:
- 邮递员
- 旋度
- 终端的命令
- Ajax调用
让我们先看看它们到底是什么,我们可以用它们做什么。
邮递员
Postman是一个允许您查询和测试Web服务和API调用的工具。
该工具具有多种功能,易于使用。
旋度
cURL是一个命令行工具,您可以使用它来获取或发送数据,包括使用URL语法的文件。
在Windows 10 build 17063上,默认情况下包含cURL。
终端的命令
在命令提示符中,您可以在评估期间测试cURL命令。
如果测试成功,代理通过终端调用cURL命令。
Ajax调用
如何配置您的Ajax调用函数
如果您不知道如何配置Ajax调用函数,请遵循以下流程:
- 使请求在Postman上工作
注意:如果它甚至不能与Postman一起工作,这意味着您不能让它与Ajax调用函数一起工作。
a.启动后,单击代码按钮。
b.选择您使用的编程语言(应该是“JavaScript - jQuery”)
注意: 你可以在左边的红框中看到不同的语言。在这里,我们选择JavaScript-jQuery语言,因为Ajax调用函数是用jQuery.ajax()方法开发的。在绿色方框中,您注意到由Postman生成的代码。
2.在Ajax调用函数中使用此代码
复制并粘贴此代码到桌面工作室并在必要时调整代码。有关详细信息,请参阅官方文档调用函数
函数getCall(成功,错误,localData){var结果;var url = localData。fetchAPI = "";//API调用来获取csrf令牌和cookies。调用({方法:e.a axx .method。get, url: url, contentType: e.a axx .content。{'授权':localData. json。auth, 'x-csrf-token': 'fetch', 'Cookie': 'fetch', 'Accept': 'application/json'}, ignoreClientCertificate: localData。clientCert, success: function(res, status, xhr) {if(res.d){result = xhr;成功(结果);}其他{结果= res;错误(结果);}},错误:函数(xhr,错误,statusText){结果= res; error(result); } });
如何处理Ajax调用问题
如果在上一个流程中执行测试后,在调用期间仍遇到问题(来自xhr对象的问题),请尝试以下测试:
- 试一试ctx.ajax.call有选项ignoreClientCertificate是真实的
注意: 如果它仍然不工作,检查错误代码,这可以引导您找到错误的根源。
默认情况下,SSL证书验证在邮差中未启用。这意味着即使证书不可用,它也会强制调用。
如果启用此选项后对Postman的调用不工作,这意味着该证书是进行调用的强制证书。如前所述,Ajax调用没有这个选项。
一种解决方案是使用cURL。
3.试试Postman给出的cURL代码
- 遵循如何配置我的Ajax调用函数以上过程,从步骤1.。步骤1.b。,以检索正确的cURL代码。
- 在这段代码中,删除所有字符\将所有单引号替换为双引号。
- 在命令提示符中运行cURL代码。
例子:
curl——location——请求GET“http://XXXX”
如果cURL代码中出现错误消息,请在Internet上进行搜索。错误消息通常是非常明确的。如果代码成功,则可以将其集成到SAP智能RPA调用。
- 方法中实现此代码桌面工作室
var cmdCurl = 'curl -k——location——request GET "http://XXXX" ctx. var cmdCurl = 'curl -k——location——request GET "http://XXXX" ctx. varexec(cmdCurl, 60, function(reqdata) {var reqdata = ctx.json.parse(reqres.output);});
注:选项- k用于忽略客户端证书。
结论
您现在知道了如何使用web服务调用,以及如何在遇到问题时进行调查。
有了SAP Intelligent RPA 2.0,这将变得更容易。待优化。
要了解更多,您将在此之后的官方文件中找到进一步的信息链接
太好了!谢谢分享!