Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android JSON HttpClient to send data to PHP server with HttpResponse

Tags:

I am currently trying to send some data from and Android application to a php server (both are controlled by me).

There is alot of data collected on a form in the app, this is written to the database. This all works.

In my main code, firstly I create a JSONObject (I have cut it down here for this example):

JSONObject j = new JSONObject(); j.put("engineer", "me"); j.put("date", "today"); j.put("fuel", "full"); j.put("car", "mine"); j.put("distance", "miles"); 

Next I pass the object over for sending, and receive the response:

String url = "http://www.server.com/thisfile.php"; HttpResponse re = HTTPPoster.doPost(url, j); String temp = EntityUtils.toString(re.getEntity()); if (temp.compareTo("SUCCESS")==0) {     Toast.makeText(this, "Sending complete!", Toast.LENGTH_LONG).show(); } 

The HTTPPoster class:

public static HttpResponse doPost(String url, JSONObject c) throws ClientProtocolException, IOException  {     HttpClient httpclient = new DefaultHttpClient();     HttpPost request = new HttpPost(url);     HttpEntity entity;     StringEntity s = new StringEntity(c.toString());     s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));     entity = s;     request.setEntity(entity);     HttpResponse response;     response = httpclient.execute(request);     return response; } 

This gets a response, but the server is returning a 403 - Forbidden response.

I have tried changing the doPost function a little (this is actually a little better, as I said I have alot to send, basically 3 of the same form with different data - so I create 3 JSONObjects, one for each form entry - the entries come from the DB instead of the static example I am using).

Firstly I changed the call over a bit:

String url = "http://www.myserver.com/ServiceMatalan.php"; Map<String, String> kvPairs = new HashMap<String, String>(); kvPairs.put("vehicle", j.toString()); // Normally I would pass two more JSONObjects..... HttpResponse re = HTTPPoster.doPost(url, kvPairs); String temp = EntityUtils.toString(re.getEntity()); if (temp.compareTo("SUCCESS")==0) {     Toast.makeText(this, "Sending complete!", Toast.LENGTH_LONG).show(); } 

Ok so the changes to the doPost function:

public static HttpResponse doPost(String url, Map<String, String> kvPairs) throws ClientProtocolException, IOException  {     HttpClient httpclient = new DefaultHttpClient();     HttpPost httppost = new HttpPost(url);     if (kvPairs != null && kvPairs.isEmpty() == false)      {         List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(kvPairs.size());         String k, v;         Iterator<String> itKeys = kvPairs.keySet().iterator();         while (itKeys.hasNext())          {             k = itKeys.next();             v = kvPairs.get(k);             nameValuePairs.add(new BasicNameValuePair(k, v));         }                      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));     }     HttpResponse response;     response = httpclient.execute(httppost);     return response; } 

Ok So this returns a response 200

int statusCode = re.getStatusLine().getStatusCode(); 

However the data received on the server cannot be parsed to a JSON string. It is badly formatted I think (this is the first time I have used JSON):

If in the php file I do an echo on $_POST['vehicle'] I get the following:

{\"date\":\"today\",\"engineer\":\"me\"} 

Can anyone tell me where I am going wrong, or if there is a better way to achieve what I am trying to do? Hopefully the above makes sense!

like image 624
Scoobler Avatar asked Mar 29 '10 19:03

Scoobler


2 Answers

After lots of reading and searching I have found the problem to be with, I beleive magic_quotes_gpc being enabled on the server.

Thus, using:

json_decode(stripslashes($_POST['vehicle'])); 

In my example above removes the slashes and allows the JSON to be decoded properly.

Still not sure why sending a StringEntity causes a 403 error?

like image 60
Scoobler Avatar answered Oct 13 '22 22:10

Scoobler


StringEntity s = new StringEntity(c.toString()); s.setContentEncoding("UTF-8"); s.setContentType("application/json"); request.setEntity(s); 
like image 33
user534737 Avatar answered Oct 13 '22 22:10

user534737