PHP HTTP POST на Android-устройстве с использованием HttpURLConnection

Вопрос:

Поэтому проблема заключается в том, что это не сообщение в онлайн-базу данных, размещенную goDaddy. Поэтому мой вопрос – почему, и как я могу исправить это, чтобы он опубликовал его?

Проблема: php-страница не получает пары значений имени, передаваемых ей.

Редактировать:

Модифицированный код на предложение использовать HttpURLConnection … Я сузил проблему, чтобы не получить fbid.

Как вы можете сказать, я сделал много своей домашней работы здесь … Вот мой логарифм того, что задается в классе postthread. Вот мой класс, который делает сообщение:

07-02 16:41:45.108: I/PROJECTCARUSO(12308): response: {"posts":[null]} 

HttpPostThread:

 public class HttpPostThread extends Thread { public static final int FAILURE = 0; public static final int SUCCESS = 1; private URL url; ArrayList<NameValuePair> pairs; public HttpPostThread(URL sERVICE_URL, ArrayList<NameValuePair> pairs, final Handler handler) { Log.i("PROJECTCARUSO", "Posting to URL: " + sERVICE_URL); this.url =sERVICE_URL; this.pairs = pairs; if(pairs==null){ Log.i("PROJECTCARUSO", "URL parms were null"); this.pairs = new ArrayList<NameValuePair>(); } } @Override public void run() { try { HttpURLConnection conn; String param=""; for (NameValuePair nvp : pairs) { //you need to encode ONLY the values of the parameters if (param == "") { param=nvp.getName() + "=" + URLEncoder.encode(nvp.getValue(),"UTF-8"); } else { param+= "&" + nvp.getName() + "=" + URLEncoder.encode(nvp.getValue(),"UTF-8"); } } Log.i("PROJECTCARUSO", "param: " + param.toString()); // Create connection conn=(HttpURLConnection)url.openConnection(); //set the output to true, indicating you are outputting(uploading) POST data conn.setDoOutput(true); //once you set the output to true, you don't really need to set the request method to post, but I'm doing it anyway conn.setRequestMethod("POST"); //Android documentation suggested that you set the length of the data you are sending to the server, BUT // do NOT specify this length in the header by using conn.setRequestProperty("Content-Length", length); //use this instead. conn.setFixedLengthStreamingMode(param.getBytes().length); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //send the POST out PrintWriter out = new PrintWriter(conn.getOutputStream()); out.print(param); out.close(); //build the string to store the response text from the server String response= ""; //start listening to the stream Scanner inStream = new Scanner(conn.getInputStream()); //process the stream and store it in StringBuilder while(inStream.hasNextLine()) response+=(inStream.nextLine()); Log.i("PROJECTCARUSO","response: " + response); } //catch some error catch(MalformedURLException ex){ Log.i("PROJECTCARUSO", ex.toString()); } // and some more catch(IOException ex){ Log.i("PROJECTCARUSO", ex.toString()); } } public static boolean isNumeric(String str) { try { double d = Double.parseDouble(str); } catch(NumberFormatException nfe) { return false; } return true; } } в public class HttpPostThread extends Thread { public static final int FAILURE = 0; public static final int SUCCESS = 1; private URL url; ArrayList<NameValuePair> pairs; public HttpPostThread(URL sERVICE_URL, ArrayList<NameValuePair> pairs, final Handler handler) { Log.i("PROJECTCARUSO", "Posting to URL: " + sERVICE_URL); this.url =sERVICE_URL; this.pairs = pairs; if(pairs==null){ Log.i("PROJECTCARUSO", "URL parms were null"); this.pairs = new ArrayList<NameValuePair>(); } } @Override public void run() { try { HttpURLConnection conn; String param=""; for (NameValuePair nvp : pairs) { //you need to encode ONLY the values of the parameters if (param == "") { param=nvp.getName() + "=" + URLEncoder.encode(nvp.getValue(),"UTF-8"); } else { param+= "&" + nvp.getName() + "=" + URLEncoder.encode(nvp.getValue(),"UTF-8"); } } Log.i("PROJECTCARUSO", "param: " + param.toString()); // Create connection conn=(HttpURLConnection)url.openConnection(); //set the output to true, indicating you are outputting(uploading) POST data conn.setDoOutput(true); //once you set the output to true, you don't really need to set the request method to post, but I'm doing it anyway conn.setRequestMethod("POST"); //Android documentation suggested that you set the length of the data you are sending to the server, BUT // do NOT specify this length in the header by using conn.setRequestProperty("Content-Length", length); //use this instead. conn.setFixedLengthStreamingMode(param.getBytes().length); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //send the POST out PrintWriter out = new PrintWriter(conn.getOutputStream()); out.print(param); out.close(); //build the string to store the response text from the server String response= ""; //start listening to the stream Scanner inStream = new Scanner(conn.getInputStream()); //process the stream and store it in StringBuilder while(inStream.hasNextLine()) response+=(inStream.nextLine()); Log.i("PROJECTCARUSO","response: " + response); } //catch some error catch(MalformedURLException ex){ Log.i("PROJECTCARUSO", ex.toString()); } // and some more catch(IOException ex){ Log.i("PROJECTCARUSO", ex.toString()); } } public static boolean isNumeric(String str) { try { double d = Double.parseDouble(str); } catch(NumberFormatException nfe) { return false; } return true; } } 

Вот php:

  <?php //Make connection $con = mysqli_connect('...','...','...') ; //check connection if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } //change db to andriodnfp db mysqli_select_db($con, 'andriodnfp'); $table= 'USER'; $id=0; $fbid = htmlspecialchars($_GET["fbid"]); $social = htmlspecialchars($_GET["social"]); $name = htmlspecialchars($_GET["name"]); $name = !empty($name) ? "'$name'" : "NULL"; $fname = htmlspecialchars($_GET["fname"]); $fname = !empty($fname) ? "'$fname'" : "NULL"; $username = htmlspecialchars($_GET["username"]); $username = !empty($username) ? "'$username'" : "NULL"; $email = htmlspecialchars($_GET["email"]); $email = !empty($email) ? "'$email'" : "NULL"; $picture = htmlspecialchars($_GET["picture"]); $picture = !empty($picture) ? "'$picture'" : "NULL"; $other = htmlspecialchars($_GET["other"]); $other = !empty($other) ? "'$other'" : "NULL"; if (!$fbid == '') { if (!mysqli_query($con, 'INSERT INTO '.$table.' ( facebookID, social_outlet, Name, first_name, username, email, picture, significant_other) VALUES ("'.$fbid.'","'.$social.'","'.$name.'","'.$fname.'","'.$username.'","'.$email.'","'.$picture.'","'.$other.'")')) { printf("Errormessage: %s\n", mysqli_error($con)); die(); } else { $posts = array('auto_increment_id'=>mysqli_insert_id($con)); }; } else { printf("Errormessage: %s\n", "Facebook ID was null"); printf("Errormessage: %s\n", $fbid ); printf("Errormessage: %s\n", $social); printf("Errormessage: %s\n", $name); printf("Errormessage: %s\n", $fname); printf("Errormessage: %s\n", $username); printf("Errormessage: %s\n", $email); printf("Errormessage: %s\n", $picture); printf("Errormessage: %s\n", $other); die(); } mysqli_close($con); //$posts = array($json); $posts = array($posts); header('Content-type: application/json'); echo json_encode(array('posts'=>$posts)); ?> по  <?php //Make connection $con = mysqli_connect('...','...','...') ; //check connection if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } //change db to andriodnfp db mysqli_select_db($con, 'andriodnfp'); $table= 'USER'; $id=0; $fbid = htmlspecialchars($_GET["fbid"]); $social = htmlspecialchars($_GET["social"]); $name = htmlspecialchars($_GET["name"]); $name = !empty($name) ? "'$name'" : "NULL"; $fname = htmlspecialchars($_GET["fname"]); $fname = !empty($fname) ? "'$fname'" : "NULL"; $username = htmlspecialchars($_GET["username"]); $username = !empty($username) ? "'$username'" : "NULL"; $email = htmlspecialchars($_GET["email"]); $email = !empty($email) ? "'$email'" : "NULL"; $picture = htmlspecialchars($_GET["picture"]); $picture = !empty($picture) ? "'$picture'" : "NULL"; $other = htmlspecialchars($_GET["other"]); $other = !empty($other) ? "'$other'" : "NULL"; if (!$fbid == '') { if (!mysqli_query($con, 'INSERT INTO '.$table.' ( facebookID, social_outlet, Name, first_name, username, email, picture, significant_other) VALUES ("'.$fbid.'","'.$social.'","'.$name.'","'.$fname.'","'.$username.'","'.$email.'","'.$picture.'","'.$other.'")')) { printf("Errormessage: %s\n", mysqli_error($con)); die(); } else { $posts = array('auto_increment_id'=>mysqli_insert_id($con)); }; } else { printf("Errormessage: %s\n", "Facebook ID was null"); printf("Errormessage: %s\n", $fbid ); printf("Errormessage: %s\n", $social); printf("Errormessage: %s\n", $name); printf("Errormessage: %s\n", $fname); printf("Errormessage: %s\n", $username); printf("Errormessage: %s\n", $email); printf("Errormessage: %s\n", $picture); printf("Errormessage: %s\n", $other); die(); } mysqli_close($con); //$posts = array($json); $posts = array($posts); header('Content-type: application/json'); echo json_encode(array('posts'=>$posts)); ?> 

Журналы Apache:

 166.147.72.174 - - [19/Jun/2013:16:47:41 -0700] "POST ...post.php? HTTP/1.1" 200 155 "-" "Apache-HttpClient/UNAVAILABLE (java 1.4)" 0 "x-httpd-php5-3" "/var/chroot/home/content/31/9124131/html/android/com.projectcaruso/naturalfamilyplaning/post.php" 195224 166.147.72.174 - - [19/Jun/2013:16:49:08 -0700] "POST ...post.php? HTTP/1.1" 200 155 "-" "Apache-HttpClient/UNAVAILABLE (java 1.4)" 0 "x-httpd-php5-3" "/var/chroot/home/content/31/9124131/html/android/com.projectcaruso/naturalfamilyplaning/post.php" 13848 166.147.72.174 - - [19/Jun/2013:16:50:57 -0700] "POST ...post.php? HTTP/1.1" 200 155 "-" "Apache-HttpClient/UNAVAILABLE (java 1.4)" 0 "x-httpd-php5-3" "/var/chroot/home/content/31/9124131/html/android/com.projectcaruso/naturalfamilyplaning/post.php" 17899 166.147.72.174 - - [19/Jun/2013:16:52:14 -0700] "POST ...post.php HTTP/1.1" 200 155 "-" "Apache-HttpClient/UNAVAILABLE (java 1.4)" 0 "x-httpd-php5-3" "/var/chroot/home/content/31/9124131/html/android/com.projectcaruso/naturalfamilyplaning/post.php" 12514 166.147.72.174 - - [19/Jun/2013:16:53:35 -0700] "POST ...post.php HTTP/1.1" 200 155 "-" "Apache-HttpClient/UNAVAILABLE (java 1.4)" 0 "x-httpd-php5-3" "/var/chroot/home/content/31/9124131/html/android/com.projectcaruso/naturalfamilyplaning/post.php" 15190 166.147.72.174 - - [19/Jun/2013:16:54:56 -0700] "POST ...post.php HTTP/1.1" 200 155 "-" "Apache-HttpClient/UNAVAILABLE (java 1.4)" 0 "x-httpd-php5-3" "/var/chroot/home/content/31/9124131/html/android/com.projectcaruso/naturalfamilyplaning/post.php" 14373 166.147.72.174 - - [19/Jun/2013:16:56:50 -0700] "POST ...post.php HTTP/1.1" 200 155 "-" "Apache-HttpClient/UNAVAILABLE (java 1.4)" 0 "x-httpd-php5-3" "/var/chroot/home/content/31/9124131/html/android/com.projectcaruso/naturalfamilyplaning/post.php" 12017 

РЕДАКТИРОВАТЬ:

Я даже пробовал java так:

 public void run() { try { HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(10000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); List<NameValuePair> params = new ArrayList<NameValuePair>(); for (NameValuePair nvp : pairs) { //you need to encode ONLY the values of the parameters params.add(new BasicNameValuePair(nvp.getName(), nvp.getValue())); Log.i("PROJECTCARUSO", "NVP: " + nvp.getName() + " - " + nvp.getValue()); } OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os, "UTF-8")); writer.write(getQuery(params)); writer.close(); os.close(); conn.connect(); //build the string to store the response text from the server String response= ""; //start listening to the stream Scanner inStream = new Scanner(conn.getInputStream()); //process the stream and store it in StringBuilder while(inStream.hasNextLine()) response+=(inStream.nextLine()); Log.i("PROJECTCARUSO","response: " + response); } catch (ProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } в public void run() { try { HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(10000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); List<NameValuePair> params = new ArrayList<NameValuePair>(); for (NameValuePair nvp : pairs) { //you need to encode ONLY the values of the parameters params.add(new BasicNameValuePair(nvp.getName(), nvp.getValue())); Log.i("PROJECTCARUSO", "NVP: " + nvp.getName() + " - " + nvp.getValue()); } OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os, "UTF-8")); writer.write(getQuery(params)); writer.close(); os.close(); conn.connect(); //build the string to store the response text from the server String response= ""; //start listening to the stream Scanner inStream = new Scanner(conn.getInputStream()); //process the stream and store it in StringBuilder while(inStream.hasNextLine()) response+=(inStream.nextLine()); Log.i("PROJECTCARUSO","response: " + response); } catch (ProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Вы должны использовать $_POST вместо $_GET везде.

Предположим, что вы используете apache HttpClient как ваш DefaultClient.

Вам нужно больше данных о WIRE и HEADER. Apache logger docs показывает вам, как включить эти регистраторы. читать документы apache при регистрации

пример ниже того, что вы увидите (u будет точно знать, что происходит между клиентом и сервером).

Полный вход в apache HttpClient:

 D/ch.boye.httpclientandroidlib.wire( 1175): >> "PUT /1/classes/Books/8NUX0YP5XK HTTP/1.1[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): >> "Content-Length: 375[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): >> "Content-Type: text/plain; charset=ISO-8859-1[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): >> "Host: api.parse.com[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): >> "Connection: Keep-Alive[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): >> "X-Parse-Application-Id: 3[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): >> "X-Parse-REST-API-Key: kVl9[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): >> "[\r][\n]" D/ch.boye.httpclientandroidlib.headers( 1175): >> PUT /1/classes/Books/8NUX0YP5XK HTTP/1.1 D/ch.boye.httpclientandroidlib.headers( 1175): >> Content-Length: 375 D/ch.boye.httpclientandroidlib.headers( 1175): >> Content-Type: text/plain; charset=ISO-8859-1 D/ch.boye.httpclientandroidlib.headers( 1175): >> Host: api.parse.com D/ch.boye.httpclientandroidlib.headers( 1175): >> Connection: Keep-Alive D/ch.boye.httpclientandroidlib.headers( 1175): >> X-Parse-Application-Id: 3K D/ch.boye.httpclientandroidlib.headers( 1175): >> X-Parse-REST-API-Key: kVl5Z D/ch.boye.httpclientandroidlib.wire( 1175): >> "{"pages":{"__op":"Add","objects":[{"__type":"Pointer","ClassName":"TestVoiceObject","objectId":"bsKyc8mKV7"},{"__type":"Pointer","ClassName":"TestVoiceObject","objectId":"hehlqEUJw8"},{"__type":"Pointer","ClassName":"TestVoiceObject","objectId":"rtbhCb37tq"},{"__type":"Pointer","ClassName":"TestVoiceObject","objectId":"84zjWpJy6y"}]},"ACL":{"*":{"read":true,"write":true}}}" D/ch.boye.httpclientandroidlib.wire( 1175): << "HTTP/1.1 200 OK[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): << "Access-Control-Allow-Origin: *[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): << "Access-Control-Request-Method: *[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): << "Cache-Control: max-age=0, private, must-revalidate[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): << "Content-Type: application/json; charset=utf-8[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): << "Date: Mon, 08 Apr 2013 19:51:59 GMT[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): << "ETag: "172e8ee0c4828b5fce3303c078b8f2ad"[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): << "Server: nginx/1.2.2[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): << "Set-Cookie: _parse_session=BAh7BkkiD3d989bfe; domain=.parse.com; path=/; expires=Sat, 08-Apr-2023 19:51:59 GMT; secure; HttpOnly[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): << "Status: 200 OK[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): << "X-Runtime: 0.041462[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): << "X-UA-Compatible: IE=Edge,chrome=1[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): << "Content-Length: 500[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): << "Connection: keep-alive[\r][\n]" D/ch.boye.httpclientandroidlib.wire( 1175): << "[\r][\n]" D/class ch.boye.httpclientandroidlib.impl.conn.DefaultClientConnection( 1175): Receiving response: HTTP/1.1 200 OK D/ch.boye.httpclientandroidlib.headers( 1175): << HTTP/1.1 200 OK D/ch.boye.httpclientandroidlib.headers( 1175): << Access-Control-Allow-Origin: * D/ch.boye.httpclientandroidlib.headers( 1175): << Access-Control-Request-Method: * D/ch.boye.httpclientandroidlib.headers( 1175): << Cache-Control: max-age=0, private, must-revalidate D/ch.boye.httpclientandroidlib.headers( 1175): << Content-Type: application/json; charset=utf-8 D/ch.boye.httpclientandroidlib.headers( 1175): << Date: Mon, 08 Apr 2013 19:51:59 GMT D/ch.boye.httpclientandroidlib.headers( 1175): << ETag: "172e8ee0c4828b5fce3303c078b8f2ad" D/ch.boye.httpclientandroidlib.headers( 1175): << Server: nginx/1.2.2 D/ch.boye.httpclientandroidlib.headers( 1175): << Set-Cookie: