함수를 사용하여 데이터 교환
Code Engine 함수 서비스(또는 간단히 함수)를 호출하는 것은 클라이언트 측에서 HTTP 요청을 통해 이루어집니다. 다음과 같은 방법으로 함수에 정보를 전달할 수 있습니다:
- URL (경로 및 선택적으로 쿼리 파라미터)의 일부로
- HTTP 요청 헤더를 통해
- HTTP 를 통해 요청 본문
발신자는 클라이언트 측에서 이러한 값을 HTTP 응답으로 받습니다. 응답 데이터는 다음과 같이 전달됩니다:
- HTTP 응답 코드
- HTTP 응답 헤더를 통해
- HTTP 응답 본문을 통해
HTTP 요청을 통해 함수를 호출하는 모든 규칙과 기능, 그리고 그 결과로 나타나는 HTTP 응답은 외부 데이터 인터페이스 입니다.
HTTP 의 요청이 내부 요청 데이터 인터페이스의 규칙을 사용하여 처리하기 위해 기능 코드로 전달됩니다. 함수 코드에서 제공하는 결과는 내부 응답 데이터 인터페이스의 규칙을 따라야 합니다.
다음 다이어그램은 외부 데이터 인터페이스를 사용하는 클라이언트의 정보 흐름을 보여줍니다. 이 프로세스는 Code Engine 함수 서비스와 함수 코드에 대한 내부 요청 데이터 인터페이스를 사용합니다. 마찬가지로 결과 데이터는 함수 코드에서 Code Engine 함수 서비스를 통해 내부 응답 데이터 인터페이스로 흐르고, 외부 데이터 인터페이스는 호출자에게 다시 흐릅니다.
외부 요청 데이터 인터페이스
외부 데이터 인터페이스 정의는 표준화된 HTTP 에서 파생됩니다.
MIME 유형
MIME 유형은 HTTP 요청 정보와 HTTP 응답의 형식을 정의하는 데 사용됩니다.
HTTP 요청 또는 HTTP 응답의 콘텐츠 유형(Content-Type)에 대해 다음 IANA MIME 유형이 지원됩니다. MIME 유형 매개변수는 지원되지만 이 목록에는 포함되어 있지 않습니다:
- JSON 유형입니다:
application/json; <parameters>
- 바이너리 유형:
audio/*; <parameters>application/octet-stream; <parameters>example/*; <parameters>font/*; <parameters>image/*; <parameters>model/*; <parameters>multipart/*; <parameters>video/*; <parameters>
- 텍스트 유형:
text/plain; <parameters>text/html; <parameters>text/*; <parameters>
- 퍼센트 인코딩 유형:
application/x-www-form-urlencoded; <parameters>
요청 데이터
함수가 호출되면 텍스트 또는 바이너리 형식으로 임의의 데이터(요청 페이로드)를 수신할 수 있습니다. HTTP 요청 헤더에 " Content-Type " 값이 있으면 함수로 전송되는 데이터의 형식과 인코딩이 결정됩니다. 데이터 구조, 형식 및 콘텐츠 유형이 일치해야 합니다. Code Engine 는 콘텐츠 유형을 고려하여 데이터에 대한 최소한의 유효성 검사를 수행하고, 유효하지 않은 JSON
데이터 형식이나 인코딩과 같은 특정 경우에 HTTP 상태 코드 400 로 응답합니다.
선택한 다른 모든 ' Content-Type 값의 경우, 데이터 형식이 MIME 유형의 제한 사항과 일치해야 합니다.
쿼리 매개변수로 요청 데이터 제공
URL 데이터 요청은 HTTP URL 의 key-value 쌍으로 제공될 수 있습니다.
퍼센트 인코딩은 웹 기술에서 널리 사용됩니다. 모든 8비트 문자는 백분율 기호(%)가 앞에 붙은 16진수 값으로 작성됩니다. 이 인코딩 유형은 UTF-8( URL ) 인코딩이라고도 합니다.
쿼리 매개변수를 사용하여 함수를 호출하는 예제입니다:
curl -v "https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud/?planet1=Mars&planet2=Jupiter"
요청 본문에서 요청 데이터 제공
데이터 요청은 HTTP 요청의 본문 섹션에 제공됩니다. 데이터 형식은 제공된 ' Content-Type ' 값과 일치해야 합니다.
UNIX®에서 본문 데이터를 사용하여 함수를 호출하는 예제입니다:
curl -v -H "Content-Type: application/x-www-form-urlencoded" -d 'location=planet%20earth' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud
curl -v -H "Content-Type: application/json" -d "{'planet1': 'Mars', 'planet2': 'Jupiter'}" https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud
Windows™에서 본문 데이터를 사용하여 함수를 호출하는 예제입니다:
curl -v -H "Content-Type: application/json" -d "{\"key_1\":\"Mars\",\"planet2\":\"Jupiter\"}" "https://function-nodejs-95.1057yuwab63w.us-east.codeengine.appdomain.cloud"
요청에 Content-Type 값이 누락된 경우 Code Engine 은 application/json 에 설명된 대로 데이터 페이로드를 처리합니다.
요청 헤더 데이터 제공
데이터 요청은 HTTP 요청의 헤더 섹션에 키-값 쌍으로 제공됩니다.
헤더 필드를 사용하여 함수를 호출하는 예제입니다:
curl -v -H "Sample_Data: Sample_Value" https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud
요청 혼합 데이터 제공
Code Engine 함수는 단일 HTTP 요청 내에서 요청 데이터를 제공하는 다양한 방법을 지원합니다.
본문 데이터와 헤더 필드를 사용하여 함수를 호출하는 예제입니다:
curl -v -H "Sample_Data: Sample_Value" -H "Content-Type: application/x-www-form-urlencoded" -d 'planet1=Mars&planet2=Jupiter' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud
본문 데이터, 헤더 및 쿼리 매개변수를 사용하여 함수를 호출하는 예제입니다:
curl -v -H "Sample_Data: Sample_Value" -H "Content-Type: application/x-www-form-urlencoded" -d 'planet1=Mars&planet2=Jupiter' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud/?planet1=Mars&planet2=Jupiter
내부 요청 데이터 인터페이스
내부 요청 데이터 인터페이스는 Code Engine 함수 서비스가 외부 데이터 인터페이스에서 수신한 요청 데이터를 함수 코드로 전달하는 방법을 설명합니다. 코딩 언어에 관계없이 모든 요청 매개변수를 main() 함수에 첫 번째 매개변수로 넣는 함수 로직을 구현할 수 있습니다.
이 매개변수에는 어떤 이름이라도 사용할 수 있으며, 이어지는 예제에서는 ' args'이라고 합니다.
또한 함수 코드는 사전 정의된 환경 변수 세트를 자동으로 주입받습니다.
Python 예:
import os
def main(args):
# raw_input_data = args.__ce_body; # uncomment this line if client is providing data in the request body
all_input=args;
env=dict(os.environ)
print("Return body:",all_input)
return {
"statusCode": 200,
"body" : all_input,
}
Node.js 예제:
function main(args) {
const body = {
args,
env: process.env,
};
console.log(`Return body: ${JSON.stringify(body, null, 2)}`);
return {
statusCode: 200,
"body" : body,
};
}
module.exports.main = main;
Code Engine 함수 서비스는 입력 데이터에 다른 인코딩을 사용하여 함수 코드가 ' args 인수에 있는 입력 데이터에 액세스할 수 있도록 합니다. 인코딩은 구조화된 데이터, 일반 텍스트, 데이터 및 이진 데이터를 입력 데이터의 일부로 포함할 수 있도록 도와줍니다.
텍스트 인코딩
텍스트 인코딩은 텍스트 페이로드를 포함하는 입력 ' args 파라미터의 요소에 사용됩니다. 인코딩은 특수 문자가 이스케이프되고 ' args ' 매개변수의 데이터 구조가 손상되지 않도록 하기 위해 필요합니다.
{{{site.data.keyword.codeengineshort}} main() 함수를 호출하기 전에 텍스트 콘텐츠 인코딩을 실행합니다. 함수의 프로그램 로직이 원본 데이터를 다시 생성하기 위해 이스케이프 해제해야 할 수도 있습니다.
지원되는 이스케이프 문자:
- 백스페이스는 다음으로 대체됩니다.
\b. - 폼 피드는 다음으로 대체됩니다.
\f. - 개행 문자는 다음으로 대체됩니다.
\n. - 캐리지 리턴이 다음으로 대체됩니다.
\r. - 탭은 다음으로 대체됩니다.
\t. - 큰따옴표는 다음으로 대체됩니다.
\". - 백슬래시는
\\로 대체됩니다.
Base64 인코딩
입력 ' args 매개변수의 요소 중 ' args ' 매개변수의 내부 데이터 구조를 손상시킬 수 있는 요소에는 Base64 인코딩이 사용됩니다. Base64 인코딩하면 전체 값이 64자 알파벳의 판독 가능한 문자로만 구성되도록 할 수 있습니다.
예를 들어, 다음과 같습니다.
"eyAicGxhbmV0MSI6Ik1hcnMiLCAicGxhbmV0MiI6Ikp1cGl0ZXIiIH0="
퍼센트 인코딩( URL-encoding)
퍼센트 인코딩은 웹 기술에서 널리 사용됩니다. 모든 8비트 문자는 백분율 기호(%)가 앞에 붙은 16진수 값으로 작성됩니다. 이 인코딩 유형은 UTF-8( URL ) 인코딩이라고도 합니다. 이 함수는 ' __ce_body ' 매개변수에서 원시 형식의 ' form-urlencoded 유형 데이터를 수신합니다.
Code Engine 함수 서비스는 쿼리 매개변수를 있는 그대로(앞부분의 ' ? '은 포함되지 않음) ' args ' 매개변수의 ' __ce_query ' 필드에 전달합니다. 이 방법으로 함수 코드는 이 매개변수를 URL 로 인코딩된 형식으로 받습니다. 예를 들면 다음과 같습니다
"x%5cb=1%22f4%20and%20"
' args ' 매개변수
' args ' 매개변수는 다음 형식의 요청 입력 데이터로 채워진 언어별 데이터 구조( Node.js 경우 JSON 객체, Python 경우 ' dict '(딕셔너리) 유형)입니다:
| 최상위 요소 | 설명 |
|---|---|
__ce_<service_variable> |
{{{site.data.keyword.codeengineshort}} 서비스 내부 입력 인수입니다. |
__ce_headers |
HTTP 요청 헤더 요소의 사본. |
<property>(선택사항) |
HTTP 에서 입력 데이터를 구조화된 형식으로 요청하는 경우 최상위 속성을 사용할 수 있습니다( application/json 의 콘텐츠 유형이 사용되는 경우에만). |
{: caption=' args 매개 변수에 대한 요소"} |
{
"args": {
"__ce_body": "eyAicGxhbmV0MSI6Ik1hcnMiLCAicGxhbmV0MiI6Ikp1cGl0ZXIiIH0=",
"__ce_headers": {
"Accept": "*/*",
"User-Agent": "curl/7.58.0",
"X-Request-Id": "d03a1af0-bfc8-4a50-be7d-a72040c02cc9",
"Content-Type": "application/json",
},
"__ce_method": "GET",
"__ce_path": "/",
"__ce_query": "",
"planet1": "Mars",
"planet2": "Jupiter"
}
}
내부 입력 인수를 위한 args 파라미터 세트 (__ce_*)
Code Engine 함수 서비스는 예약된 입력 인수를 ' args 입력 데이터에 주입합니다.
호출자가 요청 데이터를 제공하는 방식에 따라 ' args ' 인수에 다음 매개변수가 나타날 수 있습니다:
| 매개변수 이름 | 값 유형 | 설명 |
|---|---|---|
__ce_method |
문자열 | HTTP (GET 또는 POST 요청) 요청 방법. |
__ce_headers |
키-값 쌍 맵 | HTTP 의 키-값 쌍은 요청 헤더에 있습니다. |
__ce_path |
문자열 | URL HTTP 의 요청 경로. |
__ce_body |
문자열 | 요청 본문 엔터티는 다음과 같습니다.Base64-encoded 요청 콘텐츠 유형이 바이너리인 경우 문자열이고, 그렇지 않은 경우 일반 문자열입니다. |
__ce_query |
문자열 | 구문 분석되지 않은 문자열로서의 요청의 조회 매개변수입니다. __ce_query 매개변수는 쿼리 매개변수를 포함하는 단일 문자열로, URL 에서 구문 분석된 쿼리 매개변수에서 선행 물음표(?)를 제거하고 앰퍼샌드(&)로 구분합니다. |
__ce_* 의 내부 매개변수는 HTTP 요청에 제공된 요청 데이터로 덮어쓸 수 없습니다. HTTP 400 (Bad Request) 상태 코드로 덮어쓰기 시도가 실패합니다.
호출자가 쿼리 파라미터로 요청 데이터를 제공하는 경우 ' args ' 파라미터의 내용
함수는 쿼리 파라미터 데이터를 키-값 쌍으로 __ce_query 파라미터에 수신하고, 퍼센트 인코딩( URL-encoded)됩니다. 또한 각 단일 쿼리 매개변수는 디코딩된 형식 내에서 키-값 쌍으로 구성됩니다:
args 필드 |
설정이 완료되었나요? | 설명 |
|---|---|---|
__ce_body |
아니오 | 본문 |
__ce_headers |
예 | 콘텐츠 유형이 없는 헤더 |
__ce_query |
예 | 쿼리 파라미터( URL-encoded) |
| 최상위 속성 | 예 | 키-값 쌍( URL-decoded 및 text-encoded) |
쿼리 매개변수에 액세스하는 Python 예제입니다:
import os
def main(args):
query_parm_1 = args.get("key", "default_value") # get the value of one query parameter
try:
query = args["__ce_query"] # get all query parms
except:
query= "not part of request"
return {
"statusCode": 200,
"body": query,
}
쿼리 매개변수에 액세스하는 Node.js 예제입니다:
function main(args) {
var query_parm_1 = args.key // get the value of one query parameter
var query = args.__ce_query // get all query parameters
return {
statusCode: 200,
"body" : query,
};
}
module.exports.main = main;
호출자가 헤더 데이터로 요청 데이터를 제공하는 경우 ' args ' 파라미터의 내용
함수는 요청 헤더 데이터를 ' __ce_headers 매개변수에서 키-값 쌍으로 수신합니다. 키-값 쌍은 외부 데이터 인터페이스에서 키가 어떤 형식으로 설정되어 있는지에 관계없이 표준 형식으로 변환됩니다. 예를 들어 mykey 또는 MYKEY 은 모두 Mykey 로 변환됩니다:
args 필드 |
설정이 완료되었나요? | 설명 |
|---|---|---|
__ce_body |
아니오 | 본문 |
__ce_headers |
예 | 키-값 쌍(텍스트 인코딩)의 헤더(키는 표준 형식). |
__ce_query |
"" | 쿼리 매개변수는 빈 문자열입니다. |
| 최상위 속성 | 아니오 |
헤더 데이터에 액세스하는 Python 예제입니다:
import os
def main(args):
try:
header = args["__ce_headers"] # get complete header
# value_1 = args["__ce_headers"]["Key_1"] # get value of the Header parm with "Key_1"
except:
header = "not part of request"
return {
"statusCode": 200,
"body": header,
}
헤더 데이터에 액세스하는 Node.js 예제입니다:
function main(args) {
// var header_parm_1 = args.__ce_headers.Key_1 //get the value of one header parameter
var header = args.__ce_headers // get all header parameters
return {
statusCode: 200,
"body" : header,
};
}
module.exports.main = main;
콘텐츠 유형 ' application/json'의 요청 데이터에서 args ' 매개변수를 반환합니다
함수는 JSON 문서의 키와 값을 전용 최상위 속성 매개변수로 받습니다.
HTTP 요청에서 Content-type 에 대한 값이 설정되어 있지 않으면, Code Engine 함수는 기본값으로 application/json 를 사용합니다.
또한 JSON 페이로드는 ' __ce_body 매개변수에서 Base64-encoded 형식(바이트 배열)으로 함수에 있는 그대로 제공됩니다.
args 필드 |
설정이 완료되었나요? | 설명 |
|---|---|---|
__ce_body |
예 | 요청 데이터Base64-encoded) |
__ce_headers |
예 | 콘텐츠 유형이 설정되었습니다 |
__ce_query |
"" | 비어 있는 문자열 |
| 최상위 속성 | 예 | 각 최상위 요소의 키-값 쌍(텍스트 인코딩) |
' application/json 입력 데이터에 액세스하는 Python 예제입니다:
import os
def main(args):
try:
body_encoded = args["__ce_body"] # get complete header (base64 encoded)
value_1 = args["key_1"] # get value of the Header parm with "key_1"
except:
value_1 = "not part of request"
return {
"statusCode": 200,
"body": value_1,
}
' application/json ' 입력 데이터에 액세스하는 Node.js 예제입니다:
function main(args) {
var body = args.__ce_body // get complete request body (base64 encoded)
var value_1 = args.key_1 // get value of one single key
return {
statusCode: 200,
"body" : value_1,
};
}
module.exports.main = main;
콘텐츠 유형 ' application/octet-stream'의 요청 데이터에서 args ' 매개변수를 반환합니다
함수는 ' __ce_body ' 매개변수의 ' __ce_body 바이너리 데이터에 대해 Base64-encoded 형식의 바이너리 데이터를 수신합니다:
args 필드 |
설정이 완료되었나요? | 설명 |
|---|---|---|
__ce_body |
예 | 요청 데이터Base64-encoded) |
__ce_headers |
예 | 콘텐츠 유형이 설정되었습니다 |
__ce_query |
"" | 비어 있는 문자열 |
| 최상위 속성 | 아니오 |
' application/octet-stream 입력 데이터에 액세스하는 Python 예제입니다:
import os
import base64
def main(args):
try:
body = base64.b64decode(args['__ce_body']).decode("utf-8") # read binary data into the body variable
except:
body = "not binary data found"
return {
"headers": { "Content-Type": "text/plain" }, # text/plain, if ensured binary data do not conain backslash and double quotes
"statusCode": 200,
"body": body,
}
' application/octet-stream ' 입력 데이터에 액세스하는 Node.js 예제입니다:
function main(args) {
var base64EncodedBody = args.__ce_body // get complete request body (base64 encoded)
var body = Buffer.from(args.__ce_body, 'base64').toString('utf-8') // read binary data into the body variable
return {
statusCode: 200,
"body" : body,
};
}
module.exports.main = main;
콘텐츠 유형 ' text/plain'의 요청 데이터에서 args ' 매개변수를 반환합니다
함수는 ' __ce_body ' 매개변수에서 Base64-encoded 형식의 텍스트 유형 데이터를 받습니다:
args 필드 |
설정이 완료되었나요? | 설명 |
|---|---|---|
__ce_body |
예 | 데이터 요청(텍스트 인코딩) |
__ce_headers |
예 | 콘텐츠 유형이 설정되었습니다 |
__ce_query |
"" | 비어 있는 문자열 |
| 최상위 속성 | 아니오 |
함수의 프로그램 로직이 원본 데이터를 다시 생성하기 위해 이스케이프 해제해야 할 수도 있습니다.
' text/plain 입력 데이터에 액세스하는 Python 예제입니다:
import os
def main(args):
body = args['__ce_body'] # get request body, is text encoded (escaped)
return {
"headers": { "Content-Type": "text/plain" },
"statusCode": 200,
"body": body,
}
' text/plain ' 입력 데이터에 액세스하는 Node.js 예제입니다:
function main(args) {
var body = args.__ce_body // get complete request body (text encoded)
return {
statusCode: 200,
"body" : body,
};
}
module.exports.main = main;
콘텐츠 유형 ' application/x-www-form-urlencoded'의 요청 데이터에서 args ' 매개변수를 반환합니다
함수는 ' __ce_body 매개변수에서 텍스트 인코딩 형식의 전체 본문 데이터를 받습니다:
args 필드 |
설정이 완료되었나요? | 설명 |
|---|---|---|
__ce_body |
예 | 데이터 요청(텍스트 인코딩) |
__ce_headers |
예 | 콘텐츠 유형이 설정되었습니다 |
__ce_query |
"" | 비어 있는 문자열 |
| 최상위 속성 | 아니오 |
' application/x-www-form-urlencoded 입력 데이터에 액세스하는 Python 예제입니다:
import os
def main(args):
body = args['__ce_body'] # get request body, is url-encoded (%)
return {
"headers": { "Content-Type": "text/plain" },
"statusCode": 200,
"body": body,
}
' application/x-www-form-urlencoded ' 입력 데이터에 액세스하는 Node.js 예제입니다:
function main(args) {
var body = args.__ce_body //get request body, is url-encoded (%)
return {
statusCode: 200,
"body" : body,
};
}
module.exports.main = main;
args 콘텐츠 유형의 요청 데이터에서 application/x-www-form-urlencoded 및 쿼리 매개변수
URL 혼합된 데이터 유형의 모든 조합이 가능하지만, 쿼리 파라미터와 본문 파라미터를 사용하는 HTTP 요청의 경우, 본문 파라미터가 쿼리 파라미터보다 우선한다는 점을 고려해야 합니다.
Code Engine 함수 환경 변수
함수 호출 매개변수는 들어오는 HTTP 요청에서 파생되지만, Code Engine 함수는 시스템 설정에서 파생된 사전 정의된 환경 변수 집합에 액세스할 수도 있습니다
- CE_ALLOW_CONCURRENT
- CE_API_BASE_URL
- CE_DOMAIN
- CE_EXECUTION_ENV
- CE_FUNCTION
- CE_PROJECT_ID
- CE_REGION
- CE_SUBDOMAIN
이러한 환경 변수에 대한 자세한 내용은 다음을 참조하세요.자동으로 주입된 환경 변수.
환경 변수에 액세스하는 Python 예제입니다:
import os
def main(args):
curEnv=dict(os.environ)
return {
"headers": { "Content-Type": "application/json" },
"statusCode": 200,
"body": {
"env": curEnv,
}
}
환경 변수에 액세스하는 Node.js 예제:
function main(args) {
var curEnv = process.env; //read the function's env vars
return {
"headers": { "Content-Type": "application/json" },
"statusCode": 200,
"body": {
"env": curEnv,
}
};
}
module.exports.main = main;
내부 응답 데이터 인터페이스
내부 응답 데이터 인터페이스는 함수 코드가 응답 데이터를 제공하는 방식을 나타냅니다. Code Engine 의 기능 서비스는 데이터를 처리하고 호출자에게 ' HTTP ' 응답을 제공합니다.
프로그래밍 언어와 관계없이 함수 코드는 반환 문에서 응답 데이터를 데이터 구조로 제공해야 합니다.
프로그래밍 언어에 따라 결과 객체는 다음 구조를 가진 JSON 객체Node.js 언어) 또는 딕셔너리Python 언어)입니다:
| 함수 결과 데이터 | 요구사항 | 설명 |
|---|---|---|
headers |
선택사항 | 키가 헤더 이름이고 값이 문자열, 숫자 또는 부울 값인 결과 객체입니다. 단일 헤더에 여러 값을 보내려면 헤더의 값은 여러 값의 배열입니다. 기본적으로 헤더는 설정되지 않습니다. |
statusCode |
해야 함(기본값 200) | 유효한 HTTP 상태 코드입니다. |
body |
선택 사항(기본값: 비어 있음) | 일반 텍스트, JSON 객체 또는 배열, 바이너리 데이터의 경우 Base64-encoded 문자열입니다. 본문이 널이거나 빈 문자열("") 또는 정의되지 않은 경우 비어 있는 것으로 간주합니다. |
함수 실행 결과 데이터를 제공하기 위한 결과 데이터 구조 예시입니다:
import os
def main(args):
return {
headers: {
"content_type" : "application/json" ,
"key" , "value"
},
"statusCode": 200,
body: {"myMessage" : "sample message"}
}
항상 ' body '과 ' statusCode'를 설정합니다. statusCode 및 body의 암시적 설정은 더 이상 사용되지 않는 Code Engine 함수와의 호환성을 위해서만 사용할 수 있습니다.
headers 요소
헤더 섹션의 주요 의도는 함수가 응답 데이터를 제공할 콘텐츠 유형을 정의하는 것입니다. 결과 데이터는 요청 시 수락된 것과 동일한 ' MIME-Type ' 값을 지원합니다.
' Content-Type ' 값의 값에 따라 결과 구조의 본문 필드에는 다음과 같은 내용이 포함되어야 합니다:
| 컨텐츠 유형 | 본문 요소에 할당되는 값 | 예 |
|---|---|---|
application/json |
JSON 오브젝트 | body : { key_1: val1 } |
| 설정되지 않음(기본값) | 문자열 | body : "some text" |
text/* |
문자열 | body : "some text" |
audio/*, example/*, font/', image/*, video/*, 그리고 나머지 모든 유형 |
Base64-encoded | body: "SGVsbG8gV29ybGQhCg==" |
HTTP 또한 함수 코드는 응답 헤더의 키-값 쌍을 사용하여 응답 데이터를 제공할 수 있습니다. 따라서 코드에서는 반환 문에 사용되는 데이터 구조의 헤더 섹션에 고유 키 이름과 해당 값을 넣어야 합니다.
다음과 같은 주요 이름 고려 사항을 참고하세요:
- 키 이름은 대소문자를 구분하지 않습니다
- 동일한 키 이름의 가장 최근 값 할당이 사용됩니다
- 백슬래시 또는 공백은 지원되지 않습니다
이러한 가치 고려 사항을 기록해 두세요:
- 값은 텍스트 인코딩되어야 합니다
- 값은 데이터 유형이 문자열 또는 문자열 배열이어야 합니다
응답 데이터를 헤더 키-값 쌍으로 반환하는 예제입니다:
import os
def main(args):
return {
"headers": {
"Content-Type": "text/plain",
"key_1" : "sample_value",
},
"statusCode": 200,
"body": "" ,
}
statusCode 요소
함수 코드는 호출자에게 실행 결과를 알리기 위해 명시적으로 상태 코드(기본값 ' 200)를 설정해야 합니다. HTTP 의 유효한 반환 상태 코드(즉, 상태 코드 200 에서 599 까지)를 사용할 수 있습니다.
Code Engine 함수 서비스는 헤더 필드(x-faas-actionstatus)에 함수의 상태 코드를 반환하고, HTTP 상태 코드로 반환합니다.
statusCode 가 유효하지 않은 경우, Code Engine 함수 서비스는 HTTP 반환 코드 422 (유효하지 않은 함수 코드는 처리할 수 없음)를 x-faas-actionstatus 헤더 필드 없이 추가 응답 데이터 없이 반환합니다.
함수의 결과 크기 제한에 도달하면, 클라이언트에 400 의 HTTP 상태 코드가 반환됩니다.
응답 상태 코드 반환의 예입니다:
import os
def main(args):
return {
"statusCode": 200,
"body": "" ,
}
body 요소
함수 코드는 반환 데이터 구조의 ' body ' 섹션을 포함하여 함수의 응답 데이터를 제공할 수 있습니다. 함수 코드는 반환 데이터 구조의 ' body 요소를 ' Content-Type'와 일치하는 형식으로 전달하는 역할을 합니다. 함수 응답 ' Content-Type '이 누락된 경우, 함수 코드는 외부 인터페이스에서 ' Content-Type: text/plain; charset=utf-8 '를 반환하고 ' body 필드의 데이터는 변경되지 않은 형태로 반환합니다.
사용하는 콘텐츠 유형에 따라 다음과 같은 본문 규칙을 고려하세요.
콘텐츠 유형 ' application/json'의 본문 값
함수 코드는 ' body ' 요소의 값을 유효한 데이터 구조NodeJs-JSON 또는 Python)로 제공해야 합니다. Code Engine 서비스가 application/json HTTP 응답 데이터 섹션에 응답 데이터를 전달할 수 있도록 데이터 구조의 키와 값은 JSON 구문 규칙을 따라야 합니다.
데이터 구조의 백슬래시(\)와 큰따옴표(")는 HTTP 응답 데이터 섹션에서 텍스트 인코딩 형식으로 전달됩니다.
' application/json ' 응답의 Python 예제입니다:
import os
def main(args):
# python dictionary
result_body = { "key_1" : "myfolder\myFile" }
return {
"headers": {
"Content-Type": "application/json",
},
"statusCode": 200,
"body": result_body,
}
' application/json ' 응답의 Node.js 예시입니다:
function main(args) {
// JSON data structure
// Note: Backslash must be text encoded
result_body = { "key1" : "myfolder\\myFile"}
return {
statusCode: 200,
headers: {
'Content-Type': "application/json",
},
"body" : result_body ,
};
}
module.exports.main = main;
콘텐츠 유형 ' application/octet-stream'의 본문 값
함수 코드의 결과 데이터는 결과 구조에 추가하기 전에 Base64-encoded 합니다.
' application/octet-stream ' 응답의 Python 예제입니다:
import os
import base64
def main(args):
result_body = "myfolder_myFile"
enc_result_body=base64.encodebytes(result_body.encode()).decode("utf-8").strip()
return {
"headers": {
"Content-Type": "application/octet-stream",
},
"statusCode": 200,
"body": enc_result_body,
}
' application/octet-stream ' 응답의 Node.js 예시입니다:
function main(args) {
var result_body = "###\unreturned body###\n"
var buff = new Buffer(result_body , 'utf8');
return {
statusCode: 200,
headers: {
'Content-Type': "application/octet-stream",
},
"body" : buff.toString('base64') ,
};
}
module.exports.main = main;
콘텐츠 유형 ' text/plain'의 본문 값
함수 코드는 전체 응답을 단일 문자열로 제공해야 합니다. Code Engine 함수 서비스는 응답 데이터를 확인하지 않으며, 제공된 대로 호출자에게 데이터가 전송됩니다.
' text/plain ' 응답의 Python 예제입니다:
def main(args):
result_body = "myfolder_myFile"
return {
"headers": {
"Content-Type": "text/plain;charset=utf-8",
},
"statusCode": 200,
"body": result_body,
}
콘텐츠 유형 ' application/x-www-form-urlencoded '의 본문 값(퍼센트 인코딩된 콘텐츠)
함수 코드는 응답 데이터가 결과 데이터 구조에 추가되기 전에 URL-encoded로 인코딩되도록 해야 합니다. Code Engine 의 기능 서비스는 응답 데이터의 올바른 구문을 확인하지 않습니다. 데이터는 제공된 대로 발신자에게 전송됩니다.
' application/x-www-form-urlencoded ' 응답의 Python 예제입니다:
import os
def main(args):
result_body = "myfolder%20myFile"
return {
"headers": {
"Content-Type": "application/x-www-form-urlencoded",
},
"statusCode": 200,
"body": result_body,
}
외부 응답 데이터 인터페이스
외부 데이터 인터페이스 정의는 표준화된 HTTP 에서 파생됩니다. HTTP 응답 헤더의 MIME 유형은 HTTP 응답의 형식을 정의하는 데 사용됩니다.
MIME 유형
Code Engine 함수가 외부 세계로 데이터를 반환하는 경우, Code Engine 함수는 MIME 유형에 설명된 것과 동일한 IANA MIME 유형을 지원할 수 있습니다.
응답 데이터
외부 데이터 인터페이스는 응답 데이터 구조를 HTTP 헤더, HTTP 상태 코드, HTTP 응답 데이터로 함수의 호출자에게 반환합니다.
HTTP 헤더 필드
HTTP 헤더에는 함수 코드가 결과 데이터 구조에 추가한 모든 키-값 쌍이 포함되어 있습니다.
Code Engine 함수 서비스는 다음과 같은 키-값 쌍을 추가합니다:
| 필드 이름 | 설명 |
|---|---|
x-request-id |
호출된 함수에 대한 외부 요청 ID입니다. |
x-faas-activation-id |
Code Engine 함수는 호출을 위한 내부 ID를 서비스합니다. |
x-faas-actionstatus |
기능 코드가 설정한 상태 코드입니다. |
헤더 키 이름은 항상 소문자로 응답합니다.
HTTP 상태 코드
HTTP 상태 코드의 기원은 Code Engine 기능 서비스 자체이거나 기능 코드에 의해 설정된 상태 코드일 수 있습니다. 헤더 필드 ' x-faas-statuscode '의 존재 여부는 출처를 나타내는 지표입니다.
x-faas-actionstatus 헤더 필드가 설정되지 않은 경우, HTTP 상태 코드의 의미는 Code Engine 함수 설명서에서 확인할 수 있습니다. 그러나 헤더 필드가 설정되어 있는 경우 함수의 논리가 HTTP 상태 코드의 의미를 정의합니다.
Code Engine 함수 서비스는 응답 데이터 및 콘텐츠 유형에 대해 제한된 유효성 검사를 실행하고 데이터 형식 또는 인코딩(함수 코드에 의해 생성된)이 유효하지 않은 경우 HTTP 상태 코드( 400 )를 반환합니다.
HTTP 응답 데이터
HTTP 의 외부 데이터 인터페이스에 대한 응답 데이터는 함수 코드에 의해 결과 데이터 구조에 제공된 것과 동일합니다. ' MIME-Type '이 ' application/json '인 경우에만 제공된 JSON 응답의 키와 값이 수정됩니다. 모든 백슬래시와 큰따옴표는 이스케이프 처리됩니다.
예를 들어 호출자는 ' application/json 응답 데이터를 받습니다. 응답 데이터를 제공하는 함수 코드는 다음과 같습니다:
import os
def main(args):
# python dictionary
result_body = { "key_1" : "myfolder\myFile" }
return {
"headers": {
"Content-Type": "application/json",
"key" : "sample",
},
"statusCode": 200,
"body": result_body,
}
응답 ' statusCcode, ' header ' 필드 및 응답 데이터를 사용하는 ' curl ' 클라이언트는 다음과 같습니다:
curl -v -i https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud/
-> Response:
stdout>
* Host default-encoded-response.1lpigeajq5fg.us-east.codeengine.appdomain.cloud:443 was resolved.
* IPv6: 2606:4700:90:0:7554:9304:2cbe:8cbf
* IPv4: 172.65.197.223
* using HTTP/1.x
> GET / HTTP/1.1
> Host: default-encoded-response.1lpigeajq5fg.us-east.codeengine.appdomain.cloud
> User-Agent: curl/8.8.0
> Accept: *//*
* Request completely sent off
< HTTP/1.1 200 OK
< content-type: application/json
< key: sample
< x-faas-actionstatus: 200
< x-faas-activation-id: 5cbab12c-5c6e-4000-96cf-0f7fcb42a979
< x-request-id: e7098271-4780-4893-bbd4-64d4c8d7605e
< content-length: 13
{ "key_1" : "myfolder\\myFile }* Connection
Code Engine 함수 호출 예제
다음 단계에 따라 CLI를 사용하여 Code Engine 함수를 만들고 외부 데이터 인터페이스의 사용법을 확인하세요:
-
다음 코드를 로컬에
hello.js으로 저장합니다:function main(args) { return { headers: { content_type: "application/json" }, statusCode: 200, body: {args: args} }; } -
IBM Cloud® 로그인하고 Code Engine 함수 서비스를 선택한 후 새 함수를 만듭니다:
ibmcloud ce fn create --name sample --runtime nodejs --inline-code sample.js --cpu 0.5 --memory 2G출력 예:
Creating function 'sample'... OK Run 'ibmcloud ce function get -n sample' to see more details. ibmcloud ce function get -n sample Getting function 'sample'... OK Name: sample ... Status: Ready URL: https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud ... -
외부 데이터 인터페이스와 '
curl명령을 사용하여 함수를 호출합니다:curl -v https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud/출력 예:
{ "args": { "__ce_headers": { "Accept": "*/*", "User-Agent": "curl/7.58.0", "X-Request-Id": "813804ec-ef14-42e9-bce3-c162373defae" }, "__ce_method": "GET", "__ce_path": "/" } } -
쿼리 매개변수를 사용하여 함수를 호출합니다:
curl -v "https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud/?planet1=Mars&planet2=Jupiter"출력 예:
{ "args": { "__ce_headers": { "Accept": "*/*", "User-Agent": "curl/7.58.0", "X-Request-Id": "d03a1af0-bfc8-4a50-be7d-a72040c02cc9" }, "__ce_method": "GET", "__ce_path": "/", "__ce_query": "planet1=Mars&planet2=Jupiter", "planet1": "Mars", "planet2": "Jupiter" } }쿼리 매개변수는 인자에서 펼쳐진 상태로 사용할 수 있으며 '
__ce_query에서도 수정되지 않은 상태로 사용할 수 있습니다. -
양식 데이터를 사용하여 함수를 호출합니다:
curl -H "Content-Type: application/x-www-form-urlencoded" -d 'planet1=Mars&planet2=Jupiter' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud출력 예:
{ "args": { "__ce_body": "planet1=Mars&planet2=Jupiter", "__ce_headers": { "Accept": "*/*", "Content-Length": "28", "Content-Type": "application/x-www-form-urlencoded", "User-Agent": "curl/7.58.0", "X-Request-Id": "eb3e2179-c396-4eee-98cb-809316f0a765" }, "__ce_method": "POST", "__ce_path": "/" } }요청 본문의 내용은 이스케이프 처리되는 JSON 예약 문자를 사용하여 '
__ce_body인수에서 수정되지 않은 상태로 사용할 수 있습니다. -
JSON 데이터 객체를 사용하여 함수를 호출합니다:
curl -H "Content-Type: application/json" -d '{"planet1": "Mars", "planet2": "Jupiter"}' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud출력 예:
{ "args": { "__ce_body": "eyJwbGFuZXQxIjogIk1hcnMiLCAicGxhbmV0MiI6ICJKdXBpdGVyIn0=", "__ce_headers": { "Accept": "*/*", "Content-Length": "41", "Content-Type": "application/json", "User-Agent": "curl/7.58.0", "X-Request-Id": "c06ffcc3-fdae-4430-b881-01d68876c54c" }, "__ce_method": "POST", "__ce_path": "/", "planet1": "Mars", "planet2": "Jupiter" } }요청 본문의 내용은 함수 인수(
args)에 이스케이프 처리되는 JSON 예약 문자와 함께 펼쳐서 사용할 수 있으며 '__ce_body'에서 Base64-encoded 문자열로 수정되지 않은 상태로도 사용할 수 있습니다. -
JSON 데이터와 쿼리 매개변수를 사용하여 함수를 호출합니다:
curl -H "Content-Type: application/json" -d '{"planet1": "Mars", "planet2": "Jupiter"}' "https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud?planet2=Venus&planet3=Uranus"출력 예:
{ "args": { "__ce_body": "eyJwbGFuZXQxIjogIk1hcnMiLCAicGxhbmV0MiI6ICJKdXBpdGVyIn0=", "__ce_headers": { "Accept": "*/*", "Content-Length": "41", "Content-Type": "application/json", "User-Agent": "curl/7.58.0", "X-Request-Id": "daff83a5-fe53-43ef-8dc4-606e42dd8306" }, "__ce_method": "POST", "__ce_path": "/", "planet1": "Mars", "planet2": "Jupiter", "planet3": "Uranus" } }본문 매개변수와 쿼리 매개변수는 함수 인수(
args)로 펼쳐집니다. 본문 매개변수는 쿼리 매개변수를 덮어씁니다. 요청 본문은 '__ce_body'(Base64-encoded)로 제공됩니다. 쿼리 매개 변수는 '__ce_query에서 사용할 수 있습니다. -
텍스트 콘텐츠 유형을 사용하여 함수를 호출합니다:
curl -H "Content-Type: text/plain" -d 'Here we have some text. The JSON special characters like \ or " are escaped.' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud출력 예:
{ "args": { "__ce_body": "Here we have some text. The JSON special characters like \\ or \ are escaped.", "__ce_headers": { "Accept": "*/*", "Content-Length": "76", "Content-Type": "text/plain", "User-Agent": "curl/7.58.0", "X-Request-Id": "43d259eb-4247-41a9-894a-1dbd98eb16fb" }, "__ce_method": "POST", "__ce_path": "/" } }요청 본문의 내용은 '
__ce_body'로 수정하지 않고 사용할 수 있지만, JSON 특수 문자는 '\\' 또는 '\'으로 이스케이프 처리하여 사용할 수 있습니다. -
바이너리 콘텐츠 유형을 사용하여 함수를 호출합니다:
curl -H "Content-Type: application/octet-stream" -d 'This string is treaded as binary data.' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud출력 예:
{ "args": { "__ce_body": "VGhpcyBzdHJpbmcgaXMgdHJlYWRlZCBhcyBiaW5hcnkgZGF0YS4=", "__ce_headers": { "Accept": "*/*", "Content-Length": "38", "Content-Type": "application/octet-stream", "User-Agent": "curl/7.58.0", "X-Request-Id": "a90826e0-db13-4b8a-809f-60cea2a27d96" }, "__ce_method": "POST", "__ce_path": "/" } }