Проблема с отправкой параметра POST с помощью androidannotations

поэтому я пытаюсь отправить простую строку на свой сервер REST из приложения Android, используя androidannotations.

http://localhost:8080/TestServer_RESTJersey/api/lanceurs/parPays

Используя расширенное расширение Chrome для клиента REST, я отправляю параметр:

country=Europe

и это работает нормально. Теперь моя проблема с приложением для Android заключается в том, что мой запрос получен сервером, но параметр страны всегда равен нулю. Мои другие запросы GET работают отлично.

Вот мой класс RestClient:

@Rest(converters = {MappingJacksonHttpMessageConverter.class, FormHttpMessageConverter.class})
    public interface RestClient extends RestClientRootUrl, RestClientSupport{

        @Get("/poke/simple")
        public MessageResponse simplePoke();

        @Get("/api/lanceurs/{name}")
        public LaunchVehicleResponse nameRequest(String name);

        //server doesn't get the parameter here...
        @Post("/api/lanceurs/parPays")
        public LaunchVehicleResponse countryRequest(String country);        
    }

Любая помощь будет оценена, как обычно, спасибо!

РЕДАКТИРОВАТЬ :

серверный REST API:

@Path("api/lanceurs/parPays")
    @POST
    public String getLanceurByCountry(@FormParam("country") String country)
    {
        initData();
        LaunchVehicleResponse lvr = new LaunchVehicleResponse();
        ArrayList<LaunchVehicle> allv = myDatabase.getDataByCountry(country);
        lvr.setData(allv);
        return parseObjectToJson(lvr);
    }

person ToyToy    schedule 11.03.2016    source источник
comment
кстати, я знаю, что Европа - это не страна, но это нормально =D   -  person ToyToy    schedule 11.03.2016


Ответы (3)


В JAX-RS используйте аннотацию @QueryParam для ввода параметра запроса URI в метод Java. Например, @QueryParam("country") Строка countryName, попробуйте ниже, я думаю, это должно сработать

    @Post("/api/lanceurs/parPays")
    public LaunchVehicleResponse countryRequest(@QueryParam("country") String country);
person Rajasekar Kalisamy    schedule 11.03.2016
comment
Вы говорите о клиентской или серверной части? Если я сделаю это на стороне сервера, это не сработает и даже приведет к тому, что мои расширенные запросы на расширение REST будут нарушены, как и приложение для Android. Я использую androidannotations на клиенте и JAX-RS на своем сервере. Все равно спасибо за помощь ;) - person ToyToy; 11.03.2016

Ладно, кажется, я нашел способ выбраться из этого беспорядка.

Я создал класс LaunchVehicleRequest на своем клиенте, содержащий (среди прочего) строку страны. Когда мне нужно отправить запрос на мой сервер, я создаю экземпляр этого класса и инициализирую LaunchVehicleRequest.country нужным мне значением (например, «США»). Затем я отправляю весь объект в свой RestClient.

LaunchVehicleRequest lvreq = new LaunchVehicleRequest();
lvreq.setCountry("Europe");
LaunchVehicleResponse lvr = pm.countryRequest(lvreq);

...

    @Rest(converters = {MappingJacksonHttpMessageConverter.class, FormHttpMessageConverter.class}, interceptors = { LoggingInterceptor.class } )
    public interface RestClient extends RestClientRootUrl, RestClientSupport, RestClientHeaders{
        @Post("/api/lanceurs/parPays")
        public LaunchVehicleResponse countryRequest(LaunchVehicleRequest request);
}

Я настроил тот же класс на стороне сервера, который получает запрос в виде строки, а затем преобразует его в объект.

@Path("api/lanceurs/parPays")
@POST
public String getLanceurByCountry(String request)
{
    //  request={"country":"USA"}       
    //my json parsing function here
    LaunchVehicleRequest lvreq = parseJsonToRequest(request);
    ...
}

Я не знаю, лучший ли это способ, но теперь он работает нормально, и я использую свой класс LaunchVehicleRequest для каждого другого запроса, который мне может понадобиться, так что это не так уж плохо, я думаю ^^'

Все равно всем спасибо ;)

person ToyToy    schedule 14.03.2016

Как объясняется в вики, вы можете отправлять параметры формы следующим образом:

@Rest(rootUrl = "http://company.com/ajax/services", converters = { FormHttpMessageConverter.class, MappingJackson2HttpMessageConverter.class })
public interface MyRestClient extends RestClientHeaders {

    @RequiresHeader(HttpHeaders.CONTENT_TYPE)
    @Post("/api/lanceurs/parPays")
    public LaunchVehicleResponse countryRequest(MultiValueMap<String, Object> data);  

}

MultiValueMap<String, Object> data = new LinkedMultiValueMap<>();
data.set("country, "Europe");

client.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE);


client.countryRequest(data);
person WonderCsabo    schedule 11.03.2016
comment
Да, я пробовал что-то подобное раньше, но не получилось. Сначала я должен написать это: public LaunchVehicleResponse countryRequest(MultiValueMap‹String, Object› country); вместо просто класса Map, потому что, если я не компилятор говорит мне, что Map и MultiValueMap несовместимы. В любом случае, это не решает мою проблему: \ Пожалуйста, посмотрите мое редактирование в основном сообщении, чтобы увидеть серверную часть. Спасибо ! - person ToyToy; 11.03.2016
comment
Сначала зарегистрируйте запрос, что он отправляет сейчас? В любом случае, этот фрагмент должен работать. - person WonderCsabo; 11.03.2016
comment
Во-первых, извините меня за мой новичок, я все еще учусь прямо сейчас;) Я думаю, вы хотите, чтобы я создал и реализовал перехватчик. К сожалению, я не могу заставить это работать... Я сделал свой класс ведения журнала, как здесь: stackoverflow.com/questions/24493615/ В новом файле и добавьте это в мою аннотацию @Rest: interceptors = {LoggingInterceptor.class}, но я не могу ничего регистрировать: ( - person ToyToy; 14.03.2016
comment
У вас уже есть сервер, вы должны иметь возможность регистрировать запросы там. Или вы можете просто проверить это с помощью Wireshark. - person WonderCsabo; 14.03.2016
comment
Хорошо, я смог зарегистрировать запросы, входящие на сервер, это хорошо. Когда я отправляю запрос от Advanced Rest Client, сервер получает следующее: country=USA (и это работает). Когда я делаю это из своего приложения (с помощью , он получает следующее: {country:[Europe]} (я думаю, что Европа все равно не должна быть в массиве). Думаю, у меня где-то есть проблема с кодировкой/декодированием.. . - person ToyToy; 14.03.2016