2015-07-09 3 views
1

EDIT: Я выясню, что упаковка OutputStreamWriter в BufferedWriter вызывала проблему, поэтому избавилась от оболочки и моего POST. Все еще удивлялся, почему причиной послужил BufferedWriter.Как передать аргумент с помощью POST с использованием HttpUrlConnection

Извиняюсь заранее, так как я только начинаю учить себя всем базам данных, связи между приложением и сервером/базой данных, а также php.

Другие подобные вопросы не получили ответа.

У меня возникли проблемы с пониманием того, что мне не хватает, когда дело доходит до простого POST с использованием HttpUrlConnection из моего приложения для Android в php-скрипт на локально размещенном сервере. Мне нужно взять идентификатор пользователя из приложения Android, передать его скрипту php в качестве аргумента и выполнить поиск этого идентификатора в таблице базы данных, называемой пользователями. Я также хотел бы использовать методы и классы, которые не устарели.

Я включил разрешения Интернета в манифест андроида. Я использую XAMPP, и я подтвердил, что мои серверы запущены, и если я получаю доступ к URL через веб-браузер, я получаю ответ JSON, который я ищу.

Мое единственное сообщение logcat - это IOException, которое происходит сразу после записи в выходной поток. EDIT:Конкретным исключением является «неожиданный конец потока».

Вот код в моем классе AsyncTask:

protected String doInBackground(String... params) { 

    String userID = params[0]; 
    Pair<String, String> phpParameter = new Pair<>("userID", userID); 
    String result = ""; 

    try { 
     URL url = new URL("url of locally-hosted php script"); 
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

     // prepare request 
     urlConnection.setRequestMethod("POST"); 
     urlConnection.setDoInput(true); 
     urlConnection.setDoOutput(true); 
     urlConnection.setReadTimeout(10000); 
     urlConnection.setConnectTimeout(15000); 
     urlConnection.setFixedLengthStreamingMode(userID.getBytes("UTF-8").length); 

     // upload request 
     OutputStream outputStream = urlConnection.getOutputStream(); 
     BufferedWriter writer = new BufferedWriter(
       new OutputStreamWriter(outputStream, "UTF-8")); 
     writer.write(phpParameter.first + "=" + phpParameter.second); 
     writer.close(); 
     outputStream.close(); 

     // read response 
     BufferedReader in = new BufferedReader(
       new InputStreamReader(urlConnection.getInputStream())); 

     String inputLine; 
     StringBuffer response = new StringBuffer(); 
     while ((inputLine = in.readLine()) != null) { response.append(inputLine); } 
     in.close(); 

     result = response.toString(); 

     // disconnect 
     urlConnection.disconnect(); 
    } catch (MalformedURLException e) { 
     Log.e("Malformed URL Exception", "Malformed URL Exception"); 
    } catch (IOException e) { 
     Log.e("IOException", "IOException"); 
    } 

    return result; 
} 

А вот мой скрипт на сервере. Я также нужна помощь с заранее подготовленными заявлениями, так что не бейте меня над Ид = 1 ':

<?php 

mysql_connect("host","username","password"); 

mysql_select_db("Database"); 

print($_POST); 

$sql = mysql_query("select * from users where id = 1"); 

while($row = mysql_fetch_assoc($sql)) 
$output[] = $row; 

print(json_encode($output)); // this will print the output in json 
mysql_close(); 

?> 
+0

'only logcat message is IOException, которое происходит сразу после записи в выходной поток'. Ну, тогда вы должны точно указать, какое исключение. – greenapps

+1

Вы используете 'Log.e()' неправильно, и именно поэтому вы не получаете необходимую информацию. Это должно быть что-то вроде «Log.e» («MyClassName», «мое описание того, что пошло не так», e) ' –

+0

@Dan Getz Ничего себе, извините. Я полностью перешел на передачу фактического исключения из журнала. Я получаю «неожиданный конец потока». Включено редактирование выше, чтобы отразить это! –

ответ

0

Похоже, я установил ее!

Я изменил

BufferedWriter writer = new BufferedWriter(
      new OutputStreamWriter(outputStream, "UTF-8")); 
writer.write(phpParameter.first + "=" + phpParameter.second); 

к

OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8"); 
writer.write(userID); 

По некоторым причинам, акт обертывания выходного потока писателя в буферном писателе был разорвать его. Я не знаю почему.

После того, как я сделал вышеуказанное изменение, я получил сообщение об ошибке, заявив, что поток ожидает 1 байт, но получил 8, поэтому я написал только userID, что и передал в setFixedLengthStreamingMode.

0

enter image description here

Bro, используя пользовательский LIB, как loopjs async httplib будет проще. Ознакомьтесь с этим примером кода того, что вы пытаетесь сделать,

Зачем вам его использовать? Все исключения и задачи async обрабатываются в фоновом режиме, упрощая вашу базу кода.

AsyncHttpClient client = new AsyncHttpClient(); 
client.post(YOUR_POST_URL, new AsyncHttpResponseHandler() { 

@Override 
public void onStart() { 
    // called before request is started 
} 

@Override 
public void onSuccess(int statusCode, Header[] headers, byte[] response) { 
    // called when response HTTP status is "200 OK" 
} 

@Override 
public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) { 
    // called when response HTTP status is "4XX" (eg. 401, 403, 404) 
} 

@Override 
public void onRetry(int retryNo) { 
    // called when request is retried 
} 
    }); 
+0

Я ценю предложение использовать внешнюю библиотеку, которая может быть проще, но мне интересно узнать, что не так с кодом, который я написал, и почему, а не сначала прыгать на что-то другое, потому что это может быть проще. Я посмотрю, как только этот вопрос будет дан, и я могу сравнить два метода. –

+0

Прохладный брат. Я понимаю – silberbaum

1

Чтобы разместить от андроида:

public class HttpURLConnectionHandler 
{ 
    protected String urlG = "http://192.168.43.98/yourdirectory/"; 
    public String sendText(String text) 
    { 
    try { 
     URL url = new URL(urlG+"receiveData.php"); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestMethod("POST"); 

     // para activar el metodo post 
     conn.setDoOutput(true); 
     conn.setDoInput(true); 
     DataOutputStream wr = new DataOutputStream(
      conn.getOutputStream()); 
     wr.writeBytes("mydata="+text); 
     wr.flush(); 
     wr.close(); 

     InputStream is = conn.getInputStream(); 
     BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
     String line; 
     StringBuffer response = new StringBuffer(); 
     while((line = rd.readLine()) != null) { 
      response.append(line); 
      response.append('\r'); 
     } 
     rd.close(); 
     return response.toString(); 
    } 
    catch(Exception e){ return "error";} 
    } 
} 

PHP файл:

$x = $_POST['mydata']; 
echo $x; 
+0

Спасибо за ответ, но я упомянул в своем вопросе, что хотел бы использовать методы и классы, которые не устарели. HttpClient, HttpPost, HttpResponse и т. Д. Устарели на уровне API 22 в соответствии с документами разработчика Android. –

+0

httpclient устарел –

+0

@NaszNjokaSr. обновлено до httpUrlConnection –

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