Имя: Пароль:
1C
1С v8
NetObjectToIDispatch45 HTTP запросы Basic auth
0 San4opa
 
02.06.20
23:38
Добрый день

Пробую отправить запрос на сервер с Basic auth через NetObjectToIDispatch45

кто-нибудь знает как пройти авторизацию правильно, пытаюсь делать через обработчик handler но похоже не то, сервер не отвечает.

    uriSources = Объект.АдресСервера+"/score/sync";
    requestUri = "";
    
    NetObject = Новый COMОбъект("NetObjectToIDispatch45");
    HttpClient = NetObject.ПолучитьТипИзСборки("System.Net.Http.HttpClient","System.Net.Http.dll");
    HttpClientHandler = NetObject.ПолучитьТип("System.Net.Http.HttpClientHandler");
    handler = NetObject.СоздатьОбъект(HttpClientHandler);
    
    NetworkCredential = NetObject.СоздатьОбъект("System.Net.NetworkCredential");
    NetworkCredential.UserName = Объект.Логин;
    NetworkCredential.Password = Объект.Пароль;
    
    handler.Credentials = NetworkCredential;
    handler.UseDefaultCredentials = Истина;
    Client = NetObject.СоздатьОбъект(HttpClient,handler);
    
    uri = NetObject.СоздатьОбъект("System.Uri",uriSources);
    Client.BaseAddress = uri;
    Данные = Новый Структура();
    
    Данные.Вставить("inn","6140038703");
    
    СтрокаJSON = Плейн_РаботаСHTTP.ПолучитьСтрокуJSON(Данные);
    ПараметрыЗапросаNetObject = NetObject.ОбернутьЛюбойОбъект(СтрокаJSON);

    StringContent = NetObject.ПолучитьТип("System.Net.Http.StringContent");
    Контент = NetObject.СоздатьОбъект(StringContent,ПараметрыЗапросаNetObject);

    Результат = Client.PostAsync(requestUri,Контент).Result;    
    //Result = Результат.Content.ReadAsStringAsync().Result;
1 Serginio1
 
03.06.20
13:22
Если ты используешь HTTPClient то проще через заголовки client.DefaultRequestHeaders.Authorization
https://stackoverflow.com/questions/14627399/setting-authorization-header-of-httpclient

public static class HttpClientExtentions
    {
        public static AuthenticationHeaderValue ToAuthHeaderValue(this string username, string password)
        {
            return new AuthenticationHeaderValue("Basic",
        Convert.ToBase64String(
            System.Text.Encoding.ASCII.GetBytes(
                $"{username}:{password}")));
        }
    }
Usage:
using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Authorization = _username.ToAuthHeaderValue(_password);
}
2 Serginio1
 
03.06.20
15:05
Единственно что вместо System.Text.Encoding.ASCII.GetBytes
лучше использовать
System.Text.UTF8Encoding.UTF8.GetBytes( Объект.Логин+":"+Объект.Пароль)
3 San4opa
 
05.06.20
04:32
(1) Спасибо, пробуем но пока не получается. Наверное дело не в авторизации.
4 San4opa
 
05.06.20
15:49
(2) Уже все перепробовали может Вы подскажете, запрос не отправляется к серверу, хотя тестируем из Postman всё работает. ИЗ 1с получаем вот такую ошибку: https://drive.google.com/file/d/1khvt_6B0zKjEbyvuOme67h-_4s7qMrcM/view?usp=sharing
адрес сервера указываем https.
5 Вафель
 
05.06.20
15:52
тут наверняка авторизация по кукисам
6 San4opa
 
05.06.20
20:02
(5) Про авторизацию писал как раз там не по кукам, но все равно пробовали.
7 Serginio1
 
06.06.20
00:27
Ну можешь попробовать использовать куки
// Вставить содержимое обработчика.
    cookieContainer = Врап.СоздатьОбъект("System.Net.CookieContainer");
    
  handler=Врап.СоздатьОбъект(HttpClientHandler);
  handler.AutomaticDecompression=Врап.OR(DecompressionMethods.GZip,DecompressionMethods.Deflate) ;
  handler.CookieContainer=cookieContainer;

Клиент = Врап.СоздатьОбъект(HttpClient,handler);
    uriSources ="http://www.telerik.com";;
    Ури=Врап.СоздатьОбъект("System.Uri",uriSources);
    Клиент.BaseAddress =Ури;

Посмотри какие куки заголовки итд
8 Serginio1
 
06.06.20
00:29
9 Serginio1
 
06.06.20
00:35
Попробуй
https://ru.stackoverflow.com/questions/480370/Как-исправить-Не-удалось-создать-защищенный-канал-ssl-tls

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
10 San4opa
 
06.06.20
05:05
(9) Спасиба, будем пробовать.
11 Serginio1
 
06.06.20
15:28
Там должно типа
ServicePointManager=врап.ПолучитьТип("System.Net.ServicePointManager");
SecurityProtocolType=врап.ПолучитьТип("System.Net.SecurityProtocolType");
ServicePointManager.SecurityProtocol = Врап.OR(SecurityProtocolType.Ssl3 , SecurityProtocolType.Tls , SecurityProtocolType.Tls11 , SecurityProtocolType.Tls12);
12 San4opa
 
06.06.20
21:39
(11) Круто, получилось, спасиба.
Основная теорема систематики: Новые системы плодят новые проблемы.