Android JSON HttpClient ile PHP sunucusuna veri göndermek için HttpResponse

3 Cevap php

Ben şu anda gelen ve Android uygulama bir php sunucusu (ikisi de benim tarafından kontrol edilir) için bazı veri göndermeye çalışıyorum.

App bir formda toplanan verilerin çok şey var, bu veritabanına yazılır. Bu, tüm işleri.

Benim ana kodda, öncelikle ben (bu örneğin burada aşağı kestik) bir JSONObject oluşturun:

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

Sonraki Ben göndermek için nesne üzerinden geçmek ve yanıtı alırsınız:

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

HTTPPoster sınıfı:

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

Bu bir tepki alır, ama sunucu 403 dönen - Yasak yanıtı.

Ben doPost işlevini biraz değiştirerek denedim (ben farklı veri ile aynı formda temelde 3, göndermek için bir çok var dediğim gibi bu, aslında biraz daha iyi - yani 3 JSONObjects, her bir form giriş için bir tane oluşturun - girişleri I) kullanıyorum DB yerine statik örnek geliyor.

Öncelikle ben biraz üzerinde arama değişti:

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 doPost işlevine kadar değişir:

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

Tamam Yani bu bir yanıt verir 200

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

Ancak sunucu üzerinde alınan veriler JSON dizeye çözümlenen olamaz. Bu kötü Ben (bu JSON kullanmış ilk kez) düşünüyorum biçimlendirilir:

Php dosyasında I $ _POST ['araç'] üzerinde bir yankı yaparsanız ben şu olsun:

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

Herkes yanlış gidiyorum söyle, ya da ben ne çalışıyorum başarmak için daha iyi bir yolu olup olmadığını? Can Umarım yukarıdaki mantıklı!

3 Cevap

Okuma ve arama çok sonra ben birlikte olmak için sorunu bulduk, ben sunucu üzerinde etkin olan magic_quotes_gpc inanıyorum.

Bu nedenle, kullanılarak:

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

Benim örnekte yukarıda eğik kaldırır ve JSON deşifre sağlar.

Hala emin neden bir StringEntity bir 403 hata neden göndermiyor?

Benim için çalışıyor bu kodu deneyin

public void postData(String result,JSONObject obj) {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpParams myParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(myParams, 10000);
HttpConnectionParams.setSoTimeout(myParams, 10000);

String json=obj.toString();

try {

    HttpPost httppost = new HttpPost(result.toString());
    httppost.setHeader("Content-type", "application/json");

    StringEntity se = new StringEntity(obj.toString()); 
    se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
    httppost.setEntity(se); 

    HttpResponse response = httpclient.execute(httppost);
    String temp = EntityUtils.toString(response.getEntity());
    Log.i("tag", temp);


} catch (ClientProtocolException e) {

} catch (IOException e) {
}

}

Değişim

(String url = "http://www.server.com/MainPage.php";)

karşı

(String url = "http://www.server.com/MainPage.php?";)

Question mark at the end is necessary when you're trying karşı send parameters karşı php script.