2015-11-02 4 views
1

Я пытаюсь сделать запрос на отправку, используя ссылку this. Но проблема в том, что разработчик PHP на другом конце не может получить значение параметра, следовательно, не может отправить правильный ответ. Я что-то пропустил здесь.URLConnection and POST method android

// Редактирование;

Я делаю запрос HTTP-сообщения. Как вы можете видеть код ниже. Я пишу аргументы и параметры (location_id = 3) в выходной поток. Я также вставил код для PHP, который я использовал. Теперь проблема заключается в следующем:

Значение параметра (которое равно 3) не получено в PHP-коде, поэтому я получаю ответ, который окружен блоком else. Так что я просто хочу знать, если есть ошибка в коде андроида или PHP код

@Override защищенные Boolean doInBackground (String ... PARAMS) {

 Log.d(Constants.LOG_TAG,Constants.FETCH_ALL_THEMES_ASYNC_TASK); 
     Log.d(Constants.LOG_TAG," The url to be fetched "+params[0]); 

     try { 
      url = new URL(params[0]); 
      urlConnection = (HttpURLConnection) url.openConnection(); 

//     /* optional request header */ 
//   urlConnection.setRequestProperty("Content-Type", "application/json"); 
// 
//    /* optional request header */ 
//   urlConnection.setRequestProperty("Accept", "application/json"); 

       /* for Get request */ 
      urlConnection.setChunkedStreamingMode(0); 
      urlConnection.setDoOutput(true); 
      urlConnection.setDoInput(true); 
      urlConnection.setRequestMethod("POST"); 

      List<BasicNameValuePair> nameValuePairs = new ArrayList<BasicNameValuePair>(); 
      nameValuePairs.add(new BasicNameValuePair("location_id",params[1])); 

      outputStream = urlConnection.getOutputStream(); 
      BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream)); 
      bufferedWriter.write(writeToOutputStream(nameValuePairs)); 


      int statusCode = urlConnection.getResponseCode(); 

       /* 200 represents HTTP OK */ 
      if (statusCode == 200) { 
       inputStream = new BufferedInputStream(urlConnection.getInputStream()); 
       response = convertInputStreamToString(inputStream); 
       Log.d(Constants.LOG_TAG, " The response is " + response); 



       return true; 
      } 
      else { 
       return false; 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 

      try { 
       if(inputStream != null){ 

        inputStream.close(); 
       } 
       if(outputStream != null){ 
        outputStream.close(); 
       } 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
     return false; 

    } 

// Здесь код для writeToOutputStream

public String writeToOutputStream(List<BasicNameValuePair> keyValuePair)throws UnsupportedEncodingException{ 

    String result=""; 
    boolean firstTime = true; 

    for(BasicNameValuePair pair : keyValuePair){ 


     if(firstTime){ 

      firstTime = false; 
     } 
     else{ 

      result = result.concat("&"); 

     } 

     result = result + URLEncoder.encode(pair.getKey(), "UTF-8"); 
     result = result + "="; 
     result = result+ URLEncoder.encode(pair.getValue(),"UTF-8"); 

    } 

    Log.d(Constants.LOG_TAG," The result is "+result); 
    return result; 

} 

// Здесь код convertInputStream в строку

public String convertInputStreamToString(InputStream is) throws IOException { 

     String line=""; 
     String result=""; 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is)); 

     while((line = bufferedReader.readLine()) != null){ 

      Log.d(Constants.LOG_TAG," The line value is "+line); 
      result += line; 

     } 

      /* Close Stream */ 
     if(null!=inputStream){ 
      inputStream.close(); 
     } 

     return result; 
    } 

Вот PHP КОД

<?php 
    include 'config.php'; 
    header ('Content-Type:application/json'); 

    if(isset($_POST['location_id'])) 
    { 
     $id=$_POST['location_id']; 

     $selectThemeQuery = mysql_query("select theme_id from location_theme where location_id='$id'",$conn) or die (mysql_error()); 
     $noRows = mysql_num_rows($selectThemeQuery); 
     //echo "HI"; 
     if($noRows > 0) 
     { 
      $result = array(); 
      while($row = mysql_fetch_assoc($selectThemeQuery)) 
      { 
       $themeid = $row['theme_id']; 
       //echo "HI"; 
       $selectNameQuery = mysql_query("select theme_name,theme_image from theme where theme_id='$themeid'",$conn) or die(mysql_error()); 
       $numRows = mysql_num_rows($selectNameQuery); 

       if($numRows > 0) 
       { 
        while($rows = mysql_fetch_assoc($selectNameQuery)) 
        { 
         $name = $rows['theme_name']; 
         $image = $rows['theme_image']; 

         $result[] = array('theme_id'=>$themeid,'theme_name'=>$name, 'theme_image'=>$image); 
        } 

       } 

      } 
      //echo json_encode($result); 
         echo json_encode("Hi"); 
     } 
     else 
     { 
       $data2[] = array('Notice'=>false); 
       echo json_encode($data2); 
     } 
    } 
    else 
    { 
     echo "Not Proper Data"; 
    } 


?> 
+0

Просто предложение: Вы считали, что используете что-то, что может сделать 95% всего материала для вас? Например, POST + JSON звучит как «REST Service», для которого Spring-Web предлагает отличные инструменты (но для этого есть, вероятно, десятки других библиотек) –

+0

@FlorianSchaetz: Не могли бы вы немного рассказать, и я надеюсь, что вы отвечают на решение для Android. –

+0

'Разработчик PHP на другом конце не может получить значение параметра'. Хорошо начните рассказывать, как он хочет получить этот параметр. В противном случае мы должны понимать, вы можете опубликовать свой php-скрипт. – greenapps

ответ

1

Снимите:

urlConnection.setChunkedStreamingMode(0); 

используется буферное писатель, поэтому он может только буфер вместо записи. Чтобы заставить все было написано:

bufferedWriter.write(writeToOutputStream(nameValuePairs));   
bufferedWriter.flush(); 

А потом попросить код ответа. И не вызывайте код ответа кодом состояния.

writeToOutputStream() ??? Какое ужасное имя. Эта функция не записывается в выходной поток. Он просто создает текстовую строку.

+0

Yup, который сработал, но почему мы удалили setChunkedStreamingMode (0). Не могли бы вы рассказать. –

0

для Android, я предложил бы использовать библиотеку как Spring-Android.

Spring-Android содержит класс RestTemplate, который является довольно эффективным REST-клиентом. Например, простой запрос POST будет ...

myRestTemplate.exchange("http://www.example.net", HttpMethod.POST, new HttpEntity(...some JSON string ...), String.class); 

Для создания JSON строки, я предлагаю библиотеку как Джексон, который должен работать нормально на Android, см, например here. Не уверен, что Jackson интегрируется в Spring-Android так же хорошо, как в Spring-Web, но в любом случае использование его для создания Json Strings вручную должно работать нормально.

0

для метода поста создать строку строителя первого

StringBuilder strbul=new StringBuilder(); 

затем добавить данные как

strbul.append("name=sangeet&state=kerala"); 

затем записать в выходной поток, как

httpurlconnection.getOutput().write(strbul.toString().getBytes("UTF-8")); 

PHP скрипт будет выслано что данные по

$_POST['name'] and $_POST['state'] 
+0

Я не вижу, что помогает, поскольку я уже использую concat. Но все же попытался обеспечить результат didnt return.Thanx –