Господа, приветствую вас.
Вопрос возник откуда не ждали.
Суть:
Есть база 1С(пустая конфа, создал специально для тестов) в которой написал web сервис с функцией генерации XML.
web сервис опубликовал, все замечательно.
В Delphi, через импорт wsdl - импортировал описание сервиса, все отлично отработало. На форму закинул memo и получил сгенерированную XML из 1С.
procedure TForm1.Button2Click(Sender: TObject);
var
Fulltext: string;
WS: TestWebServicePortType;
begin
ws:=GetTestWebServicePortType(false, Edit3.Text);
Memo1.Lines.Clear;
Memo1.Lines.Add(ws.CreateXML('parametr1', 'parametr2'));
end;
Но, тут пришло время добавить пользователей в базу 1С. Добавил, все хорошо. Через браузер открывается ссылка на wsdl, запрашивает логин\пароль и после ввода данных - благополучно открывается.
В Delphi же теперь, при попытке получить данные - возникает ошибка "Unauthorized(401) -http://site/...1cws" что в принципе логично, потому как - никто данные для авторизации не передавал. И вот здесь начинается мой вопрос: как осуществить Basic Authorization для wsdl ?
Перепробовал уже все что только нашел на просторах интернета
Добавление
RIO.HTTPWebNode.PreemptiveAuthentication:=true;
rio.HTTPWebNode.Password:='username';
RIO.HTTPWebNode.UserName:='pass';
в сгенерированный Unit web сервиса не работает, причем данные пробовал подсовывать как в открытом виде так и в base64, - эффекта не дало.
Нашел пример реализации на компоненте THTTPClient и он оказался рабочим, вот только мне это не помогло, подумалось - если приложение авторизуется через один компонент то другому уже не потребуется авторизация но, нет
procedure TForm1.DoRequest(const url, username, password, filename: string);
var
http: THTTPClient;
ss: TStringStream;
base64: TBase64Encoding;
begin
http := THTTPClient.Create;
ss := TStringStream.Create('', TEncoding.UTF8);
base64 := TBase64Encoding.Create(0);
try
// option #1 - build in credential storage
http.CredentialsStorage.AddCredential(
TCredentialsStorage.TCredential.Create(
TAuthTargetType.Server, '', url, username, password
));
// option #2 - custom "Authorization"
http.CustomHeaders['Authorization'] := 'Basic ' + base64.Encode(username + ':' + password);
// http.ProxySettings.Create('127.0.0.1', 8888); // for fiddler
http.Get(url, ss);
Memo1.Lines.LoadFromStream(ss);
// ss.SaveToFile(filename);
finally
base64.Free;
ss.Free;
http.Free;
end;
end;
Догадываюсь - что для счастья мне нужно как то задать CustomHeader для THTTPRIO в сгенерированном Unit-е web сервера по аналогии с THTTPClient.CustomHeaders['Authorization'] := 'Basic ' + base64.Encode(username + ':' + password); и посылать данные для авторизации перед каждым запросом в 1С. Так ли это? Как пройти эту авторизацию? Очень прошу вашей помощи. С уважением, разраб-любитель