Android JSON HttpClient zum Senden von Daten an den PHP-Server mit HttpResponse

Ich versuche gerade, Daten von und von einer Android-Anwendung an einen PHP-Server zu senden (beide werden von mir gesteuert).

In der App werden viele Daten auf einem Formular gesammelt, diese werden in die Datenbank geschrieben. Das alles funktioniert.

In meinem Hauptcode erstens erstelle ich ein JSONObject (ich habe es hier für dieses Beispiel abgeschnitten):

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

Als nächstes übergebe ich das Objekt zum Senden und erhalte die Antwort:

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();
}

Die HTTPPoster-Klasse:

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;
}

Dies wird beantwortet, aber der Server gibt eine Antwort 403 - Verboten zurück.

Ich habe versucht, die doPost-Funktion ein wenig zu ändern (das ist eigentlich ein bisschen besser, wie ich sagte, ich muss viel senden, im Grunde 3 des gleichen Formulars mit unterschiedlichen Daten - also erstelle ich 3 JSONObjects, eines für jeden Formulareintrag - die Einträge kommen aus der DB anstelle des statischen Beispiels, das ich benutze).

Zuerst habe ich den Anruf ein wenig geändert:

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 also die Änderungen an der doPost Funktion:

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 Das ergibt also eine Antwort 200

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

Die auf dem Server empfangenen Daten können jedoch nicht in eine JSON-Zeichenfolge analysiert werden. Ich denke, es ist schlecht formatiert (dies ist das erste Mal, dass ich JSON verwende):

Wenn ich in der PHP-Datei ein Echo auf $ _POST ['vehicle'] mache, erhalte ich Folgendes:

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

Kann mir jemand sagen, wo ich falsch liege oder ob es einen besseren Weg gibt, das zu erreichen, was ich versuche? Hoffentlich ergibt das Sinn!

Antworten auf die Frage(5)

Ihre Antwort auf die Frage