shop.product.images.add

Добрый день!
Возникла проблема при попытке добавить новую картинку: shop.product.images.add. Дело в том, что непонятно что передавать в параметр "file" (POST-параметр) - массив байт (саму картинку) или ссылку на нее или путь к файлу на локальном ПК?
Также при обращении к серверу выдается ошибку 400, т.е. неверно сформирован сам запрос, а не параметры.
Также я выявил следующий момент:
в справке по ссылке: http://www.webasyst.ru/developers/docs/api/explorer/shop/shop.product.images.add/ сказано, что product_id - обязательный GET-параметр, а в файле: http://www.webasyst.com/wa-data/public/site/downloads/SS5-Stickies-APIs-2013June24-RU.pdf (6 страница) есть строка:
shop.product.images.add ( $product_id, $url / $file ) // POST
которая говорит о том, что оба параметры POST.
Возможно, я что-то неправильно понял и хотелось бы внести ясность в этот вопрос - какого источника придерживаться? Схожая проблема присутствует в описании метода обновления артикула.
Заранее благодарю!

7 ответов

  • 1
    1. product_id передаётся в виде GET-параметра, а загруженные изображения — в виде POST-параметра.
    2. В качестве аргумента метода $file нужно передавать один или несколько файлов изображений с помощью элемента веб-формы с атрибутом enctype="multipart/form-data" и значением атрибута name="file" для элемента выбора файлов input type="file".
  • 1
    Salavat Dyusengaliev 2 июля 2014 09:22 #
    Спасибо! Если Вас не затруднит, еще пару вопросов:
    1. Если запрос можно разделить на GET (url-запрос) и POST (параметры) часть, то GET запрос:
    https://denisov.host.webasyst.com/api.php/shop.product.images.add?access_token=<мой_токен>&format=xml&product_id=<ID_существующего_товара>
    является валидным?
    2. Можно ли с помощью HTTP-запроса средствами .NET передать параметр "file"? Я пробовал передавать:
    "file=<изображение_в_string.base64>", но результат отрицательный. Есть ли какие-то ограничения на запросы из .NET-приложений?
    3. Ошибка "Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера." может быть из-за GET-параметров, POST-параметров или из-за обоих?
    4. Можно ли передать в кач-ве параметра url картинки, находящейся в альбоме (созданной командой photos.photo.add)?
    Заранее благодарю за ответы!
    • 0
      1. Да. Точнее, это будет правильный URL для POST-запроса, а не GET-запрос — для уточнения формулировки.
      2. Должно быть можно: см. http://www.ietf.org/rfc/rfc2388.txt и https://www.google.com/search?q="multipart%2Fform-data"+".NET"
      3. Скорее всего, из-за того, что неправильно был передан файл.
      4. Нет, нужно передавать только сам файл — ссылки не поддерживаются.
  • 1
    Salavat Dyusengaliev 3 июля 2014 05:21 #
    Добрый день!
    Перепробывал всякие варианты, но видимо что-то упускаю:
    1. В POST-параметрах я передаю следующее:
    -----------------------------635399891495224587
    Content-Disposition: form-data; name=file; filename=137062-big-file.jpg
    Content-Type: image/jpeg

    <Содержимое_файла-картинки одной строкой>
    -----------------------------635399891495224587--
    Но сервер упорно возвращает ошибку 500.
    Не могли бы Вы написать пример POST-параметров (я пробовал указать такие же параметры как при загрузке картинки через action:image-upload (method: product), но все тщетно).
    2. Также я ознакомился с классом: shopProductImagesAddMethod, и я предположил, что неверно передается массив $_FILES[], по которому инициализируется (waRequest::file). Есть ли у Вас какие-либо примеры заполнения этого массива через POST-парметры? Любые примеры, подсказки или ссылки будут полезны!
    Заранее благодарю!
    • 0
      >>> Но сервер упорно возвращает ошибку 500.
      Посмотрите в логах веб-сервера, что именно обозначает эта ошибка 500 — думаю, эта информация поможет понять, что вы делаете не так.
    • 0
      Попробуйте выполнить эту же задачу средствами обычной веб-страницы с формой и элементом выбора файла. Если сработает, значит, ваша проблема состоит исключительно в написании кода с использованием платформы .NET. Помощь по программированию на этой платформе вам стоит поискать на специализированном ресурсе — тут мы можем помочь только с PHP/Smarty/JavaScript/HTML/CSS.
      • 0
        Salavat Dyusengaliev Salavat Dyusengaliev 3 июля 2014 11:29 #
        Еще раз, прошу прощения!
        Ранее Вы писали:
        2. В качестве аргумента метода $file нужно передавать один или несколько файлов изображений с помощью элемента веб-формы с атрибутом enctype="multipart/form-data" и значением атрибута name="file" для элемента выбора файлов input type="file".
        Дело в том, что мой пример также не работает с той же ошибкой:
        <form enctype="multipart/form-data" method="POST"
        action="https://<мой_аккаунт>/api.php/shop.product.images.add?access_token=<токен>&format=xml&product_id=1111">
        <INPUT type="file" name="file"/>
        <INPUT TYPE="SUBMIT" VALUE ="Отправить"/>
        </form>
        Поэтому обращаюсь к Вам с просьбой привести корректный пример (на HTML) - главное чтобы он работал и добавлял фото, поскольку у меня возвращает:
        <response><error>server_error</error><error_description>CSRF Protection</error_description></response>
        Буду очень признателен за пример!
        • +1
          По поводу CSRF: http://www.webasyst.ru/developers/docs/features/csrf/
          • +1
            Salavat Dyusengaliev Salavat Dyusengaliev 4 июля 2014 07:50 #
            Спасибо!
            1. Производится ли проверка по "CSRF" при api-запросах? дело в том, что ранее я вызывал другие методы без этого параметра (поскольку он не был описан в документации к api) и они выполнялись как надо? Нужен ли этот параметр в методе добавления картинки?
            2. Если у Вас есть какой-либо пример (без формы, не HTML) использования метода product.image.add(php/js/jquery), то не могли бы Вы предоставить его для ознакомления. Это могло бы помочь мне. Заранее благодарю!
            • 0
              Salavat Dyusengaliev Salavat Dyusengaliev 10 июля 2014 03:09 #
              Дублирую комментарий, поскольку не дождался ответа на свой вопрос:
              "Если у Вас есть какой-либо пример (без формы, не HTML) использования метода product.image.add(php/js/jquery), то не могли бы Вы предоставить его для ознакомления. Это могло бы помочь мне. Заранее благодарю!".
            • 0
              Salavat Dyusengaliev Salavat Dyusengaliev 10 июля 2014 03:14 #
              На 2-ой вопрос кто-нибудь ответит? Если нет, то хоть напишите, что не ответите! Несколько дней жду ответа и захожу в этот вопрос, поскольку при появлении новых комментариев не приходит уведомление на e-mail.
            • 0
              Прошу прощения за долгое обсуждение: подозреваю, что имеет место ошибка в работе метода — проверка CSRF-cookie не должна выполняться при вызове API-методов. Ссылку на это обсуждение передал разработчикам — если появятся новые подробности, они, возможно, оставят здесь дополнительную информацию.
              • 0
                Salavat Dyusengaliev Salavat Dyusengaliev 10 июля 2014 04:39 #
                Благодарю за обнадеживающий ответ! буду ждать новых комментариев.
              • 0
                Salavat Dyusengaliev Salavat Dyusengaliev 15 июля 2014 03:34 #
                Добрый день! Нет ли каких новостей по этому вопросу и если они появятся, то как я их смогу узнать?
                • 0
                  Новостей пока нет. Возможно, в случае изменений здесь появятся комментарии, но обещать этого не могу.
                  Если разработчиками будет признано наличие ошибки, то после исправления будет выпущено обновление для Shop-Script 5 или фреймворка — в этом случае в описании к обновлению вы увидите нужную информацию.
  • 1
    Salavat Dyusengaliev 7 июля 2014 09:05 #
    Добрый день, возможно я не туда написал комментарий, поэтому дублирую:
    "Если у Вас есть какой-либо пример (без формы, не HTML) использования метода product.image.add(php/js/jquery), то не могли бы Вы предоставить его для ознакомления. Это могло бы помочь мне. Заранее благодарю!"
  • 1
    Денис Иванов 13 ноября 2016 14:37 #

    Если кому-то будет нужен пример, то файл загружается в .Net таким образом:

    using (var client = new WebClient())

    {

    client.UploadFile($@"https://site.ru/api.php/shop.product.images.add?product_id={id}&access_token={Token}", @"C:\Users\Name\Desktop\test\file.jpg");

    }

  • 0
    Salavat Dyusengaliev 3 июля 2014 10:20 #
    Ок, спасибо за советы.
  • 0
    Salavat Dyusengaliev 10 июля 2014 03:10 #

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите