HTTP 요청을 통한 함수 호출


functions.https를 사용해 HTTP 요청으로 함수를 트리거할 수 있습니다. 이렇게 하면 GET, POST, PUT, DELETE, OPTIONS 등 지원되는 HTTP 메서드를 통해 동기 함수를 호출할 수 있습니다.

이 페이지의 예시는 함수 엔드포인트로 HTTP GET 요청을 보낼 때 트리거되는 샘플 함수를 기반으로 합니다. 샘플 함수는 현재 서버 시간을 가져오고, URL 쿼리 매개변수에 지정된 대로 시간 형식을 지정하고, HTTP 응답으로 결과를 보냅니다.

HTTP 요청으로 함수 트리거

functions.https를 사용하여 HTTP 이벤트를 처리하는 함수를 만듭니다. HTTP 함수의 이벤트 핸들러는 Express 웹 프레임워크로 관리되는 라우터와 앱을 지원하는 onRequest() 이벤트를 수신 대기합니다.

Express 요청 및 응답 객체 사용

onRequest()의 인수로 사용되는 요청 객체는 클라이언트에서 보낸 HTTP 요청의 속성에 대한 액세스 권한을 부여하고 응답 객체는 클라이언트로 응답을 다시 보내는 방법을 제공합니다.

exports.date = functions.https.onRequest((req, res) => {
  // ...
});

기존 Express 앱 사용

ApponRequest()의 인수로 사용하면 전체 Express 앱을 HTTP 함수에 전달할 수 있습니다. 다음과 같이 상용구 코드를 미들웨어로 이동할 수 있습니다.

const express = require('express');
const cors = require('cors');

const app = express();

// Automatically allow cross-origin requests
app.use(cors({ origin: true }));

// Add middleware to authenticate requests
app.use(myMiddleware);

// build multiple CRUD interfaces:
app.get('/:id', (req, res) => res.send(Widgets.getById(req.params.id)));
app.post('/', (req, res) => res.send(Widgets.create()));
app.put('/:id', (req, res) => res.send(Widgets.update(req.params.id, req.body)));
app.delete('/:id', (req, res) => res.send(Widgets.delete(req.params.id)));
app.get('/', (req, res) => res.send(Widgets.list()));

// Expose Express API as a single Cloud Function:
exports.widgets = functions.https.onRequest(app);

HTTP 함수 호출

HTTP 함수를 배포한 후 함수의 고유 URL을 통해 함수를 호출할 수 있습니다. URL에는 다음 항목이 순서대로 포함됩니다.

  • 함수를 배포한 리전(하나 이상). 일부 프로덕션 함수는 네트워크 지연 시간을 최소화하기 위해 위치를 명시적으로 설정해야 할 수 있습니다.
  • Firebase 프로젝트 ID
  • cloudfunctions.net
  • 함수 이름

예를 들어 date()를 호출하는 URL은 다음과 같습니다.

https://us-central1-<project-id>.cloudfunctions.net/date

함수를 배포할 때 권한 오류가 발생하면 배포 명령어를 실행하는 사용자에게 적절한 IAM 역할이 할당되었는지 확인합니다.

Express 앱 라우팅에서는 정의한 앱의 URL 경로에 함수 이름이 프리픽스로 추가됩니다. 예를 들어 위의 Express 앱 예시에서 getter를 호출하는 URL은 다음과 같습니다.

https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>

방화벽 또는 IP 필터 뒤에서 HTTP 함수를 호출하면 Google에서 HTTP 함수를 제공하는 데 사용하는 IP 주소를 조회할 수 있습니다.

Cloud Functions로 미들웨어 모듈 사용

쿠키 지원 또는 CORS 등을 위해 미들웨어 종속 항목을 삽입해야 하는 경우 함수 내에서 호출합니다. 예를 들어 CORS 지원을 사용 설정하려면 다음 블록을 추가합니다.

// Enable CORS using the `cors` express middleware.
cors(req, res, () => {
  // ...
});

요청의 값 읽기

다음 표에는 몇 가지 일반적인 시나리오가 나와 있습니다.

콘텐츠 유형 요청 본문 동작
application/json '{"name":"John"}' request.body.name은 'John'입니다.
application/octet-stream 'my text' request.body는 요청의 원시 바이트인 '6d792074657874'입니다. Node.js 버퍼 문서를 참조하세요.
text/plain 'my text' request.body는 'my text'입니다.
application/x-www-form-urlencoded 'name=John' request.body.name은 'John'입니다.

다음 본문 파서로 파싱이 수행됩니다.

함수가 다음 요청으로 호출된다고 가정해 보겠습니다.

curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'

그러면 전송된 데이터가 다음과 같이 구체화됩니다.

속성/메서드
req.method 'POST'
req.get('x-myheader') '123'
req.query.foo 'baz'
req.body.text 'something'
req.rawBody 요청의 파싱되지 않은 원시 바이트

date() 함수 예시에서는 함수가 URL 매개변수와 본문에서 모두 format 값을 테스트하여 사용할 날짜 및 시간 형식을 설정합니다.

let format = req.query.format;
format = req.body.format;

HTTP 함수 종료

항상 send(), redirect() 또는 end()로 HTTP 함수를 종료합니다. 그렇지 않으면 함수가 계속 실행되고 시스템에 의해 강제로 종료될 수 있습니다. 동기, 비동기, 프로미스도 참조하세요.

Node.js moment 모듈을 사용하여 서버 시간을 가져오고 형식을 지정한 후 date() 함수가 HTTP 응답으로 결과를 전송하며 종료됩니다.

const formattedDate = moment().format(`${format}`);
functions.logger.log('Sending Formatted date:', formattedDate);
res.status(200).send(formattedDate);

Firebase 호스팅에 HTTP 함수 연결

Firebase 호스팅에 HTTP 함수를 연결할 수 있습니다. Firebase 호스팅 사이트상의 요청은 특정 HTTP 함수로 프록시 처리될 수 있습니다. 이를 통해 HTTP 함수로 커스텀 도메인을 사용할 수도 있습니다. Firebase 호스팅에 Cloud Functions 연결에 대해 자세히 알아보세요.