POST из java

    Сегодня поделюсь вот таким опытом. Услышав модное слово REST, решили тут же применить этот тренд в проекте. В проекте необходимо было хранить картинки для соответствующих ресурсов. И было выбрано такое соглашение:
    • GET http://localhost/res/image/1001
      — позволяет скачать картинку (файл jpg) для ресурса за номером тысяча один
    • POST http://localhost/res/image/1001
      — принять и сохранить (заменить, если была) картинку
    • DELETE http://localhost/res/image/1001
      — соответственно удалить

    Модель, кстати, себя оправдала. Пользуемся по сей день. А вот в процессе разработки возник вопрос как же это чудо попробовать, протестировать. Тем более реализация этой функциональности на клиенте (Flex, btw) ещё не была готова.



    Подобное решение решение найдено на просторах интернета: http://www.devx.com/Java/Article/17679/1954

    Простая «библиотека» из одного класса, без дополнительных зависимостей, одним методом посылает файл запросом POST как это делает браузер или клиент Flex в нашем слечае.

    InputStream serverInput = ClientHttpRequest.post(
    new java.net.URL(urlString),
    new Object[]{
    "name", "J.Doe",
    "email", "abuse@spamcop.com",
    "test.txt", new
    File("c:\w\image.jpg")
    });


    Сервлет принимает:

    -----------------------------k8rws1oxpkuv1g53x0ud6a004-j12py3q5jcay
    Content-Disposition: form-data; name="name"

    J.Doe
    -----------------------------k8rws1oxpkuv1g53x0ud6a004-j12py3q5jcay
    Content-Disposition: form-data; name="email"

    abuse@spamcop.com
    -----------------------------k8rws1oxpkuv1g53x0ud6a004-j12py3q5jcay
    Content-Disposition: form-data; name="test.txt"; filename="image.jpg"
    Content-Type: image/jpeg

    яШяа...


    Для полноты картины скажу, что на стороне сервера используется библиотека apache commons fileupload:

    ServletFileUpload upload = new ServletFileUpload();

    FileItemIterator iter = upload.getItemIterator(httpServletRequest);
    while (iter.hasNext()) {
      FileItemStream item = iter.next();
      if (!item.isFormField()) {
        InputStream stream = item.openStream();

        // файл
      }
    }


    * This source code was highlighted with Source Code Highlighter.
    Поделиться публикацией

    Комментарии 10

    • НЛО прилетело и опубликовало эту надпись здесь
        0
        Что конкретно имеется ввиду? Какой-то стандартный класс? или что-то из области js?
        • НЛО прилетело и опубликовало эту надпись здесь
            0
            А при чём тут JS?
              0
              Я не очень хорошо знаю js, но в принципе догадываюсь что «клиента» — страничку-html, отсылающую выбраный файл на сервер — написать не сложно. Описанный метод пригодился позже в unit-тестировании.
        • НЛО прилетело и опубликовало эту надпись здесь
            +1
              0
              Спасибо, хорошая библиотека. Более авторитетная, так сказать.
                0
                я бы даже сказал «очевидная» и самая известная.
                в андроиде, кстати, тоже она используется.
              0
              Пользую Apache HttpClient 4.
              Она пока в бете, но весьма стабильна.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое