Delphi Ошибка RestRequest UnAuthrorized (401) - PullRequest
0 голосов
/ 28 января 2020

Я хочу вызвать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...