Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

HTTP запрос, метод POST. Перенести правильно в 1с, согласно "скришотам" из postman.

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

Функция ВыполнитьПодключение(узел) 
    
    Адрес = СтруктураURI(Узел.АдресСервера);
    попытка     
        Возврат Новый HTTPСоединение(Адрес.Хост, 
        Адрес.Порт,
        СокрЛП(Узел.ИмяПользователя), 
        СокрЛП(Узел.Пароль),,70);
    Исключение 
        Возврат  Неопределено;
        сообщить(ОписаниеОшибки());
    КонецПопытки;
    
КонецФункции
   Nyoko
 
22 - 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);
        Если Не ТолькоЦифрыВСтроке(Порт) Тогда
            Порт = "";
        КонецЕсли;
    КонецЕсли;
    
    Результат = Новый Структура;
    Результат.Вставить("Схема", Схема);
    Результат.Вставить("Логин", Логин);
    Результат.Вставить("Пароль", Пароль);
    Результат.Вставить("ИмяСервера", ИмяСервера);
    Результат.Вставить("Хост", Хост);
    Результат.Вставить("Порт", ?(ПустаяСтрока(Порт), Неопределено, Число(Порт)));
    Результат.Вставить("ПутьНаСервере", ПутьНаСервере);
    
    Возврат Результат;
    
КонецФункции
   A1ex_2
 
23 - 06.02.19 - 13:16
(20) формировал онлайн и через 1с и результат был один и тотже. проверял посимвольно

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


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

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

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

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

ладно буду пробовать разные варианты. получится отпишусь
 
 
   NorthWind
 
34 - 06.02.19 - 14:34
(33) именно отключить и надо. Проблема заключается в том, что в запросах они НЕ НУЖНЫ. Должна идти голая строка в UTF-8 без каких-либо дополнительных символов.
   NorthWind
 
35 - 06.02.19 - 14:40
попробуйте поставить Fiddler и посмотреть, что уходит на сервис. Возможно, так будет понятнее
   NorthWind
 
36 - 06.02.19 - 15:58
   A1ex_2
 
37 - 06.02.19 - 16:33
(36) спасибо... читал... но так и ничего с описанного там не помогло...
   A1ex_2
 
38 - 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Строка(ДД);
    
    Возврат Строка;
КонецФункции
   NorthWind
 
39 - 06.02.19 - 17:14
(38) а больше там нечему
   SkillUp
 
40 - 07.02.19 - 14:09
(38) Блин, поздно увидел... Так бы помог...
   yacoder
 
41 - 07.02.19 - 20:13
Попробовал эту штуку работы с HTTP, кажется в ней все описанные проблемы решены
http://catalog.mista.ru/public/709325/


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует