Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RESTful веб-сервисы: Доступ к параметрам запроса. 
:(
    Опции темы
powerOn
Дата 5.1.2009, 21:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 28
Всего: 159



Доступ к параметрам запросов в RESTful веб-сервисах.

Во второй статье (RESTful веб-сервисы: Обработка HTTP запросов) было показано как обрабатывать HTTP запросы с помощью RESTful веб-сервисов. В данной статье мы коснемся вопросов доступа и обработки параметров HTTP запросов.


 Виды параметров и их определение.
JAX-RS поддерживает следующие виды параметров для автоматического инжектирования:
  • @MatrixParam - извлекает значение URI matrix параметра.
  • @QueryParam - извлекает значение URI query параметра.
  • @PathParam - извлекает значение URI параметра по шаблону.
  • @CookieParam - извлекает значение cookie параметра. 
  • @HeaderParam - извлекает значение параметра из заголовка запроса. 
  • @FormParam - извлекает значение параметра из заголовка запроса.
Эти аннотации могут быть использованы на параметрах методов, полях классов и setter методах. Во время выполнения, контейнер подставит туда актуальные значения. Далее рассмотрим некоторые примеры их использования.

 Пример использования @Path параметров с шаблонами.
Path-параметр извлекается непосредственно из URI. Шаблон для него можно задать с помощью аннотации @Path, а извлечении сделать с помощью @PathParam. Рассмотрим следующий шаблон URI:   
Цитата
http://localhost:8080/myrestfulapp/webresources/simpleservice/{filename}/{version}

{filename} и {version} могут меняться, но обработка должна происходить в одном сервисе. При этом, {version} может состоять только из числовых символов. Такой URI можно обрабатывать следующим сервисом:
Код

package com.mycompany;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

@Path("simpleservice")
public class SimpleService
{
    @GET
    @Path("/{filename}/{version:.*[0-9]}")
    @Produces("text/plain")
    public String myGetHandler(
            @PathParam("filename") String filename,
            @PathParam("version") String version)
    {
        return "this is content of file " + filename + " v[" + version + "]";
    }
}


Примером реального и правильного URI в данном случае может быть такой:
Цитата
http://localhost:8080/myrestfulapp/webresources/simpleservice/test.txt/12

Результатом такого запроса:
Цитата
http://localhost:8080/myrestfulapp/webresources/simpleservice/test.txt/12ab

Будет ошибка 404, поскольку параметр версии не удовлетворяет заданному шаблону.
Так же можно использовать объект UriInfo для получения доступа к параметрам:
Код

package com.mycompany;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.UriInfo;

@Path("simpleservice")
public class SimpleService
{
    @Context
    private UriInfo uriInfo;

    @GET
    @Path("/{filename}/{version:.*[0-9]}")
    @Produces("text/plain")
    public String myGetHandler()
    {
        MultivaluedMap<String, String> pathParameters = uriInfo.getPathParameters(false);
        return "this is content of file " + pathParameters.getFirst("filename") +
                " v[" + pathParameters.getFirst("version") + "]";
    }
}


 Пример использования @QueryParam.
@QueryParam используется для извлечения параметров запроса. Такие параметры передаются после URI запроса. Вот пример такого URI:
Цитата
http://localhost:8080/myrestfulapp/webresources/simpleservice?filename=test.txt&version=12

В данном случае передается 2 параметра: filename со значением test.txt и version со значением 12. Получить доступ в сервисе к таким параметрам можно как показано в следующем примере:
Код

package com.mycompany;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

@Path("simpleservice")
public class SimpleService
{
    @GET
    @Produces("text/plain")
    public String myGetHandler(
            @QueryParam("filename") String filename,
            @QueryParam("version") String version)
    {
        return "this is content of file " + filename + " v[" + version + "]";
    }
}


 Пример использования @MatrixParam.
Получение Matrix параметров схоже с получением Query параметров. 
Пример URI:
Цитата
http://localhost:8080/myrestfulapp/webresources/simpleservice;filename=test.txt;version=15

Код сервиса для обработки Matrix параметров:
Код

package com.mycompany;

import javax.ws.rs.GET;
import javax.ws.rs.MatrixParam;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("simpleservice")
public class SimpleService
{
    @GET
    @Produces("text/plain")
    public String myGetHandler(
            @MatrixParam("filename") String filename,
            @MatrixParam("version") String version)
    {
        return "this is content of file " + filename + " v[" + version + "]";
    }
}

 
 Пример использования @FormParam.
Аннотация @FormParam может быть использована для извлечения параметров переданных POST запросом, если его MIME тип application/x-www-form-urlencoded.
@FormParam используется аналогично другим аннотациям для доступа к параметрам.
Код

package com.mycompany;

import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;

@Path("simpleservice")
public class SimpleService
{
    @POST
    @Consumes("application/x-www-form-urlencoded")
    public Response myGetHandler(
            @FormParam("filename") String filename,
            @FormParam("version") String version)
    {
        // do something with parameters.
        return Response.noContent().build();
    }
}


 Пример использования @DefaultValue.
Вы также можете использовать аннотацию @DefaultValue для установки значения по умолчанию для параметров. Это полезно, если оно не было явно задано в запросе.
Код

package com.mycompany;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
@Path("simpleservice")
public class SimpleService
{
    @GET
    @Produces("text/html")
    public String firstMessage(
            @DefaultValue("powerOn") @QueryParam("name") String username)
    {
        return "<html><body><b> Hello, " + username + "! This is a simple RESTful web service!</b></body></html>";
    }
}


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

Ссылки на ресурсы используемые при написании статьи:
Jersey Home - домашняя страница проекта Jersey.
RESTful Web Services - обзор RESTful веб-сервисов на java.sun.com.
JSR 311: JAX-RS: The JavaTM API for RESTful Web Services - спецификация JAX-RS 1.0.
RESTful Web Services Developer's Guide - руководство разработчика.


Это сообщение отредактировал(а) powerOn - 6.1.2009, 22:36


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Foror
Дата 6.1.2009, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 14.2.2004

Репутация: 1
Всего: 2



Почему-то кажется это всё лишнее и не нужное... Хотя может это и важно для разработчиков RESTful сервисов, у меня как-то не было в этом опыта.
--------------------
Разработка веб-сайтов и создание интернет магазина
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0782 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.