Post / Put / Delete http Json с дополнительными параметрами в Джерси + общие проблемы дизайна - PullRequest
3 голосов
/ 15 сентября 2011

По какой-то причине я не нашел нормального способа сделать следующее:

Я хочу опубликовать объект json и добавить дополнительные параметры к вызову (в данном случае, токен аутентификации). Это простой RESTful-сервер в myUrl / server, который должен предоставлять доступ к различным ресурсам «person» в URL-адресе myUrl / server / person / personCode / resourceName.

GET прост и не требует никаких объектов, только параметры. Проблема возникает, когда я попадаю в POST - как мне присоединить JSON, а также сохранить другие параметры?

Класс (многое было удалено для ясности и из соображений собственности ...):

//Handles the person's resources
@Path("/person/{personCode}/{resourceName}")
public class PersonResourceProvider {

@GET
@Produces("application/json")
public String getPersonResource(@PathParam("personCode") String personCode, @PathParam("resourceName") String resourceName, @DefaultValue("") @QueryParam("auth_token") String auth_token) throws UnhandledResourceException, UnauthorizedAccessException {

    //Authenticates the user in some way, throwing an exception when needed...
    authenticate(personCode, auth_token, resourceName);

    //Returns the resource somehow...
}

@POST
@Produces("application/json")
public String postPersonResource(@PathParam("personCode") String personCode, @PathParam("resourceName") String resourceName, @DefaultValue("") @QueryParam("resourceData") String resourceData, @DefaultValue("") @QueryParam("auth_token") String auth_token) throws UnhandledResourceException, UnauthorizedAccessException {

    //Again, authenticating
    authenticate(personCode, auth_token, resourceName);

    //Post the given resource
    }
}

Теперь метод GET работает отлично, когда вы идете в myUrl / person / personCode / resourceName, это дает мне правильный ресурс. Auth_token используется при каждом отдельном обращении к серверу (на данный момент аутентификация выполняется путем сравнения с предварительно определенной строкой), поэтому это необходимо. Все остальные параметры предоставляются через путь, за исключением токена аутентификации, который не должен находиться в пути, поскольку он не относится к идентификатору требуемого ресурса.

Когда я добираюсь до POST, это проблема. Я знаю, что есть способ сообщить методу, что он использует JSON, но в таком случае, что произойдет с другими параметрами (один из них - auth_token)? Должен ли я использовать Multipart?

Еще один связанный с этим вопрос, это первый раз, когда я проектировал такой сервер, правильный ли это дизайн?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 17 сентября 2011

Я не уверен, что понимаю, чего вы пытаетесь достичь. Позвольте мне объяснить несколько вещей - надеюсь, это будет иметь отношение к вашему вопросу @QueryParam внедряет параметры, которые являются частью вашего пути - то есть часть URL, которая идет после «?». Например. если у вас есть такой URL: http://yourserver.com/person/personCode/resourceName?resourceData=abc&token=1234

Тогда будет 2 параметра запроса - один с именем resourceData со значением «abc», а другой с именем token со значением «1234».

Если вы передаете сущность в запросе POST, и эта сущность имеет тип application / json, вы можете просто аннотировать ваш метод post с помощью аннотации @Consumes ("application / json") и добавить другой параметр в ваш метод, который не нужно аннотировать вообще. Этот параметр может быть либо String (в этом случае Jersey будет передавать необработанную строку JSON, и вам придется анализировать ее самостоятельно), либо это может быть Java-бин, аннотированный аннотацией @XmlRootElement - в этом случае (если вы также включаете jersey- модуль json на вашем пути к классам) Джерси попытается демонтировать строку json в этот объект, используя JAXB. Для этого вы также можете использовать библиотеки Jackson или Jettison - для получения дополнительной информации см. Этот раздел Руководства пользователя Джерси: http://jersey.java.net/nonav/documentation/latest/json.html

3 голосов
/ 20 сентября 2011

Найдено!

На стороне клиента:

Client c = Client.create();
WebResource service = c.resource("www.yourserver.com/");
String s = service.path("test/personCode/resourceName")
                .queryParam("auth_token", "auth")
                .type("text/plain")
                .post(String.class, jsonString);

На стороне сервера:

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;

@Path("/test/{personCode}/{resourceName}")
public class TestResourceProvider {

@POST
@Consumes("text/plain")
@Produces("application/json")
public String postUserResource(String jsonString,                                              
                               @PathParam("personCode") String personCode,                                                                                      
                               @PathParam("resourceName") String resourceName,                                                   
                               @QueryParam("auth_token") String auth_token)                                                  
                               throws UnhandledResourceException {

    //Do whatever...    

    }
}

В моем случае я буду анализировать json, полученный на сервере, в зависимости отв имени ресурса, но вы также можете передать сам объект и заставить сервер использовать «application / json».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...