공개 Slate 앱의 데이터 업로드
공개 앱은 Foundry 계정이 없는 사용자의 데이터를 받을 수 있습니다. 업로드한 데이터를 읽으려면 Foundry 계정과 해당 리소스의 접근 권한이 필요합니다.
필요한 데이터 소스
업로드에는 역할이 다른 두 소스가 필요합니다.
| 역할 | 소스 |
|---|---|
| 채널과 토큰 생성 | SERVICE API 유형의 secure-upload 또는 HTTP JSON 유형의 secure-upload-raw-oauth 중 하나입니다. |
| 토큰으로 JSON 데이터 업로드 | 보통 secure-upload-raw라는 이름의 소스입니다. |
공개 앱에서 새 질의를 만들 때 이 소스들을 사용할 수 있는지 확인합니다. 없으면 Palantir Support에 문의합니다.
아래 템플릿의 datasetRid, channelId, expiresAt은 제작자가 실제 값으로 준비하는 String 변수입니다. uploadAuthorization은 생성한 실제 토큰 앞에 Bearer 를 붙인 문자열입니다. 요청에 사용할 값이 준비되기 전에 관리 질의를 실행하지 않습니다.
1. 빈 데이터셋
프로젝트 또는 폴더에 새 데이터셋을 만듭니다. 리소스 URL에서 실제 RID를 얻어 datasetRid에 지정합니다.
2. 채널
secure-upload 또는 secure-upload-raw-oauth 기반 질의를 만들고 Test 옆 드롭다운에서 수동 실행을 선택합니다. channelId는 고유한 이름이며 공백을 포함할 수 없습니다. 이름의 예는 slate-app-name-data-upload입니다.
secure-upload
Available services에서 Channel Service, Endpoints에서 Put channel을 선택합니다. channelId 입력에 실제 이름을 넣고 요청 본문을 구성합니다.
{
"configuration": {
"dataset": "{{datasetRid}}",
"options": {"type":"json","json":{}}
}
}
configuration.maxBlobSize는 선택적인 개별 blob 크기 한도이며 단위는 bytes입니다. 필요한 경우 숫자로 추가합니다.
secure-upload-raw-oauth
HTTP JSON 소스의 요청 템플릿은 다음과 같습니다.
{
"path": "channels/{channelId}",
"method": "PUT",
"extractors": {"result":"$"},
"pathParams": {"channelId": {{jsonStringify channelId}}},
"queryParams": {},
"bodyJson": {
"configuration": {
"dataset": {{jsonStringify datasetRid}},
"options": {"type":"json","json":{}}
}
}
}
필요하면 같은 configuration 안에 maxBlobSize를 추가합니다. Test로 채널을 생성하면 응답의 channelId가 입력한 이름과 일치합니다. 이 값을 다음 단계에 사용합니다. 추가 채널을 만들 필요가 없으면 생성용 질의를 제거할 수 있습니다.
3. 업로드 토큰
같은 생성용 소스에서 새 수동 질의를 만듭니다. expiresAt은 실제 미래 만료 시각의 ISO-8601 문자열이어야 하며 허용되는 최대 만료는 플랫폼 인스턴스의 secure upload 설정에 따라 다릅니다.
secure-upload
Token Service의 Create Token을 선택합니다.
{
"type": "blobUploadToDataset",
"blobUploadToDataset": {
"channel": "{{channelId}}",
"expiry": "{{expiresAt}}",
"count": 1
}
}
secure-upload-raw-oauth
{
"path": "tokens",
"method": "POST",
"extractors": {"result":"$"},
"pathParams": {},
"queryParams": {},
"bodyJson": {
"type": "blobUploadToDataset",
"blobUploadToDataset": {
"channel": {{jsonStringify channelId}},
"expiry": {{jsonStringify expiresAt}},
"count": 1
}
}
}
Test로 제출한 응답의 토큰은 한 번만 표시되므로 안전한 위치에 보관합니다. 다시 필요하면 질의를 재실행하여 새 토큰을 생성해야 하며, 기존 토큰을 복구하는 경로는 없습니다. 추가 생성이 필요 없으면 생성용 질의를 제거할 수 있습니다.
토큰은 나중에 업로드를 중단할 때도 필요합니다. 최종 공개 폼에는 필요한 업로드 질의만 남기고 관리용 질의를 정리합니다.
4. 제출 질의
secure-upload-raw 소스에 업로드 질의를 만듭니다. Test 옆 드롭다운에서 버튼 클릭이나 해당 업무의 제출 조건을 선택합니다.
다음 예는 문자열을 반환하는 w_input1.text, w_input2.text와 f_function1을 사용합니다. content는 객체와 배열로 구성할 수 있으며 입력하는 말단값은 문자열로 준비합니다. jsonStringify는 JSON을 안전하게 직렬화하는 역할이므로, 숫자 등을 문자열로 저장하려면 함수에서 먼저 String으로 변환합니다.
{
"path": "blobs",
"method": "POST",
"extractors": {"result":"$"},
"headers": {
"authorization": {{jsonStringify uploadAuthorization}}
},
"bodyJson": {
"content": {
"field1": "value1",
"field2": {{jsonStringify w_input1.text}},
"field3": [
"item1",
{{jsonStringify w_input2.text}},
{{jsonStringify f_function1}}
]
}
}
}
제출 데이터는 원래 데이터셋 옆에 있는 _buffer_v2 접미사 데이터셋으로 들어갑니다. content 열에는 제출한 JSON 구조가 들어가고 다른 열에는 추가 메타데이터가 있습니다.
제출이 시작된 뒤에도 수집 필드를 바꿀 수 있습니다. 이전 항목에는 새로 추가한 필드의 값이 없습니다.
업로드 중단
신규 업로드를 막으려면 앱 게시 취소와 사용 중인 토큰 삭제를 모두 수행해야 합니다. 게시 취소만으로는 공개 secure-upload 소스에 직접 보내는 요청을 막지 못합니다.
삭제에는 실제 토큰값이 필요하므로 생성 시 보관한 값을 사용합니다. 관리자가 secure-upload 또는 secure-upload-raw-oauth 질의를 만들고 수동 실행으로 설정합니다.
- secure-upload에서는 Token Service > Delete Token을 선택하고 실제 토큰 문자열을 입력합니다.
- secure-upload-raw-oauth에서는 실제 토큰을 String 변수 tokenToDelete에 준비한 뒤 다음 템플릿을 사용합니다.
{
"path": "tokens/{token}",
"method": "DELETE",
"extractors": {"result":"$"},
"headers": {},
"pathParams": {"token": {{jsonStringify tokenToDelete}}},
"queryParams": {}
}
삭제 여부를 확인할 때에는 승인된 시험 데이터로 제출하고 오류가 PERMISSION_DENIED 및 TokenSecurity:InvalidToken인지 확인합니다. errorInstanceId는 실제 요청마다 다르므로 자신의 응답값을 사용합니다.