2015-06-22 2 views
3

Я пытаюсь отправить данные json в php-скрипт из своего приложения Android с HttpClient и получить ответ.Ответ Android HttpClient

Android код

private void sendPurchase(String SKU) throws IOException{  
    Log.e("sendPurchase","Inside sendPurchase"); 
    final SharedPreferences prefs = getGCMPreferences(getApplicationContext()); 
    int pur_user = prefs.getInt("C_user", Integer.MIN_VALUE); 
    InputStream inputStream = null; 
    String result = ""; 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httpPost = new HttpPost("http://www.*.com/includes/purchase.php");    
    JSONObject json = new JSONObject();    
    try { 
     json.put("PUR_sku", SKU); 
     json.put("PUR_user", pur_user); 
    } catch (JSONException e) { Log.e("SendPurchase","Problem with Json Object"); }  
    Log.i("JSONObject", json.toString()); 
    StringEntity se = new StringEntity(json.toString(), HTTP.UTF_8); 
    httpPost.setEntity(se); 
    httpPost.setHeader("Accept", "application/json"); 
    httpPost.setHeader("Content-type", "application/json");   
    HttpResponse httpResponse = httpclient.execute(httpPost); 
    inputStream = httpResponse.getEntity().getContent(); 
    if(inputStream != null){ result = convertInputStreamToString(inputStream); } 
    else{result = "Did not work!"; } 
    Log.e("RESULT",result);  
} 

private static String convertInputStreamToString(InputStream inputStream) throws IOException{ 
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
    String line = ""; 
    String result = ""; 
    while((line = bufferedReader.readLine()) != null) 
     result += line; 
    inputStream.close(); 
    return result; 
} 

И PHP скрипт

<? 
$auth=0; 
require('./connexion.php'); 
$data = file_get_contents('php://input'); 
//$data = '{"PUR_sku":"singleone","PUR_user":"3"}'; 
$json = json_decode($data,true); 
/* Some database stuff ... */ 
echo "Retour ".print_r($json)." et ".$json['PUR_sku']." et ".$json['PUR_user']; 
?> 

Когда я запустить приложение и выполнять функцию sendPurchase, кажется, не будет хорошо до исполнения HttpPost. В logcat я получаю все журналы с правильными параметрами, кроме последнего журнала «РЕЗУЛЬТАТ», который не появляется. Вот почему я предполагаю, что что-то не так с выполнением HttpPost, но на самом деле я не знаю, возникает ли проблема со стороны приложения или стороны php-скрипта ... Когда я выполняю скрипт php только в веб-браузере, заменяя первую строку данных на вторую, все в порядке. Но когда дело доходит до приложения, это не нормально ... Объект Json, посланный (надеюсь) на сценарий, тоже выглядит нормально: {«PUR_user»: 3, «PUR_sku»: «singleone»}

(Функция sendPurchase выполняется в фоновом режиме).

Любая идея о том, что я делаю неправильно? Благодаря !

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

Здесь LogCat для @RyuZz раствора. Мой код о покупке предмета, его потреблении и отправке нового значения в мою базу данных на веб-сервере. Покупка & потребляется, но я не могу отправить эти значения на веб-сервер. И снова, когда я выполняю скрипт php только в веб-браузере, заменяя первую строку данных на вторую, все в порядке. Обратите внимание, что у меня есть другой похожий код для регистрации пользователя в GCM, используя HttpClient, и этот код работает нормально.

06-25 14:07:12.968: D/IabHelper(21833): Successfully consumed sku: singleconf 
06-25 14:07:12.968: D/IabHelper(21833): Ending async operation: consume 
06-25 14:07:12.979: D/CONSUME(21833): Consumption finished. Purchase: PurchaseInfo(type:inapp):{"orderId":"12999763169054705758.1353445524837889","packageName":"com.*.*","productId":"singleconf","purchaseTime":1435234296875,"purchaseState":0,"purchaseToken":"bohbcbiigcbidfficbikebnk.AO-J1OzuQ_SsNTG1h9MtUvbaPc3PeN9nBHG-qBOE82ao1rTDFNrgA7tYQcMdECxCVFrrZEn_QifQ28OcIupyesZI-5cjDILFODYpBEaeqMfE0wCAeMFkJLfNUK_TsKPMj7F2sBDdgOYx"}, result: IabResult: Successful consume of sku singleconf (response: 0:OK) 
06-25 14:07:12.979: D/CONSUME(21833): You bought & consumed a single conf 
06-25 14:07:12.979: D/CONSUME(21833): End consumption flow. 
06-25 14:07:12.979: E/Purchase Background(21833): Inside doInBackground 
06-25 14:07:12.979: E/sendPurchase(21833): Failed to send HTTP POST request due to: java.lang.NullPointerException 
+0

Вы получаете журнал '«Не работает!»'? –

+0

@Heyyou no я не получаю журнал «Не работает» ... –

+0

Можете ли вы включить логин в свой код, пожалуйста? –

ответ

2

Вы можете попробовать следующее вместо HttpClient, который в любом случае не рекомендуется:

try{ 
    int pur_user = prefs.getInt("C_user", Integer.MIN_VALUE); 

    URL url = new URL("http://www.*.com/includes/purchase.php"); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    connection.setDoOutput(true); 
    connection.setDoInput(true); 
    connection.setRequestProperty("Content-Type", "application/json"); 
    connection.setRequestProperty("Accept", "application/json"); 
    connection.setRequestMethod("POST"); 

    JSONObject jsonObject = new JSONObject(); 
    jsonObject.put("PUR_sku", SKU); 
    jsonObject.put("PUR_user", pur_user); 

    //convert JSONObject to JSON to String 
    json = jsonObject.toString(); 

    OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); 
    writer.write(json); 
    writer.close(); 

    responseCode = connection.getResponseCode(); 

    if(responseCode == 200) { 

     InputStream content = connection.getInputStream(); 
     try { 

      BufferedReader reader = new BufferedReader(new InputStreamReader(content, "UTF-8"), 8); 
      StringBuilder sb = new StringBuilder(); 

      String line; 
      while ((line = reader.readLine()) != null) 
      { 
       sb.append(line).append("\n"); 
      } 
      result = sb.toString(); 

      //TODO get your stuff from result 

      content.close(); 
     } catch (Exception ex) { 
      Log.e(TAG, "Failed to parse JSON due to: " + ex); 
     } finally { 
      connection.disconnect(); 
     } 
    } else { 
     Log.e(TAG, "Server responded with status code: " + responseCode); 
    } 
} catch(Exception ex) { 
    Log.e(TAG, "Failed to send HTTP POST request due to: " + ex); 
} 

, если это не работает, пожалуйста, напишите LogCat.

Не забудьте выполнить необходимые разрешения в манифесте:

<uses-permission 
    android:name="android.permission.INTERNET" /> 
+1

Я предпочитаю, как вы добавляете 'sb', а затем используйте' ToString' после. –

+0

Привет @RyuZz Я попробовал ваш код и получил «Не удалось отправить HTTP-запрос POST из-за: java.lang.NullPointerException» в logcat –

+0

@Matthieu Marcé Я думаю, что что-то не так на вашей серверной стороне, вы можете использовать RESTful Service для получать данные из приложения. Пожалуйста, опубликуйте полный logcat – RyuZz

Смежные вопросы