Hyperlambda HTTP 인터셉터

Hyperlambda HTTP 인터셉터를 사용하면 일부 HTTP 끝점을 가로채고 원래 끝점 전후에 실행되어야 하는 논리를 추가할 수 있습니다. 이것은 예를 들어 많은 흥미로운 사용 사례를 열어줍니다.
  • 원래 끝점에 대한 호출 로깅
  • 추가 입력 데이터를 원래 엔드포인트에 연결
  • 클라이언트에 필요한 엔드포인트에서 추가 데이터 반환
  • 원래 엔드포인트를 호출하기 전에 클라이언트가 지정한 데이터 변경
  • 원래 끝점에 대한 인증 요구 사항 변경
  • 가로챈 엔드포인트에 캐싱을 추가합니다
  • .
  • 기타 등등

  • 이것은 AOP 소프트웨어 개발의 거의 HTTP에 해당하는 것이 되며, 물론 "Aspect Oriented Programming"을 의미하며 원래 끝점에 대한 호출 전후에 추가 기능을 첨부할 수 있기 때문에 소프트웨어를 만드는 보다 선언적인 방법입니다. .

    다른 사용 사례는 예를 들어 Hasura 또는 Supabase에서 제공한 것과 같은 GraphQL 또는 PostgREST 엔드포인트와 같이 비즈니스 로직을 추가할 수 없는 HTTP 엔드포인트에 비즈니스 로직을 추가하는 것일 수 있습니다. 논리적으로 이것은 OOP "다형성"에 해당하는 HTTP 및 Hyperlambda가 됩니다. 정적 항목을 가져오고 원래 HTTP 메서드를 "재정의"하여 작동 방식을 수정할 수 있기 때문입니다. 아래 비디오에서 이러한 인터셉터가 어떻게 작동하는지 보여줍니다.



    아이디어는 쉽게 이해됩니다. "무엇이든"HTTP 끝점을 가져옵니다. 원래 엔드포인트를 호출하는 새 인터셉터 엔드포인트를 생성하고 인터셉터 엔드포인트에 코드를 첨부하여 인터셉터 엔드포인트가 호출되기 전후에 작업을 수행할 수 있도록 합니다. 그런 다음 인터셉터에 제공된 인수를 인터셉트된 엔드포인트로 전달하고, 필요한 경우 인터셉트된 엔드포인트를 호출하기 전에 선택적으로 Authorization 헤더를 첨부합니다.

    이제 인터셉터 사용을 시작하기 위해 해야 할 유일한 일은 원래 엔드포인트를 호출하는 동안 클라이언트가 사용하는 URL을 변경하는 것입니다. 인터셉터 끝점이 모든 인수를 허용할 수 있다고 가정하면 서명과 논리가 동일해야 합니다.

    아래 위의 비디오에서 내가 사용하는 코드를 찾을 수 있습니다.

    인터셉터.post.hl

    .arguments:*
    .description:Intercepts our foo endpoint
    
    // Endpoint we're intercepting.
    .endpoint:"https://tiger-polterguy.gb.aista.com/magic/modules/faq/foo"
    
    /*
     * Retrieving Authorization header to transmit to
     * intercepted endpoint.
     */
    request.headers.get:Authorization
    
    /*
     * Lambda object executed as an "intercepted lambda object"
     * before invocation to HTTP endpoint.
     */
    .before
       log.info:BEFORE!!
    
    /*
     * This is where you would parametrise your above [.before] object
     * with for instance arguments given by the client.
     */
    
    // Evaluating [.before] lambda object.
    eval:x:@.before
    
    // Forwarding arguments given to endpoint to intercepted endpoint.
    add:x:../*/http.post/*/payload
       get-nodes:x:@.arguments/*
    
    /*
     * Checking if we've got an Authorization HTTP header,
     * at which point we forward it to the original HTTP endpoint.
     */
    if
       not-null:x:@request.headers.get
       .lambda
          add:x:../*/http.post/*/headers
             .
                Authorization:x:@request.headers.get
    
    // Invoking the intercepted HTTP endpoint.
    http.post:x:@.endpoint
       headers
          Content-Type:application/json
       convert:true
       payload
    
    // Sanity checking invocation to endpoint.
    if
       not
          and
             mte:x:@http.post
                .:int:200
             lt:x:@http.post
                .:int:400
       .lambda
          log.error:Something went wrong as we invoked our intercepted HTTP endpoint
             endpoint:x:@.endpoint
             status:x:@http.post
             result:x:@http.post/*/content
          throw:Intercepted endpoint did not return success
             public:true
             status:502
    
    
    /*
     * Lambda object to execute after invocation to
     * intercepted endpoint.
     */
    .after
       log.info:AFTER!!
    
    /*
     * This is where you would parametrise your above [.after] object
     * with for instance arguments given by the client.
     */
    
    // Evaluating [.before] lambda object.
    eval:x:@.after
    
    // Return result to caller.
    add:x:+
       get-nodes:x:@http.post/*/content/*
    return
    


    foo.post.hl

    .arguments
       name:string
    auth.ticket.verify:root
    log.info:Foo endpoint was executed
    strings.concat
       .:"Hello "
       get-value:x:@.arguments/*/name
    unwrap:x:+/*
    return
       result:x:@strings.concat
    


    내가 하고 있는 일을 재현하려면 free demo LowCode cloudlet here에 가입하고 위의 비디오를 시청하십시오.

    좋은 웹페이지 즐겨찾기