百度云_百度云网盘注册_免费1年

产品 虚拟云 浏览

小编:本博客是关于SAP Mobile Platform 3.0(SMP)中的Integration Gateway(集成网关)。 在之前的教程中,我们学习了如何将REST服务作为SMP中OData服务的数据源来处理。 这些教程是基于读取数据的,

本博客是关于SAP Mobile Platform 3.0(SMP)中的Integration Gateway(集成网关)。

在之前的教程中,我们学习了如何将REST服务作为SMP中OData服务的数据源来处理。

这些教程是基于读取数据的,通过查询和读取操作来完成。

自从SMP SP07以来,也支持修改操作。

在本博客中,我们将查看创建操作:

我们将在脚本中执行实现,为了创建数据,我们将从基于浏览器的REST客户端工具执行POST请求。

如果您对该主题不熟悉,请查看下面的链接部分,在这里您可以找到帮助您提高速度的教程。

更新:示例REST服务现在可用了,所以我更新了教程以使用它是的。还有,代码附在这个博客上。

我希望你已经看过我以前的教程了,解释REST数据源–查询和读取操作–基于XML负载。

请查看相关博客的链接部分。

前提条件是:

REST服务

对于本教程,我们需要一个支持编写场景的REST服务。

我使用的是一个公共可用的服务,您只需注册,之后,您可以使用您的SCN用户和密码访问它。

有关详细信息,请参阅以下文档:

SAP Netweaver网关服务消费系统入门

最后,您可以通过以下网址访问:

https://sapes1.sapdevcenter.com/sap/opu/rest/address/companies公司

目的地

在您的SMP中,您需要为以下URL创建一个HTTP目的地:

https://sapes1.sapdevcenter.com

注意:

另外,由于URL是HTTPS,云与大数据,您需要下载证书

并将其导入您的SMP密钥库。

注意:

对于此目的地,没费云服务器,无法进行"测试连接",因为服务器没有为配置的URL发送有效响应

作为解决方法,您可以按以下步骤进行:

创建第二个目的地,仅用于测试是否可以到达目标主机。

第二个目的地指向实际可以发送有效响应的URL。

例如,云服务器搭建,输入以下URL作为目的地URL:

https://sapes1.sapdevcenter.com/sap/opu/rest/address/companies公司

因此,您使用第二个目的地来执行"测试连接"。

如果成功,那么第一个目的地也可以。

第一个目的地将用于配置我们在本教程中创建的OData服务。

如果在连接测试中收到错误消息,您可以考虑以下事项:

注意:

您可能需要要在SMP中输入代理设置:

https://localhost:8083/Admin/->Settings->System

请注意,更改代理设置后,可能需要重新启动SMP服务器。

定义OData模型

我使用的示例REST服务提供以下示例数据:

因此对于我的OData模型,我创建了以下实体类型:

绑定数据源

为了更好的测试,我创建了用于查询和读取操作的绑定和脚本(请参阅我以前的教程进行描述)。

必须使用以下相关URI:

查询公司:/sap/opu/rest/address/Companys

读取公司:/sap/opu/rest/address/companies/{ID}

然后我部署到SMP,创建并分配目的地并运行服务。

很好。

现在让我们为创建操作进行绑定。

我们应该如何构建这个相对URL?

和前面的教程一样,我们想知道请求URL应该是什么样子。

答案是:这取决于后端REST服务。

在实现OData服务之前,我已经检查了直接触发到后端REST服务的POST请求应该是什么样子。

对于我的示例REST服务,它看起来如下:

注意:请求主体

对于我的示例后端REST服务,我不必关心唯一ID,因为它是在后端计算的

我们从这个练习中学到:

1)我们必须在向导中输入的相对URL与我们为查询操作输入的相对URL相同。

注意:这可能是与其他REST服务不同,

2)请求体必须看起来像

所以现在我们可以在Eclipse中继续,我们做"选择数据源"->REST->创建->请求URL:

然后我们生成Groovy的自定义代码,

对于创建操作,我们必须实现这两种方法,

processRequestData()

processResponseData()

为什么?

在processRequestData()方法中,我们必须调整POST请求,在发送到后端REST服务之前

