проблема POSTing android JSONObject для PHP - PullRequest
3 голосов
/ 02 марта 2011

У меня проблемы с получением Android POST простого 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, если вам нравится:

<code><?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 '
';умереть;?>

Ответы [ 3 ]

8 голосов
/ 02 марта 2011

Из того, что я вижу, 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');
4 голосов
/ 03 марта 2011

Большое спасибо Джеффу Паркеру и Саураву за то, что они определили проблему: 1) установить пару имя / значение на стороне андроида или 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");
        }
    }
}
4 голосов
/ 02 марта 2011

Вы публикуете строку 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'];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...