Autore Topic: Inviare dati codificati, in POST a server PHP  (Letto 2095 volte)

Offline ilcapitano4

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC WildFire
  • Sistema operativo:
    Ubuntu 11.10
Inviare dati codificati, in POST a server PHP
« il: 15 Maggio 2012, 02:34:56 CEST »
0
Ciao!
Sto facendo qualche prova di comunicazione tra android e PHP, ma ho subito dei problemi!Sono ore che provo senza successo!

Semplicemente, voglio visualizzare sul browser quello che invio al server in locale su http://localhost/registrazione.php.

Premetto che ho installato LAMP e funziona, ho messo il file PHP in www, riesco a visualizzare le semplici echo,
ma non mi riesce proprio di visualizzare i dati che invio in POST, eppure ho seguito diversi tutorial ed esempi, ma niente! :-(

Posto un pò di codice.
In PHP faccio semplicemente(per prova ho messo sia $_POST che $_REQUEST):
Codice (XML): [Seleziona]
<html>
                <head>
                        <title>Prova</title>
                </head>
               
                <body>
                        <h1>Messaggio dal dispositivo:</h1>
                        <h3>Inizio messaggio</h3>
                        <?php
                                echo $_REQUEST['msg'];
                                echo $_POST['msg'];
                        ?>
                        <h3>Fine messaggio</h3>
                 <body>
</html>

e in Android invece faccio(posto solo il pezzo di codice della reeust):

Codice (Java): [Seleziona]
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost request = new HttpPost("http://localhost/registration.php");
            request.setHeader("Content-type", "application/json");
           
            List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
            nameValuePair.add(new BasicNameValuePair("msg", RegMessage));

            request.setEntity(new UrlEncodedFormEntity(nameValuePair));
           
            httpclient.execute(request);

cosa sbaglio? in fin dei conti è una stupissima stringa!  ???


Grazie!

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Inviare dati codificati, in POST a server PHP
« Risposta #1 il: 15 Maggio 2012, 11:23:53 CEST »
0
La prima cosa sospetta che vedo è che usi "localhost" quando dovrebbe essere  10.0.2.2

Offline AliceInWonderland

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: +1
    • Github
    • Google+
    • Raffaella Pivetta
    • pivetta.raffaella@hotmail.it
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy nexus ( android 4.3 )
  • Sistema operativo:
    window 7
Re:Inviare dati codificati, in POST a server PHP
« Risposta #2 il: 15 Maggio 2012, 12:36:08 CEST »
+1
io ho fatto al stessa cosa ti posto il mio codice:

Codice (Java): [Seleziona]
package sogetel.pivetta.CapturEvent.network;

/**
 * AsyncTask enables proper and easy use of the UI thread. This class allows to perform background
 * operations and publish results on the UI thread without having to manipulate threads and/or handlers**/

public class NetworkFeedback extends AsyncTask<String, Void,  String>{
        private static final String uri = "http://192.168.0.133/ciao2.php";
       
        /*The POST method is used to request that the origin server accept the entity enclosed in the request
         * as a new subordinate of the resource identified by the Request-URI in the Request-Line. */

        private HttpPost httppost;
       
        /*HttpClient interface represents the most essential contract for HTTP request execution. It imposes
         * no restrictions or particular details on the request execution process and leaves the specifics of
         * connection management, state management, authentication and redirect handling up to individual
         * implementations.*/

        private HttpClient httpclient;
        private List<NameValuePair> nameValuePairs;
        private HashMap<String ,MyFeedBack> obj= new HashMap<String,MyFeedBack >();
        private String key= null;
       
        /*A JSONObject is an unordered collection of name/value pairs. A JSONObject constructor can be used
         * to convert an external form JSON text into an internal form whose values can be retrieved with
         * the get and opt methods, or to convert values into a JSON text using the put and toString methods.
         * A get method returns a value if one can be found, and throws an exception if one cannot be found.
         * An opt method returns a default value instead of throwing an exception, and so is useful for
         * obtaining optional values.*/

        private JSONObject json;
        /**
         * I will setting "resending to true when I have send the Feedbcak but it has not been delivered  **/

        private boolean resending= false;

        /**
         * @uml.property  name="response"
         * @uml.associationEnd  
         */

        /*The HTTP::Response class encapsulates HTTP style responses. A response consists of a response line,
         * some headers, and a content body*/

        private HttpResponse response;
        private String result=null;
       
        /*A ResponseHandler that returns the response body as a String for successful (2xx) responses. If the
         * response code was >= 300, the response body is consumed and an HttpResponseException is thrown.*/

        @SuppressWarnings("unused")
        private ResponseHandler <String> resonseHandler;
        private MyFeedBack feedback;

       
        /**Runs on the UI thread before doInBackground(Params...).**/
        @Override
        protected void onPreExecute() {
                  Log.i("AsyncTask", "onPreExecute");
        }

        /**Override this method to perform a computation on a background thread*/
        @Override
        protected String doInBackground(String... params) {
                httpclient= new DefaultHttpClient();
                httppost = new HttpPost(uri);
                resonseHandler = new BasicResponseHandler();
               
                // Add your data
                        try {
                                takeOneFeedBackAndSend(takeListFeedback());
                        } catch (JSONException e) {
                                IuLog.Error(e);
                        }
                        String res=null;
                       
                        //TODO look for a more efficient cycle
                /*
                 * we has need of cycle below because we want resends the feedback when we receive a negative response
                 *
                 * do {
                                if(resending==true){
                                       
                                        sendFeedback(obj);
                                        Toast.makeText(feedback.getC(), "Resubmission of feedback. The server does not answer positively ",Toast.LENGTH_LONG).show();
           }
                                resending=true;
                        res=readResponseFromServer();
                }while (res==null);*/

                       
                        sendFeedback(obj);
                        res=readResponseFromServer();
                return res;
        }

        /**I will take the list feedback that we have insert on db */
        public List<MyFeedBack> takeListFeedback(){
                //Take the Feedback to send at DbFeedback
                 List<MyFeedBack> mFeedback= ControlApplication.getIstanceControlApplication().getOnDbAllFeedBack();
                return mFeedback;
        }
       
        /**I will take the last feedback that we have insert on db and send it
        if send has been delivered we take off this element of the  Hash map and on DB
         but if it it has not been delivered we send it already */

        public void takeOneFeedBackAndSend(List<MyFeedBack> mFeedback) throws JSONException{
                 json = new JSONObject();
                if(mFeedback!=null){
                        /*
                         *I will take all feedback tha we have on db and after  we send it
                         *
                         * for(MyFeedBack feedback : mFeedback){
                                String key= feedback.getKeyFeedback();
                                obj.put(key, feedback);
                                try {
                                        json.put("FeedBack ", obj.get(key));
                                        httppost.setEntity(new ByteArrayEntity(json.toString().getBytes("UTF8")));
                                         // Execute HTTP Post Request
                                        response = httpclient.execute(httppost);*/

                       
                        /* I will take the last feedback that we have insert on db and send it
                        if send has been delivered we take off this element of the  Hash map and on DB
                         but if it it has not been delivered we send it already */

                        int size=mFeedback.size()-1;
                        feedback = mFeedback.get(size);
                        key= feedback.getKeyFeedback();
                       
                        }
                }
       
       
        /**into this method we send the feedback to the server*/
        public HttpResponse sendFeedback(HashMap<String,MyFeedBack > element){
                try {
                        json.put("KeyFeedBack ", element.get(key).getKeyFeedback());
                        json.put("NameApp ", element.get(key).getNameApp());
                        json.put("SerialDevice ", element.get(key).getSerialDevice());
                        json.put("TimeStamp ", element.get(key).getTimeStamp());
                        json.put("TextFeedback ", element.get(key).getTextFeedback());
                        Map<String, String> fed = new HashMap<String, String>();
                        fed.put("feedback", json.toString());
                        nameValuePairs= new ArrayList<NameValuePair>(fed.size());
                        String k,v;
                        Iterator<String> itKeys= fed.keySet().iterator();
                        while (itKeys.hasNext()){
                                k=itKeys.next();
                                v=fed.get(k);
                                nameValuePairs.add(new BasicNameValuePair(k,v));
                        }
                 //      httppost.setEntity(new ByteArrayEntity(json.toString().getBytes("UTF-8")));
                         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                         // Execute HTTP Post Request
                         response = httpclient.execute(httppost);
                         String temp = EntityUtils.toString(response.getEntity());
                         if(temp.compareTo("SUCCESS")==0){
                                 Toast.makeText(feedback.getC(), "sending complete! ",Toast.LENGTH_LONG).show();
                         }else{
                                 Toast.makeText(feedback.getC(), "sending incoplete! ",Toast.LENGTH_LONG).show();
                         }
                         
                         
                } catch (UnsupportedEncodingException e) {
                        //IuLog.Error(e);
                        e.printStackTrace();
                } catch (ClientProtocolException e) {
                        //IuLog.Error(e);
                        e.printStackTrace();
                } catch (JSONException e) {
                        //IuLog.Error(e);
                        e.printStackTrace();
                } catch (IOException e) {
                        //IuLog.Error(e);
                        e.printStackTrace();
                }
                 return response;
               
        }
       
        /**into this method we read the response that Server send to owns Device*/
        public String readResponseFromServer(){
               
                try {
                        BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "iso-8859-1"), 8);
                        StringBuilder sb = new StringBuilder();
                        sb.append(reader.readLine() + "\n");
                       
                        String line = "0";
                        while ((line = reader.readLine()) != null) {
                             sb.append(line + "\n");
                           }
                       
                        reader.close();
                        result= sb.toString(); 
                        Toast.makeText(feedback.getC(), result, Toast.LENGTH_LONG).show();
                        // parsing data
                        return result;
                //      return new JSONArray(result);
                       
                } catch (UnsupportedEncodingException e) {
                        //IuLog.Error(e);
                        e.printStackTrace();
                        return null;
                } catch (IllegalStateException e) {
                //      IuLog.Error(e);
                        e.printStackTrace();
                        return null;
                } catch (IOException e) {
                        //IuLog.Error(e);
                        e.printStackTrace();
                        return null;
                }
               
        }
       
       
        /**Runs on the UI thread after doInBackground(Params...). The specified result is the value returned
         *  by doInBackground(Params...).This method won't be invoked if the task was cancelled.**/

        @Override
        protected void onPostExecute(String result) {
                 if (result != null) {
                         Log.i("AsyncTask", "onPostExecute: Completed.");
                         Toast.makeText(feedback.getC(), "Completed!Developper have receved the feedback that you have send ",Toast.LENGTH_LONG).show();
                         obj.remove(key);
                } else {
                    // error occurred
                        Log.i("AsyncTask", "onPostExecute: Completed with an Error.");
                                Toast.makeText(feedback.getC(), "Completed with an Error!Developper haven't receved the feedback that you have send ",Toast.LENGTH_LONG).show();


                }
        }

}

Codice: [Seleziona]

<?php
        // the Object
        print_r($_POST);
        print_r($_GET);       
        $j= array('MyFeedback'=>array('keyFeedback'=>'ciao' ) );
        $object=json_encode($j);
        //we read the stream JSON
        echo $object -> {'MyFeedback'};
        ?>
« Ultima modifica: 15 Maggio 2012, 12:40:25 CEST da lella_84 »
Raffaella

Offline ilcapitano4

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC WildFire
  • Sistema operativo:
    Ubuntu 11.10
Re:Inviare dati codificati, in POST a server PHP
« Risposta #3 il: 15 Maggio 2012, 19:59:16 CEST »
0
Niente da fare non va! :-(

Comunque vi ringrazio per le risposte!

Per Ricky: si scusa, ho postato il codice sbagliato infatti stavo facendo delle prove in Java prima di andare su Android, per comodità...anche se sò che non tutto ciò che funge uno gira anche sull'altro, ma in questo dovrebbe al 99%.

Per lella_84: ho visto il tuo codice e la parte di creazione della request è assolutamente uguale alla mia, tranne che per il fatto che tu hai più elementi nell'array di NameValuePair e io ne ho uno solo.

Se posso chiedervi un favore, provereste a far girare questo codice di prova anche voi e vedete un pò se va?
Io sono in ambiente UNIX, Kubuntu per precisione, ho installato LAMP e programmo in Java/Android con Eclipse Indigo.

Codice dell'applicazione Java:
Codice (Java): [Seleziona]
package prova;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;

public class ConnectionProof {

        String    url = "http://127.0.0.1/registration.php";
               
        public static void main(String args[]) throws Exception {
       
        String    username = "utente";
        String    password = "pippopippa";
        int       nonce = (int)(Math.random() * 100);
       
        //CREAZIONE MESSAGGIO JSON.
        JSONObject jo = new JSONObject();
        jo.put("usename", username);
        jo.put("password", password);
        jo.put("nonce", nonce);
        jo.put("pubKey", "chiavepubblicadispositivo" );
       
        String plainText = jo.toString();
       
        System.out.println("JSONObj: " + plainText );

        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost("http://127.0.0.1/registration.php");
   
        List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
        nameValuePair.add(new BasicNameValuePair( "msg", plainText ));
       
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));

        HttpResponse response = httpClient.execute(httpPost);
    }
}

Codice PHP:
Codice (XML): [Seleziona]
<html>
                <head>
                        <title>Prova</title>
                </head>
               
                <body>
                        <h1>Messaggio dal dispositivo:</h1>
                        <h3>Inizio messaggio</h3>
                        <?php
                               
                                echo $_REQUEST;
                                echo $_POST;
                                echo $_GET;                            
                               
                                echo $_REQUEST['msg'];
                                echo $_POST['msg'];
                                echo $_GET['msg'];
 
                        ?>
                        <h3>Fine messaggio</h3>
</html>

Allego in oltre la cartella col progetto Eclipse da importare da workstation e il file PHP.

Grazie ancora dell'aiuto!
Spero di riuscire a risolvere al più presto! Sono bloccato!:(