|
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/ |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |