Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > RESTful веб-сервисы: Обработка HTTP запросов.


Автор: powerOn 5.1.2009, 20:44
Обработка HTTP запросов с помощью RESTful веб-сервисов.

В первой статье (http://forum.vingrad.ru/forum/index.php?show_type=forum&showtopic=242617&kw=restful-jax--maven-jersey) был проведен небольшой обзор RESTful веб-сервисов, а так же показан пример создания простого сервиса с помощью стека Jersey и Maven2. В данной статье мы коснемся вопросов обработки HTTP запросов.

 Аннотации и обработчики
Обработка основных HTTP запросов с помощью RESTful сервисов делается необычайно просто: достаточно создать метод и пометить его соответствующей аннотацией (которые называются как "resource method designator" (указатель на метод ресурса)). Jersey поддерживает следующие аннотации для назначения обработчиков http запроса:
  • @GET
  • @POST
  • @DELETE
  • @PUT
  • @HEAD
Имя каждого из них говорит само за себя. В сочетании с аннотацией @Path существует возможность связывать обработчики запросов с URI. Давайте рассмотрим несколько примеров применения этих аннотаций:

 Использование @GET и @POST

Код

package com.mycompany;

import java.util.logging.Logger;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;

@Path("simpleservice")
public class SimpleService
{
    @Context
    private UriInfo uriInfo;
    private final Logger logger = Logger.getLogger(SimpleService.class.getName());

    @GET
    @Path("getresource")
    @Produces("text/plain")
    public String myGetHandler(@QueryParam("message") String message)
    {
        logger.info(uriInfo.getAbsolutePath().toString());
        return "GET " + message;
    }

    @POST
    @Path("postresource")
    @Consumes("text/plain")
    public void myPostHandler(String message)
    {
        logger.info(uriInfo.getAbsolutePath().toString());
        logger.info("message: " + message);
    }
}


Осуществить запрос к данному сервису можно используя методы GET и POST. В первом случае URL будет выглядеть как:
Цитата
http://localhost:8080/myrestfulapp/webresources/simpleservice/getresource?message=Some message here!

А во втором, для POST запроса, так:
Цитата
http://localhost:8080/myrestfulapp/webresources/simpleservice/postresource

Следует отметить, что для успешной обработки MIME тип у POST запроса должен быть text/plain, иначе сервер вернет ошибку HTTP Status 415. Контент запроса будет передан в метод в качестве параметра. так же обратите внимание на используемый в коде объект класса UriInfo. Он автоматически инжектируется окружением и служит для получения информации об URI, по которому происходит обработка запроса.

Использование @HEAD

HEAD запрос так же можно обрабатывать с помощью RESTful сервиса. Но его обработчики не так часто используются как для GET и POST. Обычно HEAD запрос применяется для извлечения метаданных или проверки наличия ресурса, при этом клиенту отправляется только заголовок ответа (без его тела).  Интересным фактом, является то, что если явно не создавать метод обработчик c аннотацией @HEAD, то будет использоваться обработчик @GET запроса, но в ответ будет отправлен только заголовок – тело будет проигнорировано.
Код

    @HEAD
    @Path("getresource")
    public Response myHeadHandler()
    {
        ResponseBuilder okResponseBuilder = Response.ok();
        okResponseBuilder.lastModified(Calendar.getInstance().getTime());
        return okResponseBuilder.build();
    }


На этом всё. Получить информацию об остальных обработчиках можно обратившись к официальной документации по JAX-RS (JSR-311). 

Ссылки на ресурсы используемые при написании статьи:
https://jersey.dev.java.net/ - домашняя страница проекта Jersey.
http://java.sun.com/developer/technicalArticles/WebServices/restful/ - обзор RESTful веб-сервисов на java.sun.com.
http://jcp.org/en/jsr/detail?id=311 - спецификация JAX-RS 1.0.
http://docs.sun.com/app/docs/doc/820-4867/6nga7f5mk?l=ru&a=view - руководство разработчика.

Автор: Foror 6.1.2009, 08:56
Код

@DELETE
@PUT
@HEAD


Вот это сомнительные команды. Думаю @POST и @GET более чем достаточно. На хабре, кстати, было обсуждение на эту тему.


Автор: powerOn 6.1.2009, 14:01
Тут подход такой: в REST стиле HTTP методы отлично мапятся на СRUD методы, который типично реализуются в remote facade. Т.е.
Create - POST.
Read - GET.
Update - PUT.
Delete - DELETE.

Реализуя методы таким образом, легко ориентироваться в обработчиках операций.



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)