Android + JSON + REST

0

Cześć!
Piszę, bo nie mogę już dosyć długo poradzić sobie z następującym problemem.
Zdefiniowałem sobie serwis (który umieściłem na JBoss-ie - ale to chyba nie ma większego znaczenia) z następujacymi metodami metodami

	@GET
	@Produces(MediaType.APPLICATION_JSON)
	@Path("/sale_production2/{id}/{from}/{to}")
	public List<SaleProductionRes> metoda(
			@PathParam("id") PathSegment id,
			@PathParam("from") PathSegment from, @PathParam("to") PathSegment to) {
		......
	}

oraz

 
	@POST
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	@Path("/sale_production")
	public List<SaleProductionRes> metoda2(
			@PathParam("id") PathSegment id,
			@PathParam("from") PathSegment from, @PathParam("to") PathSegment to) {
		....
	}

obie metody mają takie same wnętrza. Jak widać powyżej różnią się nazwą i adnotacjami (No i tutaj upatruje źródło problemu). Metoda "GET" daje zadowalające efekty i po zapytaniu w przeglądarce zwraca fajnego JSON-a - czy li jest dobra.
Przykład:
http://adres_ip:8080/nazwa_aplikacji/xxx/sale_production2/2/2012-09-25T00:00:00Z/2012-09-26T00:00:00Z
zwraca poprawny rezultat

Po stronie androida, aby wywoływać metodę post-ową stworzyłem coś takiego

	public static String makeRequest(String path, Map<String, String> params)
			throws Exception {
		DefaultHttpClient httpclient = new DefaultHttpClient();
		HttpPost httpost = new HttpPost(path);
		JSONObject obj = new JSONObject();
		setObj(obj, params);
		StringEntity se = new StringEntity(obj.toString());

		httpost.setEntity(se);
		httpost.setHeader("Accept", "application/json");
		httpost.setHeader("Content-type", "application/json");

		return httpclient.execute(httpost, new BasicResponseHandler());
	}

	private static void setObj(JSONObject object, Map<String, String> map)
			throws UnsupportedEncodingException, JSONException {
		for (String key : map.keySet()) {
			object.put(key, map.get(key));
		}
	}

 

Metodę post staram się wywołać uruchamiając makeRequest z parametrami path="http://adres_ip:8080/nazwa_aplikacji/xxx/sale_production/" oraz mapą
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("id", "2");
parameters.put("from", "2012-09-25T0000Z");
parameters.put("to", "2012-09-26T0000Z");

W rezultacie dostaję exception:
09-25 1625.249: W/System.err(1168): org.apache.http.client.HttpResponseException: Internal Server Error
09-25 1625.269: W/System.err(1168): at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:71)
09-25 1625.269: W/System.err(1168): at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:59)
09-25 1625.279: W/System.err(1168): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:657)
09-25 1625.279: W/System.err(1168): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:627)
09-25 1625.289: W/System.err(1168): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:616)

Dodam, że mam jeszcze inną metodę POST-ową (ale już bezparametrową), która wykonuje się za pomocą powyższego kodu poprawnie i zwraca zadowalające wyniki. Oto ona

	@POST
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	@Path("/res")
	public List<Res> getRes() {
		.....
	}
 

Pytanie wobec tego takie. Co zrobić, aby poprawnie wywołać metodę POST-ową z parametrami (a może implementacja metody jest niepoprawna?). Dodam, że przejrzałem już wiele postów na różnych forach i żaden nie rozwiązuje mojego problemu.Co przeoczyłem? Co zrobiłem źle?
dziękuję

1
public List<SaleProductionRes> metoda2(@PathParam("id") PathSegment id...)

Pewnyś Ty tego typu PathSegment i PathParam? Ja to ze wsi jestem - zawsze dawałem w RESTowych serwisach już konkretne typy (z naciskiem na String) zamiast takich dowcipów ;) A adnotacja... nie przypadkiem @FormParam("id") ? No co, jak co, ale na pewno te argumenty w wywołaniu POSTowym fragmentem path nie są ;)

0
Ranides napisał(a):
public List<SaleProductionRes> metoda2(@PathParam("id") PathSegment id...)

Pewnyś Ty tego typu PathSegment i PathParam? Ja to ze wsi jestem - zawsze dawałem w RESTowych serwisach już konkretne typy (z naciskiem na String) zamiast takich dowcipów ;) A adnotacja... nie przypadkiem @FormParam("id") ? No co, jak co, ale na pewno te argumenty w wywołaniu POSTowym fragmentem path nie są ;)

Dzięki za zainteresowanie. @FormParam też odpada, sprawdzałem.... ale jeszcze troszke pogooglałem i jest inne rozwiązanie, która zwraca mi json-y.
oto ono

 
	@POST
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	@Path("/sale_production")
	public List<SaleProductionRes> metoda2(JSONObject json) {
		String id = (String) json.get("id");
		String to = (String) json.get("to");
		String from = (String) json.get("from");
		......
	}

Kod java po stronie androida zostaje taki sam. BTW... nie wiem czy jest to najlepsze rozwiązanie, ale działa.
Jeszcze raz dzięki za zainteresowanie
pzdr

0

Parametr tej metody to niekoniecznie musi być JSONObject. Możesz użyć dowolnej encji i przesłany JSON zostanie na nią automatycznie zmapowany, oszczędzisz sobie przynajmniej rzutowania.

0

słusznie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1