Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

공개 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는 실제 요청마다 다르므로 자신의 응답값을 사용합니다.