Android JSON HttpClient do wysyłania danych do serwera PHP za pomocą HttpResponse

Obecnie Próbuję wysłać dane z aplikacji i Androida na serwer php (oba są kontrolowane przeze mnie).

W formularzu w aplikacji jest dużo danych, które są zapisywane do bazy danych. To wszystko działa.

W moim kodzie głównym najpierw tworzę jsonobject (wyciąłem go tutaj dla tego przykładu):

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

Następnie przekazuję obiekt do wysłania i otrzymuję odpowiedź:

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

Klasa HTTPPoster:

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 odpowiedź, ale serwer zwraca 403-zakazaną odpowiedź.

Próbowałem trochę zmienić funkcję doPost (jest to właściwie trochę lepsze, jak powiedziałem, mam dużo do wysłania, w zasadzie 3 tego samego formularza z różnymi danymi - więc tworzę 3 JSONObjects, po jednym dla każdego wpisu formularza - wpisy pochodzą z DB zamiast statycznego przykładu, którego używam).

Najpierw zmieniłem trochę połączenie:

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 więc zmiany w doPost funkcja:

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 więc to zwraca odpowiedź 200

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

Jednak dane otrzymane na serwerze nie mogą być parsowane do ciągu JSON. Wydaje mi się, że jest źle sformatowany (pierwszy raz używam JSON):

Jeśli w pliku php wykonam echo na $_POST['vehicle'] dostaję następujące:

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

Czy ktoś może mi powiedzieć, gdzie idę źle, lub czy jest lepszy sposób, aby osiągnąć to, co staram się zrobić? Mam nadzieję, że powyższe ma sens!

Author: Scoobler, 2010-03-29

5 answers

Po wielu czytaniach i poszukiwaniach znalazłem problem z, i belei magic_quotes_gpc jest włączony na serwerze.

Tak więc, używając:

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

W moim przykładzie powyżej usuwa ukośniki i umożliwia prawidłowe dekodowanie JSON.

Nadal nie wiesz, dlaczego wysłanie StringEntity powoduje błąd 403?

 11
Author: Scoobler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-29 22:38:31
StringEntity s = new StringEntity(c.toString());
s.setContentEncoding("UTF-8");
s.setContentType("application/json");
request.setEntity(s);
 4
Author: user534737,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-09 12:09:31

Wypróbuj ten kod to działa dla mnie

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) {
}

}

 1
Author: Sachin Gurnani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-22 06:35:58

Zmień

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

Do

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

Znak zapytania na końcu jest niezbędny, gdy próbujesz wysłać parametry do skryptu php.

 0
Author: Sergey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-20 21:27:11

Wypróbuj ten kod działa idealnie

*For HttpClient class* download jar file "httpclient-4.3.6.jar" and put in libs folder then
Compile:   dependencies {compile files('libs/httpclient-4.3.6.jar')}

repositories {
        maven {
            url "https://jitpack.io"
        }
    }

następnie wywołaj klasę HttpClient AsyncTask w następujący sposób:

Klasa prywatna YourTask rozszerza AsyncTask { private String error_msg = " błąd serwera!";

    private JSONObject response;



    @Override
    protected Boolean doInBackground(String... params) {
        try {
            JSONObject mJsonObject = new JSONObject();
            mJsonObject.put("user_id", "user name");
            mJsonObject.put("password", "123456");
            String URL=" Your Link"

            //Log.e("Send Obj:", mJsonObject.toString());

            response = HttpClient.SendHttpPost(URL, mJsonObject);
            boolean status = response != null && response.getInt("is_error") == 0; // response

            return status;
        } catch (JSONException | NullPointerException e) {
            e.printStackTrace();
            mDialog.dismiss();
            return false;
        }
    }

    @Override
    protected void onPostExecute(Boolean status) {
       // your code

    }
}
 0
Author: Nur Gazi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-04 13:14:59