8.х Подскажите по POST запросам с 1С

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Vladius, 19 май 2016.

  1. TopicStarter Overlay
    Vladius
    Offline

    Vladius Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    663
    Симпатии:
    3
    Баллы:
    29
    Есть открытое API сайта, работает без авторизации, мне надо было загрузить и выгрузить данные на этот сайт, загрузить с сайта получилось, через http соединение, метод получить, выполнил гет запрос по адресу - http://<Сайт>/api/catalog/product.json ну и пропарсил json.

    А теперь мне надо выгрузить товары на сайт, нифига понять не могу как это сделать, из описания есть только это:
    [​IMG]

    Пытаюсь передать ему эту строку JSON:

    PHP:
    {
        
    "data": [
            
    "Тестовый товар",
            {
                
    "title""Тестовый товар",

                
    "sku""123456",

                
    "url""test-good"
            
    }
        ]
    }
    Код 1С:

    Код:
    
       СтрокаJS = ЗаписьJSON.Закрыть();
        
        ФайлОтвета = "D:\answer.txt";
        ИмяФайлаОтправки = "D:\post.txt";
       
        Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()),"-","");
       
        ФайлОтправки = Новый ТекстовыйДокумент;
        ФайлОтправки.УстановитьТипФайла(КодировкаТекста.Системная);
        ФайлОтправки.ДобавитьСтроку(СтрокаJS);
        ФайлОтправки.Записать(ИмяФайлаОтправки,КодировкаТекста.Системная);
       
        ФайлОтправки = Новый Файл(ИмяФайлаОтправки);
        РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
       
        ЗаголовокHTTP = Новый Соответствие();
        ЗаголовокHTTP.Вставить("POST", "/api/catalog/product.json HTTP/1.1");
        ЗаголовокHTTP.Вставить("Host:", "сайт");
        ЗаголовокHTTP.Вставить("Content-Type:","multipart/form-data; boundary=" + Boundary);
        ЗаголовокHTTP.Вставить("Content-Length:", РазмерФайлаОтправки);
       
        HTTPСоединение = Новый HTTPСоединение("сайт","80",,,,);
       
        Попытка
           
            HTTPСоединение.ОтправитьДляОбработки(ИмяФайлаОтправки, "http://сайт/api/catalog/product.json", ФайлОтвета,ЗаголовокHTTP);
           
        Исключение
           
        КонецПопытки;
    Возвращает Bad Request - Invalid Header.
    --- Объединение сообщений, 19 май 2016 ---
    Как вообще понять в какой именно структуре передавать ему JSON строку? Или просить больше описания API у заказчика?
  2. TODD22
    Online

    TODD22 Профессионал в 1С Команда форума

    Регистрация:
    23 фев 2009
    Сообщения:
    4.756
    Симпатии:
    147
    Баллы:
    104
    Если есть возможность то попросить того кто писал АРI посмотреть что не так с твоим запросом.
    Помню то же писал отправку запросов. Долго мучился.... Потом с их программистом сели... я отправил, он принял... и разобрались... Где ему API поправить, а где мне запрос.
  3. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Vladius у тебя чето слишком дофига, и слишком много ненужного имхо.
    Ну во первых вероятно там авторизоваться как-то надо, не знаю, в апи посмотри. Как правило бывает два варианта: либо логин пароль, либо отправляешь логин пароль, получаешь токен, потом в запросе отправки товаров вставляешь этот токен. Тут уже конкретннее надо апи смотреть, у тебя на скрине там есть auth -это что такое? Есть еще варианты. Надо апи читать.
    А во вторых - не надо вычислять всякие размеры файла, вставлять их в заголовки, и это ( ЗаголовокHTTP.Вставить("POST", "/api/catalog/product.json HTTP/1.1");, ЗаголовокHTTP.Вставить("Host:", "сайт");) - это точно лишнее. Соединение и без тебя само сделает что надо. Заголовки надо указывать, только если процедура взаимодействия с сайтом явно этого требует, и те которые сказано в описании к апи.
    Если я правильно понимаю по скрину, тебе нужно будет вставить 2 заголовка auth и accept.

    ну принцип такой как ты написал - пишешь временный файл и его передаешь. У меня правда замечание - не стоит использовать Кодировка.Системная. Указывай явно кодировку. Как правило это utf-8.
    можно также использовать более современную версию синтаксиса объекта 1С Соединение - с http запросом. Там можно просто устанавливать тело HTTPЗапрос, без использования временных файлов.
    Но это уже на выбор, работает и так и так.

    Отправка у тебя не совсем правильная, не надо полный путь ресурса указывать, нужно относительный.
    На твоем примере это должно выглядеть как-то так:
    сайт = "http://site.ru/api/catalog/product.json"
    HTTPСоединение = Новый HTTPСоединение("site.ru","80",,,,);
    HTTPСоединение.ОтправитьДляОбработки(ИмяФайлаОтправки, "/api/catalog/product.json", ФайлОтвета, ЗаголовокHTTP);
  4. TopicStarter Overlay
    Vladius
    Offline

    Vladius Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    663
    Симпатии:
    3
    Баллы:
    29
    Не, это API ,без авторизации, разработчики ответили что надо параметры в саму строку адреса передавать - title=Тестовый товар&sku=123456&url=test-good
  5. TODD22
    Online

    TODD22 Профессионал в 1С Команда форума

    Регистрация:
    23 фев 2009
    Сообщения:
    4.756
    Симпатии:
    147
    Баллы:
    104
    Вот вот... лучше сразу у разрабов спрашивать... время своё экономить.
    Да и как я понял не всё в 1С соответствует принятой в web практике.
  6. TopicStarter Overlay
    Vladius
    Offline

    Vladius Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    663
    Симпатии:
    3
    Баллы:
    29
    Вот пример на JS:
    PHP:
    var data = {
          
    "title""Тестовый товар",
          
    "sku""123456",
          
    "url""test-good"
        
    };
        $.
    post('/api/catalog/product.json'data, function (data) {

        });
    Как это в 1С сделать?)))
  7. TODD22
    Online

    TODD22 Профессионал в 1С Команда форума

    Регистрация:
    23 фев 2009
    Сообщения:
    4.756
    Симпатии:
    147
    Баллы:
    104
    Вот так строку и составляй....
  8. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    В смысле разработчики сказали что надо использовать get запрос, а дали пример на post?
    Ты точно их правильно понял?
  9. TopicStarter Overlay
    Vladius
    Offline

    Vladius Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    663
    Симпатии:
    3
    Баллы:
    29
    Написали что надо отправлять JSON в таком формате:

    PHP:
    {

        
    "title""Тестовый товар 123",

        
    "sku""12345",

        
    "url""test-tovar"

    }
    Отправляю:
    Код:
    HTTPСоединение = Новый HTTPСоединение("сайт",,,,,);   
        HTTPСоединение.ОтправитьДляОбработки(ИмяФайлаОтправки, "/api/catalog/product.json", ФайлОтвета, ЗаголовокHTTP);
    
    Возвращает HTTP Error 400. The request has an invalid header name.

    Что ему надо???
    --- Объединение сообщений, 20 май 2016 ---
    Нет, написано POST и пример этот.
    --- Объединение сообщений, 20 май 2016 ---
    Хм, убрал эти заголовки непонятные теперь достукивается до сервера )) Теперь сервер возвращает - {"status":"failed","code":422,"message":{},"data":{"sku":["sku is required"],"title":["title is required"],"url":["url is required"]}} непонятно почему он требует заполнить поля которые уже заполнены ) Но это уже другая история, главное что он конектится к серваку.
    Последнее редактирование: 20 май 2016
  10. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Так я тебе в 3-м посте об этом написал.

    Хм.. Так у json формат один. Как они его парсить то собираются в таком виде?
    Отправь то что у тебя в первом посте было.
    --- Объединение сообщений, 20 май 2016 ---
    хотя странно. в примере то не json
    Последнее редактирование: 20 май 2016
  11. TopicStarter Overlay
    Vladius
    Offline

    Vladius Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    663
    Симпатии:
    3
    Баллы:
    29
    Это их пример типа :)

    [​IMG]
  12. TopicStarter Overlay
    Vladius
    Offline

    Vladius Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    663
    Симпатии:
    3
    Баллы:
    29
    Мда, такой цирк с этим АПИ, кодер этого апи сначала сказал что надо JSON строку отправлять, а сейчас говорит что надо в строке http запроса все указывать т.е - http://сайт/api/catalog/product.json?title=Test tovar&sku=123456&url=test-good

    Но даже когда такой запрос отправляю он возвращает - что поля title, sku и url не заполнены :D

    В общем с post, get разобрался как все работает.

    Может кто ещё объяснит для чего нужны эти заголовки?
  13. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Vladius по примеру:
    вот этот тип данных var data = { "title":"тестовый товар" ....} - в пхп как называется?
    Смотри при отправке .post оно же сериализуется в строку.
    Как оно сеариализуется? (это типовой функционал пхп ведь). Получается именно то что у тебя в первом посте, или же что-то другое?
    Кароче надо отправлять ту же строку, которая получается в пхп при сериализации вот этой переменной data.


    Пусть определится.
    Вообще-то идея get запросом - хреновая.
    Ты символы в title и url экранировать еще собрался?
  14. TopicStarter Overlay
    Vladius
    Offline

    Vladius Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    663
    Симпатии:
    3
    Баллы:
    29
    Ничего я не собрался, как я понял все прекрасно работает даже когда я JSON отправляю, но он сказал что надо делать POST запрос на этот адрес http://сайт/api/catalog/product.json?title=Test tovar&sku=123456&url=test-good

    Как в ПХП называется не знаю.
  15. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
  16. TopicStarter Overlay
    Vladius
    Offline

    Vladius Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    663
    Симпатии:
    3
    Баллы:
    29
    Все работает, с 1С я делаю POST запрос, браузер вместо пробела автоматом ставит %.
  17. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    вот тот пример на javascript - это нормальный POST запрос с url-encoded параметрами, то есть прямо в строке запроса
  18. TopicStarter Overlay
    Vladius
    Offline

    Vladius Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    663
    Симпатии:
    3
    Баллы:
    29
    В общем все элементарно просто, делаю вот такой POST запрос, все работает :)

    Код:
         HTTPЗапрос = Новый HTTPЗапрос("/api/catalog/product.json?title=Тестовый товар&sku=123456&url=test-good");
         HTTPСоединение = Новый HTTPСоединение("сайт");
         HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
        
         Результат =  HTTPОтвет.ПолучитьТелоКакСтроку();
    

Поделиться этой страницей