2015-08-20 28 views
6

ile Android'den PHP sunucusuna bir JSON Nesnesi gönder Benim Android uygulaması ve yerel ağdaki WampServer'ım arasında iletişim kurmaya çalışıyorum.POST yöntemi ve HttpURLConnection

Sunucudan veri okumak istediğimde başarı elde ettim, ancak sunucuya veri göndermeye çalışırken sorun yaşıyorum.

public class SynchronisationService extends Service { 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onStartCommand(intent, flags, startId); 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       URL url = new URL("http://192.168.37.23/happiness_barometer/php_input.php"); 
       HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
       connection.setDoOutput(true); 
       connection.setDoInput(false); 
       connection.setRequestMethod("POST"); 
       connection.connect(); 
       OutputStream outputStream = connection.getOutputStream(); 
       OutputStreamWriter writer = new OutputStreamWriter(outputStream); 
       JSONObject jsonObject = new JSONObject(); 
       jsonObject.put("rate", 1); 
       writer.write(URLEncoder.encode(jsonObject.toString(), "UTF-8")); 
       writer.flush(); 
       writer.close(); 

      } catch (Exception e) { 
       Log.v("EXCEPTION", e.getMessage()); 
      } 
     } 
    }).start(); 


    stopSelf(); 

    return flags; 
} 

}

Ve php dosyası::

Ben kurulan iletişimin bir hizmeti kullanıyorum Uygulamamı çalıştırdığınızda

<?php 

    try 
    { 
     $bdd = new PDO('mysql:host=localhost;dbname=happiness_barometer;charset=utf8', 'utilisateur', ''); 
    } catch (Exception $e) 
    { 
     die('Erreur : '.$e->getMessage()); 
    } 

    $sql = $bdd->prepare(
    'INSERT INTO rates (rate, comment, category, day, month, year, hour, minute, day_of_week, week, rate_number) 
    VALUES (:rate, :comment, :category, :day, :month, :year, :hour, :minute, :day_of_week, :week, :rate_number)'); 
    if (!empty($_POST['rate'])) { 
     $sql->execute(array(
      'rate' => $_POST['rate'], 
      'comment' => '', 
      'category' => 'pro', 
      'day' => 19, 
      'month' => 8, 
      'year' => 2015, 
      'hour' => 18, 
      'minute' => 3, 
      'day_of_week' =>3, 
      'week' => 33, 
      'rate_number' => 2)); 
    } 
?> 

, hiçbir şey eklenir benim veri tabanı. Sanırım $_POST['rate']'da hiçbir şey yok.

Lütfen kodumda neyin yanlış olduğunu söyle? Bu kod ile

+0

senin yığın izi (logcat) –

+0

@vinay Maneti: Logcat'ımda yaklaşık 200 satıra sahibim. Hangi hatlar önemlidir? –

+0

Sizin SynchronisationService ve aktivite sınıflarıyla ilişkili –

cevap

13

Son olarak, başarı benim sunucuya JSONObject nesnesi göndermek için.

new Thread(new Runnable() { 
     @Override 
     public void run() { 
      OutputStream os = null; 
      InputStream is = null; 
      HttpURLConnection conn = null; 
      try { 
       //constants 
       URL url = new URL("http://192.168.43.64/happiness_barometer/php_input.php"); 
       JSONObject jsonObject = new JSONObject(); 
       jsonObject.put("rate", "1"); 
       jsonObject.put("comment", "OK"); 
       jsonObject.put("category", "pro"); 
       jsonObject.put("day", "19"); 
       jsonObject.put("month", "8"); 
       jsonObject.put("year", "2015"); 
       jsonObject.put("hour", "16"); 
       jsonObject.put("minute", "41"); 
       jsonObject.put("day_of_week", "3"); 
       jsonObject.put("week", "34"); 
       jsonObject.put("rate_number", "1"); 
       String message = jsonObject.toString(); 

       conn = (HttpURLConnection) url.openConnection(); 
       conn.setReadTimeout(10000 /*milliseconds*/); 
       conn.setConnectTimeout(15000 /* milliseconds */); 
       conn.setRequestMethod("POST"); 
       conn.setDoInput(true); 
       conn.setDoOutput(true); 
       conn.setFixedLengthStreamingMode(message.getBytes().length); 

       //make some HTTP header nicety 
       conn.setRequestProperty("Content-Type", "application/json;charset=utf-8"); 
       conn.setRequestProperty("X-Requested-With", "XMLHttpRequest"); 

       //open 
       conn.connect(); 

       //setup send 
       os = new BufferedOutputStream(conn.getOutputStream()); 
       os.write(message.getBytes()); 
       //clean up 
       os.flush(); 

       //do somehting with response 
       is = conn.getInputStream(); 
       //String contentAsString = readIt(is,len); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } finally { 
       //clean up 
       try { 
        os.close(); 
        is.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

       conn.disconnect(); 
      } 
     } 
    }).start(); 

ve php kısmında bu bir:

Ben robot kısmı için bu kodu kullanılan
$json = file_get_contents('php://input'); 
$obj = json_decode($json); 
$rate = $obj->{'rate'}; 
$comment = $obj->{'comment'}; 
$category = $obj->{'category'}; 
$day = $obj->{'day'}; 
$month = $obj->{'month'}; 
$year = $obj->{'year'}; 
$hour = $obj->{'hour'}; 
$minute = $obj->{'minute'}; 
$day_of_week = $obj->{'day_of_week'}; 
$week = $obj->{'week'}; 
$rate_number = $obj->{'rate_number'}; 

try 
{ 
    $bdd = new PDO('mysql:host=localhost;dbname=happiness_barometer;charset=utf8', 'utilisateur', ''); 
} catch (Exception $e) 
{ 
    die('Erreur : '.$e->getMessage()); 
} 

$sql = $bdd->prepare(
'INSERT INTO rates (rate, comment, category, day, month, year, hour, minute, day_of_week, week, rate_number) 
VALUES (:rate, :comment, :category, :day, :month, :year, :hour, :minute, :day_of_week, :week, :rate_number)'); 
if (!empty($rate)) { 
    $sql->execute(array(
     'rate' => $rate, 
     'comment' => $comment, 
     'category' => $category, 
     'day' => $day, 
     'month' => $month, 
     'year' => $year, 
     'hour' => $hour, 
     'minute' => $minute, 
     'day_of_week' => $day_of_week, 
     'week' => $week, 
     'rate_number' => $rate_number)); 
} 

o başkası yardımcı olacaktır Umut, siz gönderebilirsiniz)

+0

bu bana çok yardımcı oldu! merci tres bien, tu m'as sauvé. UPVOTED:) –

+0

@ Anaïs, httpUrlConnection.getResponse() HttpURLConnection.HTTP_OK olsun ama aynı zamanda php json verilerini kabul etmiyor yanıtı aynı kodu kullanıyorum. Lütfen yardım et – Yirga

1

Kontrol: PHP Side

public class UniversalNetworkConnection { 

    public static String postJSONObject(String myurl, JSONObject parameters) { 
     HttpURLConnection conn = null; 
     try { 
      StringBuffer response = null; 
      URL url = new URL(myurl); 
      conn = (HttpURLConnection) url.openConnection(); 
      conn.setReadTimeout(10000); 
      conn.setConnectTimeout(15000); 
      conn.setRequestProperty("Content-Type", "application/json"); 
      conn.setDoOutput(true); 
      conn.setRequestMethod("POST"); 
      OutputStream out = new BufferedOutputStream(conn.getOutputStream()); 
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8")); 
      writer.write(parameters.toString()); 
      writer.close(); 
      out.close(); 
      int responseCode = conn.getResponseCode(); 
      System.out.println("responseCode" + responseCode); 
      switch (responseCode) { 
       case 200: 
        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
        String inputLine; 
        response = new StringBuffer(); 
        while ((inputLine = in.readLine()) != null) { 
         response.append(inputLine); 
        } 
        in.close(); 
        return response.toString(); 
      } 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } finally { 
      if (conn != null) { 
       try { 
        conn.disconnect(); 
       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } 
     return null; 
    } 

} 

:

<?php 
    $json = file_get_contents('php://input'); 
    $obj = json_decode($json); 
    print_r($obj); 
    print_r("this is a test"); 
?> 
+0

Bu kodu deneyeceğim ama hiçbir şey olmuyor: hata yok, logcat'te System.out hakkında bir şey yok. –

+0

@ Anaïs Bataklıkta kontrol -> apache -> erişim günlüğü. Bağlantının kesildiğini kontrol edin – Bonatti

+0

@Bonatti I Erişim günlüğünü kontrol edin, php_output dosyası yerel ağdaki bir istemci tarafından "açık" durumda (IP adresi: 192.168.36.212) fakat php_input dosyası asla "açık" değil. Ben de bir 408 hatası düşünüyorum. Yardımcı olur mu –