Я хочу вызвать REST API. Но я всегда получаю «несанкционированную» (401) ошибку. Не могли бы вы мне помочь? Как мне справиться с этой проблемой?
Вот мой код. Я действительно смущен.
есть переменные
var
AStatusCode: Integer;
AJSONString: String;
AJSONValue: TJSonValue;
AParameter: TRESTRequestParameter;
var
RESTClient : TRESTClient;
RESTRequest : TRESTRequest;
RESTResponse : TRESTResponse;
JSONMensaje : TJSONObject;
JSONResponse : TJSONObject;
jValue : TJSONValue;
Token : string;
Result:string;
body:string;
LClient:TCustomRESTClient;
HTTPBasicAuthenticator:THTTPBasicAuthenticator;
simple:TSimpleAuthenticatorAdapter;
AError:String;
А оставшийся код приведен ниже.
Я установил HTTPBasicAuthenticator
для аутентификации по пользователю и паролю и присвоил некоторое свойство:
Memo1.Lines.Clear;
RESTClient := TRESTClient.Create(EditBaseURL.Text);
RESTResponse := TRESTResponse.Create(nil);
RESTRequest := TRESTRequest.Create(nil);
// Set the initial properties
RESTClient.Params.Clear;
RESTClient.HandleRedirects := true;
if CheckBoxAuthorize.Checked then
begin
HTTPBasicAuthenticator := THTTPBasicAuthenticator.Create(EditUserName.Text, EditPassword.Text);
RESTClient.Authenticator := HTTPBasicAuthenticator;
end;
RESTClient.RaiseExceptionOn500 := false;
RESTRequest.Client := RESTClient;
RESTRequest.Response := RESTResponse;
RESTRequest.SynchronizedEvents := false;
RESTRequest.Method := TRESTRequestMethod.rmPOST;
//RESTRequest.Resource := '/shipping/v1/shipments';
RESTRequest.Resource := EditURL.Text;
RESTRequest.Accept := 'application/json';
AParameter := RESTRequest.Params.AddItem;
AParameter.ContentType := ctAPPLICATION_JSON;
AParameter.name := 'Content-Type';
AParameter.Value := 'application/json';
AParameter.Kind := TRESTRequestParameterKind.pkHTTPHEADER;
//RESTRequest.Params.AddHeader('Content-Type','application/json');
RESTRequest.Params.AddHeader('Authorization','Basic YmVoaW5laDpiZWhpbmUxMjM=');
RESTRequest.Params.AddHeader('ServiceAuthorization','YmlsbGluZ19iX2doYXp2aW46Z2hhenZpbkB0Y2kxMjMNCg==');
И, наконец, я использую блок try..except
для обработки исключений и свободных ресурсов:
try
AJSONString := EditBody.Text;
RESTRequest.Body.Add(AJSONString, ctAPPLICATION_JSON);
try
RESTRequest.Execute;
Memo1.Lines.Add('************JSONText*******************');
Memo1.Lines.Add(RESTResponse.JSONText);
//Memo1.Lines.Add('JSONValue :'+RESTResponse.JSONValue.Value);
Memo1.Lines.Add('StatusText :'+RESTRequest.Response.StatusText );
Memo1.Lines.Add('StatusCode :'+IntToStr(RESTRequest.Response.StatusCode ));
Memo1.Lines.Add('ErrorMesage:'+RESTRequest.Response.ErrorMessage);
Memo1.Lines.Add('************Content*******************');
Memo1.Lines.Add(RESTRequest.Response.Content);
Memo1.Lines.Add('************Headers*******************');
Memo1.Lines.Add(RESTRequest.Response.Headers.Text);
except
on E: Exception do
begin
Memo1.Lines.Add('************Error*******************');
Memo1.Lines.Add('Error : ' +E.Message);
Memo1.Lines.Add('************Error*******************');
Memo1.Lines.Add('Error : '+RESTResponse.Content);
end;
end;
// If the StatusCode is 200, then the REST method worked
AStatusCode := RESTRequest.Response.StatusCode;
if AStatusCode <> 200 then
AError := RESTRequest.Response.Content
else
begin
AJSONValue := TJSonObject.ParseJSONValue(RESTRequest.Response.Content);
Memo1.Lines.Add(AJSONValue.Value);
AJSONValue.Free;
AError := '';
end;
finally
end;