在processResponseData()方法中,我们必须调整响应,因为OData规范要求POST操作应该返回响应负载中新创建的条目。

在理解查询并阅读教程之后,实现processRequestData()方法

,您将猜到在CREATE操作的processRequestData()方法中需要做什么:

我们得到OData请求负载,我们必须修改它,使其成为后端REST服务可以理解的负载。

我们从Integration Gateway框架中得到的不是完整的OData负载,它只是通常的特殊结构。

我们必须返回的是完整的有效负载,因为它是后端REST服务所要求的。

所以所有的事情对我们来说都是已知的:它和读取操作一样,只是相反。

我们必须做的:

1)我们必须注意的第一件事,就是设置内容类型头。

应该是在其他任务完成之前完成。

为什么?

因为我们用这个头指定了从集成网关获取数据的格式。

如果我们写:

消息.setHeader("Content Type","application/atom+xml");

然后我们得到一个包含xml结构的字符串形式的OData请求负载。

如果我们不设置这个头,我们得到一个JSON结构。

2)第二,修改请求主体

当使用我们的最终OData服务时,将执行一个POST请求,它将具有以下请求主体:

注意:

如您所知,我们通过复制和粘贴从读取请求的响应主体获得此主体。

在我们的脚本中,我们以XML形式获得相关数据结构,如下所示

我们要做的是将其转换为我们的后端REST服务所需的以下XML字符串:

我的实现是这样的:

def Message processRequestData(Message){

消息.setHeader("内容类型","应用程序/atom+xml");

消息.setHeader("x-requested-with","XMLHTTPRequest");

//convert OData request body to a string that the backend REST service understand

string odataRequestBody=消息.getBody(String.class类);

odataRequestBody=odataRequestBody.replaceAll文件("",""";

odataRequestBody=odataRequestBody.replaceAll文件("","");

odataRequestBody=odataRequestBody.replaceAll文件("","");

odataRequestBody=odataRequestBody.replaceAll文件("","");

odataRequestBody=""+odataRequestBody+"";

消息.setBody(odataRequestBody);

返回消息;

}

注意:

如果你的后端需要额外的处理,云服务平台,那么这里是正确的位置。

例如,我的后端需要设置x-request-with头。

注意:

我是用字符串操作来完成的,因为我假设更容易看到那里发生了什么。

如果您在实现processRequestData()方法之后部署服务,那么您的服务将失败–但是,条目将在后端创建,因为请求正在被发送并且它被正确地实现了。

但是我们也必须实现processResponseData()方法,因为我们必须返回新创建的实体。

在本教程中,我们假设后端REST服务返回新创建的实体。

如果是这种情况,我们必须实现processResponseData()方法,就像我们对读取操作所做的一样。

因为您实际上可以从读取脚本复制和粘贴代码,所以我跳过这里的解释。

def Message processResponseData(Message){

String bodyString=(String)消息.getBody();

/*CONVERT就像您在READ操作*/

convertPayload(bodyString,message);

return message;

}

正确实现processResponseData()方法后,您可以继续generate&deploy,然后在SMP上配置服务并调用服务。

为了测试CREATE操作,我们需要使用REST客户端工具。

注意:

此类REST客户端可用,例如Firefox(例如"RESTClient")或Chrome(例如"Advanced REST client")浏览器的附加组件

请在下面找到我对当前教程中创建的OData服务的POST请求的屏幕截图。

请在下面找到详细信息请求:

屏幕截图还显示了我们发送请求后得到的响应。

HTTP状态码应为201

响应主体应显示创建的实体

后端REST服务应显示新创建的资源。

如果您得到此响应:恭喜,您完成!

如果没有,我希望您能耐心地解决问题……

注意:

关于x-csrf-token头:

我想您知道如何获得该令牌?

您必须首先将GET请求发送到有效的URL,例如EntitySet URL

此GET请求应使用标头

x-csrf-token:fetch

(标头的名称为"x-csrf-token",自治数据库,标头的值为"fetch")

在REST客户端执行此请求后,您应检查响应标头。

您将找到标头x-csrf-token的值是令牌

现在复制该值并将其粘贴到请求标头中,这样您就有了

当前网址:http://vmchk.cooou.com/app/104938.html

 
你可能喜欢的: