Имя: Пароль:
1C
1С v8
HTTP запрос, метод POST. Перенести правильно в 1с, согласно "скришотам" из postman.
,
0 SkillUp
 
08.01.19
09:56
скрин №1 -https://drive.google.com/open?id=1mgm3OBJQBPkTNDKAPay6FmkkaaWHHtcI
скрин №2 - https://drive.google.com/open?id=171FOtCpmmfQX5wkGu-Au9XYoo74Nxzlt

Мой код, знаю что не правильно ,вот прошу помощь, сделать как postman (как на срине, вот только не пойму как:

ТелоЗапроса = "username:МойЛогин,password:МойПароль";
    
    Соединение = Новый HTTPСоединение("api.seller.rozetka.com.ua",,"МойЛогин","МойПароль",,,,);
    ЗапросСервера = Новый HTTPЗапрос("/sites");
    ЗапросСервера.Заголовки.Вставить("Content-type", "application/json");
    ЗапросСервера.УстановитьТелоИзСтроки(ТелоЗапроса);
    ОтветСервера = Соединение.ВызватьHTTPМетод("POST", ЗапросСервера);
    ТелоОтвета = ОтветСервера.ПолучитьТелоКакСтроку();
    КодОтвета  = ОтветСервера.КодСостояния;
    Сообщить (ОтветСервера.КодСостояния);
1 SkillUp
 
08.01.19
09:57
Или то, как у меня, в корне не правильно?
2 Лефмихалыч
 
08.01.19
10:11
а что не получается-то? где-то ошибка вываливается или что?
3 SkillUp
 
08.01.19
10:15
(2) Та просто, ОтветСервера.КодСостояния -301 а надо 200. Как postman...
4 SkillUp
 
08.01.19
10:16
(2) И не пойму что надо изменить в коде, что б получить заветный 200 ,а  в месте с ним и "токен доступа"...
5 ДенисЧ
 
08.01.19
10:54
Посмотри в ОтветСервера поле Location
Есть такое? Тогда повторяй запрос уже по новому адресу
И вообще читай RFC, они рулеззь
https://ru.wikipedia.org/wiki/HTTP_301
6 NorthWind
 
08.01.19
11:01
(0) я бы посоветовал еще поставить до кучи Fiddler и посмотреть, как отправляет запрос 1С в сравнении с постманом. Если верить скринам, у вас в теле запроса передается JSON с именем пользователя и паролем. Вот это - ТелоЗапроса = "username:МойЛогин,password:МойПароль";  - не JSON. Где фигурные скобки, где кавычки?
7 NorthWind
 
08.01.19
11:15
и еще вопрос. Вы уверены что у вас HTTP, а не HTTPS? Вообще открытым текстом пароли по HTTP гонять... ну как бы сказать, несекьюрно. Совсем. Здесь Соединение = Новый HTTPСоединение("api.seller.rozetka.com.ua",,"МойЛогин","МойПароль",,,,); вы открываете HTTP соединение, где все гоняется открытым текстом. Может, ваш сервис не принимает такое?
8 NorthWind
 
08.01.19
11:17
ну да! На скринах ясно написано - https://...!
А раз так, вам надо последний параметр в HTTPСоединение передать Истина - защищенное соединение.
9 SkillUp
 
08.01.19
11:27
(7) Пароли предварительно были изменены!!!
10 SkillUp
 
08.01.19
11:28
(7) Хотя ,все правильно вы пишите...
11 SkillUp
 
08.01.19
11:39
(6) Кавычки и скобки так?
ТелоЗапроса = '{"username":"Login","password":"Password(base64)"}';
12 NorthWind
 
08.01.19
11:58
(11) ну вообще я бы вот так сделал
ТелоЗапроса = "{""username"":""Login"",""password"":""Password(base64)""}";
13 NorthWind
 
08.01.19
12:02
(9) да это все равно изменены или нет, дело в другом. Посмотрите сами на скрин - у вас там префикс https://. И это правильно, потому что сейчас по HTTP уже почти никто не работает. А из программы вы устанавливаете соединение HTTP. Возможно, вам эта самая розетка отказывает просто в приеме такого соединения, потому что там вот этот JSON с паролем пойдет открытым текстом через всю сеть. Читай - не хочу.
14 Лефмихалыч
 
08.01.19
12:29
Новый HTTPСоединение(седьмой_параметр_прочитай_про_него_в_СП)
15 SkillUp
 
08.01.19
12:32
(13) БЛИН, если бы не ты я б уже повесился!!!! СПАСИБО!!!!
Заветный код 200!!!
16 SkillUp
 
08.01.19
12:38
(13) ЧТОБ Я БЕЗ ТЕБЯ ДЕЛАЛ!!!
17 SkillUp
 
08.01.19
12:40
(13) У МЕНЯ УЖЕ КРЫША ЕХАЛА...
18 SkillUp
 
08.01.19
12:46
(13) ТЫ МНЕ УЖЕ СКОЛЬКО МОМЕНТОВ ПОДСКАЗАЛ!!!
19 A1ex_2
 
06.02.19
12:11
добрый день. прошу помочь. делаю запросы и получаю ошибку что логин парль не правльный. хотя это все в Постмане и все ОК.

    username = "логин";
    password = "парольBase64";
    
    АдресСервиса = "api.seller.rozetka.com.ua";
    АдресРесурса = "/sites";
    
    ЗначениеРеквизитов = Новый Соответствие;
    ЗначениеРеквизитов.Вставить("username", username);
    ЗначениеРеквизитов.Вставить("password", password);

    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, ЗначениеРеквизитов);
    СтрJSON = ЗаписьJSON.Закрыть();
    
    СтрокаПараметров = СтрJSON;
    
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаПараметров, КодировкаТекста.UTF8);
    
    HTTPСоединение = Новый HTTPСоединение(АдресСервиса, , , , , , Новый ЗащищенноеСоединениеOpenSSL);
    Ответ = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос);
    
    СтрокаОтвет = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    Сообщить(СтрокаОтвет);


ответ:
{"success":false,"errors":{"message":"incorrect_username_password","code":1004,"details":null}}
20 NorthWind
 
06.02.19
12:17
(19) Скорее всего, проблема в том что куда-то у вас вкрался BOM. У вас платформа 8.2, 8.3? Пароль в base64 каким образом формируете?
21 Nyoko
 
06.02.19
12:34
Функция Заголовки()
    
    Заголовки = новый Соответствие;
    
    Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    Возврат Заголовки;
    
    
КонецФункции

Функция ВыполнитьПодключение(узел)
    
    Адрес = СтруктураURI(Узел.АдресСервера);
    попытка     
        Возврат Новый HTTPСоединение(Адрес.Хост,
        Адрес.Порт,
        СокрЛП(Узел.ИмяПользователя),
        СокрЛП(Узел.Пароль),,70);
    Исключение
        Возврат  Неопределено;
        сообщить(ОписаниеОшибки());
    КонецПопытки;
    
КонецФункции
22 Nyoko
 
06.02.19
12:35
// Разбирает строку URI на составные части и возвращает в виде структуры.
// На основе RFC 3986.
//
// Параметры:
//  СтрокаURI - Строка - ссылка на ресурс в формате:
//                       <схема>://<логин>:<пароль>@<хост>:<порт>/<путь>?<параметры>#<якорь>.
//
// Возвращаемое значение:
//  Структура - составные части URI согласно формату:
//   * Схема         - Строка - схема из URI.
//   * Логин         - Строка - логин из URI.
//   * Пароль        - Строка - пароль из URI.
//   * ИмяСервера    - Строка - часть <хост>:<порт> из URI.
//   * Хост          - Строка - хост из URI.
//   * Порт          - Строка - порт из URI.
//   * ПутьНаСервере - Строка - часть <путь>?<параметры>#<якорь> из URI.
//
Функция СтруктураURI(Знач СтрокаURI) Экспорт
    
    СтрокаURI = СокрЛП(СтрокаURI);
    
    // схема
    Схема = "";
    Позиция = СтрНайти(СтрокаURI, "://");
    Если Позиция > 0 Тогда
        Схема = НРег(Лев(СтрокаURI, Позиция - 1));
        СтрокаURI = Сред(СтрокаURI, Позиция + 3);
    КонецЕсли;
    
    // Строка соединения и путь на сервере.
    СтрокаСоединения = СтрокаURI;
    ПутьНаСервере = "";
    Позиция = СтрНайти(СтрокаСоединения, "/");
    Если Позиция > 0 Тогда
        ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
        СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1);
    КонецЕсли;
    
    // Информация пользователя и имя сервера.
    СтрокаАвторизации = "";
    ИмяСервера = СтрокаСоединения;
    Позиция = СтрНайти(СтрокаСоединения, "@");
    Если Позиция > 0 Тогда
        СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1);
        ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
    КонецЕсли;
    
    // логин и пароль
    Логин = СтрокаАвторизации;
    Пароль = "";
    Позиция = СтрНайти(СтрокаАвторизации, ":");
    Если Позиция > 0 Тогда
        Логин = Лев(СтрокаАвторизации, Позиция - 1);
        Пароль = Сред(СтрокаАвторизации, Позиция + 1);
    КонецЕсли;
    
    // хост и порт
    Хост = ИмяСервера;
    Порт = "";
    Позиция = СтрНайти(ИмяСервера, ":");
    Если Позиция > 0 Тогда
        Хост = Лев(ИмяСервера, Позиция - 1);
        Порт = Сред(ИмяСервера, Позиция + 1);
        Если Не ТолькоЦифрыВСтроке(Порт) Тогда
            Порт = "";
        КонецЕсли;
    КонецЕсли;
    
    Результат = Новый Структура;
    Результат.Вставить("Схема", Схема);
    Результат.Вставить("Логин", Логин);
    Результат.Вставить("Пароль", Пароль);
    Результат.Вставить("ИмяСервера", ИмяСервера);
    Результат.Вставить("Хост", Хост);
    Результат.Вставить("Порт", ?(ПустаяСтрока(Порт), Неопределено, Число(Порт)));
    Результат.Вставить("ПутьНаСервере", ПутьНаСервере);
    
    Возврат Результат;
    
КонецФункции
23 A1ex_2
 
06.02.19
13:16
(20) формировал онлайн и через 1с и результат был один и тотже. проверял посимвольно

1С:Предприятие 8.3 (8.3.12.1616)


Функция СоздатьСтрокуBase64(Строка) Экспорт
        
    Птк = Новый ПотокВПамяти;
    Текст = Новый ЗаписьТекста(Птк, КодировкаТекста.UTF8);
    Текст.Записать(Строка);
    Текст.Закрыть();
    ДД = Птк.ЗакрытьИПолучитьДвоичныеДанные();
    Строка = Base64Строка(ДД);
    
    Возврат Строка;
КонецФункции
24 A1ex_2
 
06.02.19
13:21
(21) спасибо. но это не совсем то...
25 NorthWind
 
06.02.19
14:02
(23) я правильно понял, что вы и через постман не можете достучаться, использовав base64.ru или подобный кодировщик для кодирования пароля? Тогда я бы начал с выяснения, рабочая ли учетка.
26 A1ex_2
 
06.02.19
14:05
(25) проблема наоборот...
беру все с 1с копирую в постман и все ОК. работает.

отправляю запрос с 1с и получаю ошибку
{"success":false,"errors":{"message":"incorrect_username_password","code":1004,"details":null}}

для чистоты експеремента на 1с создал НТТР сервис и постманом отправлял и смотрел как он строит запрос и так же делал в 1с, но с 1с в упор к розетке не подключается.
27 NorthWind
 
06.02.19
14:07
(26) Тогда еще раз вам повторю - проверяйте BOMы. Где-то они у вас влезли. Вот это вот
28 Nyoko
 
06.02.19
14:08
(26) Какой тип авторизации используется simple?
29 Nyoko
 
06.02.19
14:09
Запрос.УстановитьТелоИзСтроки(ПарСтрока, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
30 NorthWind
 
06.02.19
14:09
* вот это вот
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаПараметров, КодировкаТекста.UTF8);
поменяйте на
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаПараметров, КодировкаТекста.CESU-8);
31 NorthWind
 
06.02.19
14:10
или (29) попробуйте
32 NorthWind
 
06.02.19
14:11
я делал вот так в подобном случае: Запрос.УстановитьТелоИзСтроки("[""" + СтрокаСАдресом + """]", "CESU-8");
но это была 8.2, там не было нормальной работы с BOMами
33 A1ex_2
 
06.02.19
14:29
(32) пробовал и так... ошибка такая же...
incorrect_username_password

    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаПараметров, "CESU-8", ИспользованиеByteOrderMark.НеИспользовать);

(27) спасибо, "ИспользованиеByteOrderMark.НеИспользовать" - как раз отключает использоватение....

ладно буду пробовать разные варианты. получится отпишусь
34 NorthWind
 
06.02.19
14:34
(33) именно отключить и надо. Проблема заключается в том, что в запросах они НЕ НУЖНЫ. Должна идти голая строка в UTF-8 без каких-либо дополнительных символов.
35 NorthWind
 
06.02.19
14:40
попробуйте поставить Fiddler и посмотреть, что уходит на сервис. Возможно, так будет понятнее
36 NorthWind
 
06.02.19
15:58
Кстати, ветку Передать логин и пароль в WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1"); читали? Может, чем поможет?
37 A1ex_2
 
06.02.19
16:33
(36) спасибо... читал... но так и ничего с описанного там не помогло...
38 A1ex_2
 
06.02.19
17:00
получилось. ура! все таки мне кодировка...
сформировал json строку с параметрами, загнал ее в файл в потоке и с кодировкой "UTF8" и указал заголовки что это "application/json"

как обещал выкладываю весь код подключения который у меня заработал.
всем спасибо.

Процедура Подключится()
    username = "логин";
    password = СоздатьСтрокуBase64("пароль");
    
    АдресСервиса = "api.seller.rozetka.com.ua";
    АдресРесурса = "/sites";
    
    ЗначениеРеквизитов = Новый Соответствие;
    ЗначениеРеквизитов.Вставить("username", username);
    ЗначениеРеквизитов.Вставить("password", password);
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, ЗначениеРеквизитов);
    СтрJSON = ЗаписьJSON.Закрыть();
    
    Птк = Новый ПотокВПамяти;
    ЗаписьТекста = Новый ЗаписьТекста(Птк, КодировкаТекста.UTF8) ;
    ЗаписьТекста.Записать(СтрJSON);
    ЗаписьТекста.Закрыть();
    ДД = Птк.ЗакрытьИПолучитьДвоичныеДанные();
    
    Заголовки = новый Соответствие;
    Заголовки.Вставить("Content-Type", "application/json;");
    
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
    HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДД);
    
    HTTPСоединение = Новый HTTPСоединение(АдресСервиса, , , , , , Новый ЗащищенноеСоединениеOpenSSL);
    Ответ = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос);
    
    СтрокаОтвет = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    Сообщить(СтрокаОтвет);
КонецПроцедуры

Функция СоздатьСтрокуBase64(Строка) Экспорт
        
    Птк = Новый ПотокВПамяти;
    Текст = Новый ЗаписьТекста(Птк, "CESU-8");
    Текст.Записать(Строка);
    Текст.Закрыть();
    ДД = Птк.ЗакрытьИПолучитьДвоичныеДанные();
    Строка = Base64Строка(ДД);
    
    Возврат Строка;
КонецФункции
39 NorthWind
 
06.02.19
17:14
(38) а больше там нечему
40 SkillUp
 
07.02.19
14:09
(38) Блин, поздно увидел... Так бы помог...
41 yacoder
 
07.02.19
20:13
Попробовал эту штуку работы с HTTP, кажется в ней все описанные проблемы решены
http://catalog.mista.ru/public/709325/
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс