Android JSON HttpClient для отправки данных на сервер PHP с помощью HttpResponse

В настоящее время я пытаюсь отправить некоторые данные и приложения Android на php-сервер (оба меня контролируют).

Существует много данных, собранных в форме в приложении, это записывается в базу данных. Все это работает.

В моем основном коде, во-первых, я создаю JSONObject (здесь я остановился здесь для этого примера):

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

Затем я передаю объект для отправки и получаю ответ:

 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:

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

Это получает ответ, но сервер возвращает 403 – Запрещенный ответ.

Я попытался немного изменить функцию doPost (это на самом деле немного лучше, так как я сказал, что мне нужно отправить, в основном 3 одной и той же формы с разными данными, поэтому я создаю 3 JSONObjects, по одному для каждой записи формы – записи из базы данных вместо статического примера, который я использую).

Во-первых, я немного изменил вызов:

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

Итак, изменения в функции doPost:

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

Итак, это возвращает ответ 200

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

Однако данные, полученные на сервере, не могут быть проанализированы в строке JSON. Я плохо отформатирован, я думаю (это первый раз, когда я использовал JSON):

Если в файле php я делаю эхо на $ _POST ['vehicle'], я получаю следующее:

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

Может ли кто-нибудь сказать мне, где я ошибаюсь, или если есть лучший способ достичь того, что я пытаюсь сделать? Надеюсь, что это имеет смысл!

После многих чтений и поиска я обнаружил, что проблема связана, я верю, что magic_quotes_gpc включен на сервере.

Таким образом, используя:

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

В моем примере выше удаляются косые черты и позволяет правильно декодировать JSON.

Все еще не знаете, почему отправка StringEntity вызывает ошибку 403?

 StringEntity s = new StringEntity(c.toString()); s.setContentEncoding("UTF-8"); s.setContentType("application/json"); request.setEntity(s); 

Попробуйте этот код, он работает для меня

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

}

+ Изменить

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

в

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

Вопросительный знак в конце необходим, когда вы пытаетесь отправить параметры в php-скрипт.

Попробуйте этот код, он отлично работает

 *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" } }