Имя: Пароль:
1C
 
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) Отправь не картинку а какой нибудь небольшой текстовый файл на одно слово, что бы сравнить
Программист всегда исправляет последнюю ошибку.