Проблема POSTing android JSONObject для PHP

У меня возникли проблемы с получением POST-файла Android от простого JSONObject, который будет отображаться в данных $ _POST на сервере. Сервер PHP 5.3.4, а сторона android – это эмулятор SDK 8. Я могу опубликовать простой NameValuePair как обычно, и он появляется, но когда я переключаюсь на JSONObject + StringEntity, который вы видите ниже, массив $ _POST показывает {}. Идем дальше и выполняем код ниже на моей тестовой php-странице. Он имеет var_dump $ _POST и $ _SERVER, а также ищет один из ожидаемых ключей («электронная почта»). Вы увидите, что я попробовал множество «ContentType», чтобы узнать, была ли эта проблема. Я даже использовал WireShark, чтобы проверить, что TCP-разговор выглядит хорошо между клиентом и сервером. Данные POST находятся там, но они не отображаются в варах сервера. Я застрял … спасибо за любую помощь, которую вы можете предложить.

import java.io.InputStream; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.HttpConnectionParams; import org.json.JSONObject; import android.util.Log; public class TestPOST { protected static void sendJson (final String email, final String pwd) { HttpClient client = new DefaultHttpClient(); HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit HttpResponse response; String URL = "http://web-billings.com/testPost.php"; try{ HttpPost post = new HttpPost(URL); // NameValuePair That is working fine... //List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); //nameValuePairs.add(new BasicNameValuePair("email", email)); //nameValuePairs.add(new BasicNameValuePair("password", pwd)); //post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); //Log.i("main", "P2DB - String entity 'se' = "+nameValuePairs.toString()); JSONObject jObject = new JSONObject(); jObject.put("email", email); jObject.put("password", pwd); StringEntity se = new StringEntity(jObject.toString()); //se.setContentType("charset=UTF-8"); se.setContentType("application/json;charset=UTF-8"); //se.setContentType("application/json"); //se.setContentType("application/x-www-form-urlencoded"); post.setEntity(se); Log.i("main", "TestPOST - String entity 'se' = "+GetInvoices.convertStreamToString(se.getContent())); response = client.execute(post); /*Checking response */ if(response!=null){ InputStream in = response.getEntity().getContent(); //Get the data in the entity String message = GetInvoices.convertStreamToString(in); Log.i("main", "P2DB - Connect response = "+message); } } catch(Exception e){ e.printStackTrace(); //createDialog("Error", "Cannot Establish Connection"); } } } 

Вот страница testPost.php, если хотите:

 <?php echo "\r\n<pre>\r\n"; var_dump("\$_POST = ", $_POST)."\r\n"; echo '$_POST[\'email\'] = '.$_POST['email']."\r\n"; var_dump("\$_SERVER = ", $_SERVER)."\r\n"; echo '</pre>'; die; ?> 

Из того, что я вижу, HttpPost.setEntity устанавливает тело запроса без каких-либо пар имен / значений, а также только исходные данные. $ _POST не ищет необработанные данные, а просто пары значений имени, которые он преобразует в хэш-таблицу / массив. У вас есть два варианта: либо обрабатывать исходные данные, либо отформатировать запрос таким образом, чтобы он включал пары значений имени.

Android / Java, пример пары имен:

 HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://web-billings.com/testPost.php"); List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); nameValuePairs.add(new BasicNameValuePair("jsondata", se)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

Доступ к исходным данным в PHP:

 $json = file_get_contents('php://input'); 

Вы отправляете строку json как одно большое значение переменной post. Таким образом, вам нужно будет захватить строку json на сервере и преобразовать ее в объект, прежде чем вы сможете получить доступ к данным в json из PHP.

 $jsonString = file_get_contents('php://input'); $jsonObj = json_decode($jsonString, true); if( !empty($jsonObj)) { try { $email = $jsonObj['email']; $password = $jsonObj['password']; } } 

Большое спасибо Джеффу Паркеру и Саураву за то, что он идентифицировал проблему: 1) установить пару имя / значение на стороне Android, или 2) проанализировать исходный ввод на стороне PHP. Из-за их совета здесь стоит гораздо более чистая и работающая версия исходного кода. Я перехожу в JSONObject в эту отварную копию, потому что это то, что я делаю в своем реальном коде, и есть много вещей, которые нужно сделать, чтобы сделать это действительно достойным моря, но это основные рабочие части:

 public class TestPOST2 { protected static void sendJson (final JSONObject json) { HttpClient client = new DefaultHttpClient(); HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit HttpResponse response; String URL = "http://web-billings.com/testPost.php"; try{ HttpPost post = new HttpPost(URL); // Create a NameValuePair out of the JSONObject + a name List<NameValuePair> nVP = new ArrayList<NameValuePair>(2); nVP.add(new BasicNameValuePair("json", json.toString())); // Hand the NVP to the POST post.setEntity(new UrlEncodedFormEntity(nVP)); Log.i("main", "TestPOST - nVP = "+nVP.toString()); // Collect the response response = client.execute(post); /*Checking response */ if(response!=null){ InputStream in = response.getEntity().getContent(); //Get the data in the entity } } catch(Exception e){ e.printStackTrace(); //createDialog("Error", "Cannot Establish Connection"); } } } 
Intereting Posts
Android: Как выровнять кнопку до нижней и над клавиатурой, когда она поднята? Высота half fill_parent xml Сделать два текстовых вида в относительной компоновке занимают 50% высоты Executor Singleton не запускается после обновления Android-студии Android Notification – Показать полное сообщение Мультиплексирование ListView AsyncHttpRequest POST не запускает обратные вызовы (android-async-http by loopj) Как запросить таблицу внешнего контента FTS4, но возвращать дополнительные столбцы из таблицы исходного контента Статические данные, сохраненные внутри singleton, иногда имеют значение null при возврате в приложение из фона Могу ли я выполнять математические операции над размерами и переменными? Android TableRow RelativeLayout Issue Запуск приложения Android с ошибками студии Android: фатальный сигнал 13 Код SIGPIPE -6 Как оживить смену менеджера компоновки просмотра ресайклера Проблемы, устанавливающие программно приложение с разрешением INSTALL_PACKAGES от / system / app Вызов триггера касания на iOS / android