发送带有androidannotations的POST参数时出错

发送带有androidannotations的POST参数时出错,android,post,android-annotations,Android,Post,Android Annotations,所以我尝试使用androidannotations从Android应用程序向我的REST服务器发送一个简单的字符串 http://localhost:8080/TestServer_RESTJersey/api/lanceurs/parPays 使用高级REST客户端chrome扩展,我发送参数: country=Europe 它工作得很好。现在,Android应用程序的问题是,服务器接收到我的请求,但country参数始终为空。我的其他请求都工作得很好 这是我的RestClient类: @

所以我尝试使用androidannotations从Android应用程序向我的REST服务器发送一个简单的字符串

http://localhost:8080/TestServer_RESTJersey/api/lanceurs/parPays
使用高级REST客户端chrome扩展,我发送参数:

country=Europe
它工作得很好。现在,Android应用程序的问题是,服务器接收到我的请求,但country参数始终为空。我的其他请求都工作得很好

这是我的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);
    }
路径(“api/lanceurs/parPays”) @职位 公共字符串getLanceurByCountry(@FormParam(“国家”)字符串国家) { initData(); LaunchVehiclerResponse lvr=新的LaunchVehiclerResponse(); ArrayList allv=myDatabase.getDataByCountry(国家); lvr.setData(allv); 返回parseObjectToJson(lvr); }
在JAX-RS中,使用@QueryParam注释将URI查询参数注入Java方法。例如,@QueryParam(“country”)字符串countryName, 试试下面的方法,我想,它应该会起作用

    @Post("/api/lanceurs/parPays")
    public LaunchVehicleResponse countryRequest(@QueryParam("country") String country);
如上所述,您可以通过以下方式发送表单参数:

@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);
@Rest(rootUrl=”http://company.com/ajax/services,转换器={FormHttpMessageConverter.class,MappingJackson2HttpMessageConverter.class})
公共接口MyRestClient扩展了RestClientHeaders{
@RequiresHeader(HttpHeaders.CONTENT\u类型)
@邮政(“/api/lanceurs/parPays”)
公共启动车辆响应国家请求(多值地图数据);
}
多值映射数据=新的LinkedMultiValueMap();
数据集(“国家”、“欧洲”);
setHeader(HttpHeaders.CONTENT\u TYPE、MediaType.MULTIPART\u FORM\u DATA\u VALUE);
client.countryRequest(数据);

好吧,看来我找到了摆脱困境的办法

我在我的客户端上创建了一个类LaunchVehiclerRequest,其中包含(除其他外)国家/地区字符串。当我需要向服务器发送请求时,我实例化该类并使用我想要的值(例如:“USA”)初始化LaunchVehiclerRequest.country。然后我将整个对象发送到我的RestClient

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

我在服务器端设置了相同的类,该类将请求作为字符串获取,然后将其转换为对象

@Path("api/lanceurs/parPays")
@POST
public String getLanceurByCountry(String request)
{
    //  request={"country":"USA"}       
    //my json parsing function here
    LaunchVehicleRequest lvreq = parseJsonToRequest(request);
    ...
}
我不知道这是不是最好的方法,但现在它工作得很好,我正在使用我的LaunchVehiclerRequest类处理我可能需要的每一个不同的请求,所以我想没那么糟糕^ ^


无论如何,谢谢大家;)

顺便说一句,我知道欧洲不是一个国家,但这很正常=你敢说客户端或服务器端吗?如果我在服务器端这样做,它将不起作用,甚至会使我的高级REST扩展请求中断,就像Android应用程序一样。我在客户端使用Android说明,在se上使用JAX-RS无论如何,谢谢你的帮助;)是的,我以前尝试过类似的方法,但没有成功。首先我必须写下:public launchvehiclerresponse countryRequest(多值映射国家);而不仅仅是Map类,因为如果我不使用编译器,编译器会告诉我Map和MultiValueMap不兼容。无论如何,这并不能解决我的问题:\n请查看我在主帖子上的编辑以查看服务器端。谢谢!首先记录请求,它现在发送的是什么?无论如何,这段代码应该可以工作。请原谅我的初学者,我仍然在学习rning now;)我猜你想让我创建并实现一个拦截器。很遗憾,我无法让它工作…我在这里创建了日志类:在一个新文件中,并将其添加到@Rest注释中:拦截器={LoggingInterceptor.class},但我无法记录任何内容:(您已经有了一个服务器,您应该可以在那里记录请求。或者您可以通过Wireshark进行检查。好的,我可以记录服务器中传入的请求,这很好。当我从Advanced Rest Client发送请求时,服务器会得到以下信息:country=USA(并且可以正常工作)。当我从我的应用程序(使用时,它会得到:{“country”:[“Europe”]}(我认为“欧洲无论如何都不应该在一个数组中)。我想我在某个地方遇到了某种编码/解码问题。。。
@Path("api/lanceurs/parPays")
@POST
public String getLanceurByCountry(String request)
{
    //  request={"country":"USA"}       
    //my json parsing function here
    LaunchVehicleRequest lvreq = parseJsonToRequest(request);
    ...
}