|
1c 8.3 HTTPСоединение, метод PUT | ☑ | ||
---|---|---|---|---|
0
assest
14.10.15
✎
09:47
|
Итак, есть задача: отправить файл по WebDav'у на Яндекс диск.
Функции скачать, создать папку и удалить файл уже реализованы мной. Пример: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Токен = "МойТокен"; Соединение = новый HTTPСоединение("webdav.yandex.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL); Заголовки = Новый Соответствие; Заголовки.Вставить("Host","webdav.yandex.ru"); Заголовки.Вставить("Accept","*/*"); Заголовки.Вставить("Authorization", "OAuth "+Токен); Запрос = Новый HTTPЗапрос("webdav.yandex.ru",Заголовки); Ответ = Соединение.ВызватьHTTPМетод("GET /Koala.jpg HTTP/1.1",Запрос); ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Обработка спокойно получает файл. НО в методе PUT Необходимо присоединить сам файл, вроде как его надо добавить в тело запроса например так: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Ответ= Соединение.ВызватьHTTPМетод("PUT /22/dd.jpg HTTP/1.1 |"+Символы.ПС+Символы.ПС+(Новый ДвоичныеДанные(Путь)), Запрос); ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Но если мы начинаем добавлять перенос строки в тело запроса, он либо выдает мне синтаксическую ошибку, либо перестает читать что либо после " HTTP/1.1". Я пробовал передавать заголовки в теле запроса-не работает(не авторизуется, т.е. не видит заголовка с авторизацией), пробовал передавть что либо с помощью метода HTTPЗапрос.УстановитьТелоИзСтроки() - Все в том числе и явные ошибки игнорируются. Дальше всего я продвинулся на коде, где я не присоединяю файл,WebDebager говорит мне что я заявляю файл 17 байт, а отправляю 0, если присоединяю файл, он не проходит аунтификацию Токен = "МойТокен"; Путь = "C:\Users\alexander\Pictures\1.txt"; Файл = Новый Файл(Путь); Соединение = новый HTTPСоединение("webdav.yandex.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL); Заголовки = Новый Соответствие; Заголовки.Вставить("Accept","*/*"); Заголовки.Вставить("Host","webdav.yandex.ru"); Заголовки.Вставить("Authorization", "OAuth "+Токен); Заголовки.Вставить("Etag", ХЕШMD5 (Путь)); Заголовки.Вставить("Sha256", ХЕШ (Путь)); Заголовки.Вставить("Content-Type", "application/binary"); Заголовки.Вставить("Expect", "100-continue"); Заголовки.Вставить("Content-Length", СтрЗаменить(Файл.Размер()," ","")); Запрос = Новый HTTPЗапрос("",Заголовки); Запрос.УстановитьИмяФайлаТела(Путь) ВОПРОС: Как мне передать файл в HTTPСоединение, в теле запроса или как то иначе? в чем моя ошибка?. |
|||
1
Dunemaster
14.10.15
✎
09:55
|
Как минимум, Content-Length лучше не заполняться самому. Платформа сделает это правильнее.
|
|||
2
assest
14.10.15
✎
10:00
|
Черт, я строку 1 не вставил
Ответ= Соединение.ВызватьHTTPМетод("PUT /22/dd.jpg HTTP/1.1", Запрос); |
|||
3
assest
14.10.15
✎
10:00
|
(1)С размером я разберусь, когда смогу пристегнуть файл
|
|||
4
Dunemaster
14.10.15
✎
10:01
|
А еще у вас очень странный синтаксис
ВызватьHTTPМетод("PUT /22/dd.jpg HTTP/1.1" Первым параметром должно идти только имя метода (PUT) //22/dd.jpg нужно пихать в первый параметр HTTPЗапрос HTTP/1.1 добавиться автоматически |
|||
5
assest
14.10.15
✎
10:03
|
(4) Такая идея была, но как ее организовать?
В какие заголовки или параметры поместить файл и " /22/dd.jpg"? |
|||
6
assest
14.10.15
✎
10:04
|
(4) У HTTPЗапрос есть только заголовки-соответствия которые я задал. Что значит первый параметр?
|
|||
7
Dunemaster
14.10.15
✎
10:15
|
(6)
Запрос = Новый HTTPЗапрос("/22/dd.jpg",Заголовки) Запрос.УстановитьИмяФайлаТела(Путь) Ответ= Соединение.ВызватьHTTPМетод("PUT", Запрос); |
|||
8
assest
14.10.15
✎
10:21
|
(7) Переменная Путь-это путь до файла?
|
|||
9
assest
14.10.15
✎
10:28
|
Ошибка из 1с Failure when receiving data from the peer
Ошибка из дебагера "Content-Length mismatch: Request Header indicated 6 bytes, but client sent 0 bytes." Мои соображения: выполнение заняло секунд 80, либо надо как то указывать окончания файла, либо он вообще файла не видит |
|||
10
assest
14.10.15
✎
10:55
|
Народ нужна помощь!!!
|
|||
11
Serginio1
14.10.15
✎
12:43
|
Фиддлер в руки и смотри разницу
|
|||
12
Patriot1C
14.10.15
✎
12:51
|
Зачем Web-dav если api хороший есть
http://catalog.mista.ru/public/343316/ |
|||
13
assest
14.10.15
✎
13:40
|
Вот что получилось на api
Путь = "C:\Users\alexander\Pictures\Koala.jpg"; Токен = "a5391095bce241e4b7644d99eac6ef4a"; Соединение = новый HTTPСоединение("cloud-api.yandex.net",443,,,,,Новый ЗащищенноеСоединениеOpenSSL); Заголовки = Новый Соответствие; Заголовки.Вставить("Content-Type","application/json; charset=utf-8"); Заголовки.Вставить("Authorization", "OAuth "+Токен); Запрос = Новый HTTPЗапрос("/v1/disk/resources/upload?path=%5C22%5CKoala.jpg",Заголовки); Ответ = Соединение.Получить(Запрос); URL = Ответ.ПолучитьТелоКакСтроку(); URL=Сред(URL,10,Найти(URL,"method")-13); Сообщить(ответ.КодСостояния); Запрос = Новый HTTPЗапрос("/v1/disk/resources/upload?path=%5C22&url="+URL+" |"+Новый ДвоичныеДанные(Путь),Заголовки); Ответ = Соединение.ОтправитьДляОбработки(Запрос); Сообщить(ответ.КодСостояния); ОТВЕТЫ 200 и 202 Вроде файл отправлен для обработки но он не появляется на диске |
|||
14
assest
14.10.15
✎
13:41
|
Тоже самое с
Соединение.Записать(Запрос); Возвращает 413, слишком большое тело запроса |
|||
15
Serginio1
14.10.15
✎
14:06
|
А
строка(ДвоичныеДанные(Путь))= Base64Строка(ДвоичныеДанные(Путь))= )= истина? |
|||
16
assest
14.10.15
✎
14:21
|
Вот что у меня получилось, заменил PUT на POST:
Путь = "C:\Users\alexander\Pictures\Koala.jpg"; Файл = Новый Файл(Путь); Токен = "a5391095bce241e4b7644d99eac6ef4a"; Соединение = новый HTTPСоединение("cloud-api.yandex.net",443,,,,,Новый ЗащищенноеСоединениеOpenSSL); Заголовки = Новый Соответствие; Заголовки.Вставить("Content-Type","application/json; charset=utf-8"); Заголовки.Вставить("Authorization", "OAuth "+Токен); Запрос = Новый HTTPЗапрос("/v1/disk/resources/upload?path=%5C22%5CKoala.jpg",Заголовки); Ответ = Соединение.Получить(Запрос); Сообщить(ответ.КодСостояния); URL = Ответ.ПолучитьТелоКакСтроку(); URL=Сред(URL,10,Найти(URL,"method")-13); Заголовки = Новый Соответствие; Заголовки.Вставить("Accept","*/*"); Заголовки.Вставить("Authorization", "OAuth "+Токен); Заголовки.Вставить("Etag", ХЕШMD5 (Путь)); Заголовки.Вставить("Sha256", ХЕШ (Путь)); Заголовки.Вставить("Content-Type", "application/binary"); Заголовки.Вставить("Expect", "100-continue"); //Заголовки.Вставить("Content-Length", СтрЗаменить(""+Файл.Размер()," ","")); Запрос = Новый HTTPЗапрос("/v1/disk/resources/upload?path=%5C22&url="+URL+"&disable_redirects=true |"+Новый ДвоичныеДанные(Путь),Заголовки); Ответ = Соединение.ОтправитьДляОбработки(Запрос); Сообщить(ответ.КодСостояния); URL = Ответ.ПолучитьТелоКакСтроку(); URL=Сред(URL,Найти(URL,"operations")+11,Найти(URL,"method")-61); Запрос = Новый HTTPЗапрос("/v1/disk/operations/"+URL,Заголовки); Ответ = Соединение.Получить(Запрос); Сообщить(""+ответ.КодСостояния+Ответ.ПолучитьТелоКакСтроку()); ОТВЕТЫ: 200 202 200{"status":"in-progress"} Файл вроде как отправлен и находится в процессе, но на Яндекс диске не появляется |
|||
17
Serginio1
14.10.15
✎
15:14
|
А фиддлер в руки взять не судьба? Зачем гадать?
|
|||
18
assest
14.10.15
✎
15:55
|
(17) Вот что отвечает фиддлер
4 The Client did not send properly formatted HTTP Headers. HTTP headers should be terminated with CRLFCRLF. These were terminated with LFLF. 4 Incorrectly formed Request-Line |
|||
19
Serginio1
14.10.15
✎
16:07
|
Там надо прокси прописать для HTPS
Не могу заставить работать 1С через Fiddler |
|||
20
Serginio1
14.10.15
✎
16:10
|
||||
21
assest
14.10.15
✎
16:22
|
Я уже добавил HTTPS, вроде все отправляется, я вижу свои заголовки и двоичные данные картинки. Но все равно запрос не работает.
|
|||
22
assest
14.10.15
✎
16:22
|
Кстати что мы ставим в Content-Length?
|
|||
23
Serginio1
14.10.15
✎
17:34
|
(21) Так ты проверь с валидным например из браузера.
(22) А ничего не надо ставить. |
|||
24
Serginio1
14.10.15
✎
17:35
|
(21) Отправь не картинку а какой нибудь небольшой текстовый файл на одно слово, что бы сравнить
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |