Настройки параметров HTTP-заголовка при работе с агрегацией - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь изменить 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.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Как указал Балинт, мы упускаем некоторую информацию о характере ответа.

Однако мне кажется, что второй пример лучше охватывает общий случай.Мы абстрагируемся от любой информации, поступающей из агрегированного сервиса (который игнорирует тот факт, что он агрегирован), и решаем, что делать с ответом, основываясь на локальной логике (в агрегаторе).

Следуя примеру Балинта, мыможет обернуть агрегированную операцию с помощью 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.

Ссылки:

0 голосов
/ 05 февраля 2019

хорошо, я постараюсь ответить на ваш вопрос

нам нужно определить ваш тип ответа 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);
      }
    } 

Эта реализация имеет ограничение, которое может возвращать плоские данные в корнеузел Другой способ - использовать inputType для определения вашего выходного формата.

type typeOp1Request:void{
  .otherParameter1:string
  .format?:string
}

затем ваш курьер

courier MyInputPortHttp {[interface MyAggregateInterface (request) (response)] {

   forward( request )( response );
    if (request.format=="json"){
         mime = "application/json"
      };
    if (request.format=="xml"){
         mime = "application/xml"
      };

    } 

Не уверен, если это отвечает на ваш вопрос

...