자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi REST Debugger 실행시 에러
2018.01.08 18:01
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
델파이 10.1 Berlin 버전
질문1) REST Debugger 실행 오류
메뉴>Tools>REST Debuger 잘 되다가 갑자기 이런 에러가 뜨네요
질문2)
TRESTRequest 등의 콤포넌트를 사용하여 POST 방식으로 파일업로드 하는 방법 좀 알 수 있을까요?
indy 로 구현된 것을 이번에 TRESTRequest 등의 REST 콤포넌트로 바꾸려고 합니다.
델파이 업데이트 될때 마다 INDY 버전도 관리해야해서 기본 콤포넌트로 구현하려고요
댓글 3
Delphi REST Debugger 실행시 에러
2018.01.08 18:01
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
델파이 10.1 Berlin 버전
질문1) REST Debugger 실행 오류
메뉴>Tools>REST Debuger 잘 되다가 갑자기 이런 에러가 뜨네요
질문2)
TRESTRequest 등의 콤포넌트를 사용하여 POST 방식으로 파일업로드 하는 방법 좀 알 수 있을까요?
indy 로 구현된 것을 이번에 TRESTRequest 등의 REST 콤포넌트로 바꾸려고 합니다.
델파이 업데이트 될때 마다 INDY 버전도 관리해야해서 기본 콤포넌트로 구현하려고요
2가지 질문에 대해 답변 드립니다.
질문1) REST Debugger 실행 오류
RESTDebugger 소스코드가 포함되어 있습니다. 직접 디버깅해서 원인을 찾아보실 수 있습니다.
기본 설치경로 기준으로 아래 위치에 restdebugger 소스코드를 확인하실 수 있습니다.
C:\Program Files (x86)\Embarcadero\Studio\19.0\source\data\rest\restdebugger
질문2) POST 방식으로 파일 업로드하는 방법
저도 진행해 보지 않아 이전에 BaaS 컴포넌트에서 파일 관련 컴포넌트(TBackendFiles) 소스코드를 참조하시길 안내드립니다.
C:\Program Files (x86)\Embarcadero\Studio\19.0\source\data\rest
위 경로에서 REST.Backend.KinveyAPI.pas, REST.Backend.ParseAPI.pas 두개에 각 서비스별 파일 업로드 하는 부분은 아래와 같습니다.
아래 코드에서 필요한 부분을 참고해 직접 구현해보시기 바랍니다.
// Kinvey API
procedure TKinveyApi.UploadFile(const AFileName: string; const AStream: TStream; AContentType: string; APublic: Boolean; const AUserFields: TJSONObject; out ANewFile: TFile);
var
LJSONValue: TJSONValue;
LUploadURL: string;
LJSON: TJsonObject;
LRequest : TRESTRequest;
LClient : TRESTClient;
LResponseObject: TJSONObject;
LRequiredHeaders: TJsonObject;
LHeader: TJSONPair;
LContentType: TRESTContentType;
begin
/// uploading files to kiney needs two steps:
///
/// (1) sending an "upload-request" to kinvey
/// this step justs requests an upload-url
/// where the actual file-content can be
/// uploaded to. this first step /does not/
/// contain the content of the file.
///
/// (2) sending the actual file-content to the
/// upload-url received in step #1
///
/// ** please note: currently (2014) kinvey makes
/// use of "GoogleCloudStorage" for file-storage
FRequest.ResetToDefaults;
AddAuthParameter;
FRequest.Method := TRESTRequestMethod.rmPOST;
FRequest.Resource := sBlob + '/' + FConnectionInfo.AppKey; //'blob/{appKey}';
if AContentType = '' then
LContentType := TRESTContentType.ctAPPLICATION_OCTET_STREAM
else
LContentType := ContentTypeFromString(AContentType);
FRequest.AddParameter('X-Kinvey-Content-Type',// Do not localize
ContentTypeToString(LContentType),
TRESTRequestParameterKind.pkHTTPHEADER, [TRESTRequestParameterOption.poDoNotEncode]);
// prepare meta-data
if AUserFields <> nil then
LJSON := AUserFields.Clone as TJSONObject
else
LJSON := TJsonObject.Create;
try
LJSON.AddPair('_filename', AFileName); // Do not localize
if APublic then
LJSON.AddPair('_public', TJSONTrue.Create); // Do not localize
LJSON.AddPair('size', TJSONNumber.Create(AStream.Size));
FRequest.AddBody(LJSON);
finally
LJSON.Free;
end;
FRequest.Execute;
CheckForResponseError;
LResponseObject := FRequest.Response.JSONValue as TJSONObject;
ANewFile := FileFromObject(AFileName, LResponseObject);
LJSONValue := LResponseObject.GetValue('_uploadURL'); // Do not localize
if LJSONValue <> nil then
LUploadURL := LJSONValue.Value;
Assert(LUploadURL <> '');
// Kinvey tells us what headers to send with the upload
LJSONValue := LResponseObject.GetValue('_requiredHeaders'); // Do not localize
if LJSONValue <> nil then
LRequiredHeaders := LJSONValue as TJSONObject
else
LRequiredHeaders := nil;
// now send the file-content to the upload-url
LClient:= TRESTClient.Create( LUploadURL );
LRequest:= TRESTRequest.Create(LClient);
try
LClient.ProxyServer := FRESTClient.ProxyServer;
LClient.ProxyPort := FRESTClient.ProxyPort;
LClient.ProxyUsername := FRESTClient.ProxyUsername;
LClient.ProxyPassword := FRESTClient.ProxyPassword;
LRequest.URLAlreadyEncoded := true;
LRequest.Method := TRESTRequestMethod.rmPUT;
LRequest.AddBody(AStream, LContentType);
if LRequiredHeaders <> nil then
for LHeader in LRequiredHeaders do
LRequest.AddParameter(LHeader.JsonString.Value, LHeader.JsonValue.Value, TRESTRequestParameterKind.pkHTTPHEADER);
LRequest.Execute;
CheckForResponseError(LRequest);
finally
LRequest.Free;
LClient.Free;
end;
end;
——————
답글이 도움이 되셨는지 다른 분들도 참고할 수 있도록 결과 댓글 부탁드립니다.
(결과 댓글이 없는 경우 다른 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)