无法使用 androidannotations 发送 POST 参数
Trouble sending POST parameter with androidannotations
所以我尝试使用 androidannotations 从 Android 应用程序向我的 REST 服务器发送一个简单的字符串。
http://localhost:8080/TestServer_RESTJersey/api/lanceurs/parPays
使用高级 REST 客户端 chrome 扩展,我发送参数:
country=Europe
它工作正常。现在 Android 应用程序的问题是服务器收到了我的请求,但国家/地区参数始终为空。我的其他 GET 请求都运行良好。
这是我的 RestClient class :
@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);
}
在 JAX-RS 中,使用 @QueryParam 注释将 URI 查询参数注入 Java 方法。例如,@QueryParam("country") String countryName,
尝试下面的方法,我想它应该可以工作
@Post("/api/lanceurs/parPays")
public LaunchVehicleResponse countryRequest(@QueryParam("country") String country);
如 wiki 中所述,您可以这样发送表单参数:
@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);
好的,看来我想出了一个让自己摆脱困境的方法。
我在我的客户端上创建了一个 class LaunchVehicleRequest,其中包含(除其他外)国家字符串。当我需要向我的服务器发送请求时,我实例化此 class 并使用我想要的值初始化 LaunchVehicleRequest.country(例如:"USA")。然后我将整个对象发送到我的 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);
}
我在服务器端设置了相同的 class,它将请求作为字符串获取,然后将其转换为对象。
@Path("api/lanceurs/parPays")
@POST
public String getLanceurByCountry(String request)
{
// request={"country":"USA"}
//my json parsing function here
LaunchVehicleRequest lvreq = parseJsonToRequest(request);
...
}
我不知道这是不是最好的方法,但是嘿,它现在工作正常,我正在使用我的 LaunchVehicleRequest class 来满足我可能需要的每个不同的请求,所以这还不错我猜猜^^'
谢谢大家 ;)
所以我尝试使用 androidannotations 从 Android 应用程序向我的 REST 服务器发送一个简单的字符串。
http://localhost:8080/TestServer_RESTJersey/api/lanceurs/parPays
使用高级 REST 客户端 chrome 扩展,我发送参数:
country=Europe
它工作正常。现在 Android 应用程序的问题是服务器收到了我的请求,但国家/地区参数始终为空。我的其他 GET 请求都运行良好。
这是我的 RestClient class :
@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);
}
在 JAX-RS 中,使用 @QueryParam 注释将 URI 查询参数注入 Java 方法。例如,@QueryParam("country") String countryName, 尝试下面的方法,我想它应该可以工作
@Post("/api/lanceurs/parPays")
public LaunchVehicleResponse countryRequest(@QueryParam("country") String country);
如 wiki 中所述,您可以这样发送表单参数:
@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);
好的,看来我想出了一个让自己摆脱困境的方法。
我在我的客户端上创建了一个 class LaunchVehicleRequest,其中包含(除其他外)国家字符串。当我需要向我的服务器发送请求时,我实例化此 class 并使用我想要的值初始化 LaunchVehicleRequest.country(例如:"USA")。然后我将整个对象发送到我的 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);
}
我在服务器端设置了相同的 class,它将请求作为字符串获取,然后将其转换为对象。
@Path("api/lanceurs/parPays")
@POST
public String getLanceurByCountry(String request)
{
// request={"country":"USA"}
//my json parsing function here
LaunchVehicleRequest lvreq = parseJsonToRequest(request);
...
}
我不知道这是不是最好的方法,但是嘿,它现在工作正常,我正在使用我的 LaunchVehicleRequest class 来满足我可能需要的每个不同的请求,所以这还不错我猜猜^^'
谢谢大家 ;)