使用聚合设置 HTTP 输出 header 参数
Settings HTTP output header parameters working with aggregation
我正在尝试从聚合操作的响应中更改 contentType,这是我的示例代码。
interface MyAggregateInterface {
RequestResponse:
op1(typeOp1Request)(typeOp1Response)
}
outputPort MyAggregatePort {
Interfaces: MyAggregateInterface
}
embedded {
Jolie:
"MyAggratedCode.ol" in MyAggregatePort
}
inputPort MyInputPortHttp {
Protocol: http {
.debug= 1;
.debug.showContent =1;
.format -> format;
.contentType -> mime;
.charset ="UTF-8";
.default = "default";
.compression = false
}
Location: "socket://localhost:8081"
Interfaces: DefaultHttpInterface
Aggregates: MyAggregatePort
}
我想更改 op1 的 return 格式。
好吧,我会尽量回答你的问题
我们需要定义您的 op1 响应类型
type typeOp1Response:any{
.format?:string
}
或者如果您愿意
type typeOp1Response:undefined
我个人更喜欢第一种,这样你可以决定聚合服务中的mime
现在您需要添加一个快递环节
courier MyInputPortHttp {
[interface MyAggregateInterface( request )( response )]{
forward( request )( response );
if (is_defined(response.format)){
mime = response.format;
undef(response.format);
}
}
此实现有一个限制,即无法 return 根节点中的平面数据
另一种方法是使用 inputType 来定义输出格式。
type typeOp1Request:void{
.otherParameter1:string
.format?:string
}
然后你的快递员
快递 MyInputPortHttp {
[接口 MyAggregateInterface(请求)(响应)]{
forward( request )( response );
if (request.format=="json"){
mime = "application/json"
};
if (request.format=="xml"){
mime = "application/xml"
};
}
不确定这是否回答了您的问题
正如 Balint 所指出的,我们缺少一些关于响应性质的信息。
但是,在我看来,第二个示例更好地涵盖了一般情况。我们从来自聚合服务的任何信息中抽象出来(忽略了它是聚合的事实),并根据本地逻辑(在聚合器内)决定如何处理响应。
按照 Balint 的例子,我们可以用 courier
包装聚合操作并在那里定义输出格式。我在下面包含了一个最小的工作示例。
聚合服务
type PersonRequestType: void {
.name: string
}
type PersonResponseType: void {
.name: string
.surname: string
}
interface MyAggregatedInterface {
RequestResponse: op1( PersonRequestType )( PersonResponseType ) throws RecordNotFound
}
inputPort IN {
Location: "local"
Interfaces: MyAggregatedInterface
}
execution { concurrent }
main
{
op1( request )( response ){
if( request.name == "Mario" ){
response.name = "Mario";
response.surname = "Mario"
} else {
throw ( RecordNotFound )
}
}
}
聚合器服务
include "aggregated.ol"
outputPort MyAggregatePort { Interfaces: MyAggregatedInterface }
embedded { Jolie: "aggregated.ol" in MyAggregatePort }
inputPort HttpPort {
Location: "socket://localhost:8000"
Protocol: http {
.format -> format
}
Aggregates: MyAggregatePort
}
courier HttpPort {
[ interface MyAggregatedInterface( request )( response ) ]{
forward( request )( response );
format = "json" // e.g., alternative xml
}
}
通过将值设置更改为 format
,例如,从 "json"
更改为 "xml"
,我们更改了 HTTP 响应的格式。
参考文献:
Courier sessions 朱莉文档
信使的参考介绍及其语义的详细示例,Pre-print version, https://doi.org/10.1109/SOCA.2012.6449432
我正在尝试从聚合操作的响应中更改 contentType,这是我的示例代码。
interface MyAggregateInterface {
RequestResponse:
op1(typeOp1Request)(typeOp1Response)
}
outputPort MyAggregatePort {
Interfaces: MyAggregateInterface
}
embedded {
Jolie:
"MyAggratedCode.ol" in MyAggregatePort
}
inputPort MyInputPortHttp {
Protocol: http {
.debug= 1;
.debug.showContent =1;
.format -> format;
.contentType -> mime;
.charset ="UTF-8";
.default = "default";
.compression = false
}
Location: "socket://localhost:8081"
Interfaces: DefaultHttpInterface
Aggregates: MyAggregatePort
}
我想更改 op1 的 return 格式。
好吧,我会尽量回答你的问题
我们需要定义您的 op1 响应类型
type typeOp1Response:any{
.format?:string
}
或者如果您愿意
type typeOp1Response:undefined
我个人更喜欢第一种,这样你可以决定聚合服务中的mime
现在您需要添加一个快递环节
courier MyInputPortHttp {
[interface MyAggregateInterface( request )( response )]{
forward( request )( response );
if (is_defined(response.format)){
mime = response.format;
undef(response.format);
}
}
此实现有一个限制,即无法 return 根节点中的平面数据 另一种方法是使用 inputType 来定义输出格式。
type typeOp1Request:void{
.otherParameter1:string
.format?:string
}
然后你的快递员
快递 MyInputPortHttp { [接口 MyAggregateInterface(请求)(响应)]{
forward( request )( response );
if (request.format=="json"){
mime = "application/json"
};
if (request.format=="xml"){
mime = "application/xml"
};
}
不确定这是否回答了您的问题
正如 Balint 所指出的,我们缺少一些关于响应性质的信息。
但是,在我看来,第二个示例更好地涵盖了一般情况。我们从来自聚合服务的任何信息中抽象出来(忽略了它是聚合的事实),并根据本地逻辑(在聚合器内)决定如何处理响应。
按照 Balint 的例子,我们可以用 courier
包装聚合操作并在那里定义输出格式。我在下面包含了一个最小的工作示例。
聚合服务
type PersonRequestType: void {
.name: string
}
type PersonResponseType: void {
.name: string
.surname: string
}
interface MyAggregatedInterface {
RequestResponse: op1( PersonRequestType )( PersonResponseType ) throws RecordNotFound
}
inputPort IN {
Location: "local"
Interfaces: MyAggregatedInterface
}
execution { concurrent }
main
{
op1( request )( response ){
if( request.name == "Mario" ){
response.name = "Mario";
response.surname = "Mario"
} else {
throw ( RecordNotFound )
}
}
}
聚合器服务
include "aggregated.ol"
outputPort MyAggregatePort { Interfaces: MyAggregatedInterface }
embedded { Jolie: "aggregated.ol" in MyAggregatePort }
inputPort HttpPort {
Location: "socket://localhost:8000"
Protocol: http {
.format -> format
}
Aggregates: MyAggregatePort
}
courier HttpPort {
[ interface MyAggregatedInterface( request )( response ) ]{
forward( request )( response );
format = "json" // e.g., alternative xml
}
}
通过将值设置更改为 format
,例如,从 "json"
更改为 "xml"
,我们更改了 HTTP 响应的格式。
参考文献:
Courier sessions 朱莉文档
信使的参考介绍及其语义的详细示例,Pre-print version, https://doi.org/10.1109/SOCA.2012.6449432