使用聚合设置 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 响应的格式。

参考文献: