Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using HttpClient and HttpPost in Android with post parameters

I'm writing code for an Android application that is supposed to take data, package it as Json and post it to a web server, that in turn is supposed to respond with json.

Using a GET request works fine, but for some reason using POST all data seems to get stripped and the server does not receive anything.

Here's a snippet of the code:

HttpParams params = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(params, 5000); HttpConnectionParams.setSoTimeout(params, 5000);         DefaultHttpClient httpClient = new DefaultHttpClient(params); BasicCookieStore cookieStore = new BasicCookieStore(); httpClient.setCookieStore(cookieStore);  String uri = JSON_ADDRESS; String result = ""; String username = "user"; String apikey = "something"; String contentType = "application/json";  JSONObject jsonObj = new JSONObject();  try {     jsonObj.put("username", username);     jsonObj.put("apikey", apikey); } catch (JSONException e) {     Log.e(TAG, "JSONException: " + e); }  HttpPost httpPost = new HttpPost(uri); List<NameValuePair> postParams = new ArrayList<NameValuePair>(); postParams.add(new BasicNameValuePair("json", jsonObj.toString())); HttpGet httpGet = null; try {     UrlEncodedFormEntity entity = new UrlEncodedFormEntity(postParams);     entity.setContentEncoding(HTTP.UTF_8);     entity.setContentType("application/json");     httpPost.setEntity(entity);      httpPost.setHeader("Content-Type", contentType);     httpPost.setHeader("Accept", contentType); } catch (UnsupportedEncodingException e) {     Log.e(TAG, "UnsupportedEncodingException: " + e); }  try {     HttpResponse httpResponse = httpClient.execute(httpPost);     HttpEntity httpEntity = httpResponse.getEntity();      if (httpEntity != null) {         InputStream is = httpEntity.getContent();         result = StringUtils.convertStreamToString(is);         Log.i(TAG, "Result: " + result);     } } catch (ClientProtocolException e) {     Log.e(TAG, "ClientProtocolException: " + e); } catch (IOException e) {     Log.e(TAG, "IOException: " + e); }  return result; 

I think I have followed the general guidelines on how to create the parameters and post them, but apparently not.

Any help or pointers to where I can find a solution, are very welcome at this point (after spending a few hours realizing no post data was ever sent). The real server is running Wicket on Tomcat, but I've also tested it out on a simple PHP page, with no difference.

like image 870
Patrick Avatar asked May 17 '11 09:05

Patrick


2 Answers

You can actually send it as JSON the following way:

// Build the JSON object to pass parameters JSONObject jsonObj = new JSONObject(); jsonObj.put("username", username); jsonObj.put("apikey", apikey); // Create the POST object and add the parameters HttpPost httpPost = new HttpPost(url); StringEntity entity = new StringEntity(jsonObj.toString(), HTTP.UTF_8); entity.setContentType("application/json"); httpPost.setEntity(entity); HttpClient client = new DefaultHttpClient(); HttpResponse response = client.execute(httpPost); 
like image 128
Jaime Botero Avatar answered Sep 24 '22 12:09

Jaime Botero


have you tried doing it without the JSON object and just passed two basicnamevaluepairs? also, it might have something to do with your serversettings

Update: this is a piece of code I use:

InputStream is = null; ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();     nameValuePairs.add(new BasicNameValuePair("lastupdate", lastupdate));   try {         HttpClient httpclient = new DefaultHttpClient();         HttpPost httppost = new HttpPost(connection);         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));         HttpResponse response = httpclient.execute(httppost);         HttpEntity entity = response.getEntity();         is = entity.getContent();         Log.d("HTTP", "HTTP: OK");     } catch (Exception e) {         Log.e("HTTP", "Error in http connection " + e.toString());     } 
like image 22
Andreas Avatar answered Sep 21 '22 12:09

Andreas