Как передать аргумент с помощью POST, используя HttpUrlConnection

1

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

Я заранее извиняюсь, так как я только начинаю учить себя всем базам данных, связи между приложением и сервером/базой данных, а также 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;
}

И вот мой php-скрипт на сервере. Мне также нужна небольшая помощь с подготовленными заявлениями, поэтому не надо бить меня над "id = 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 an IOException, which occurs just after writing to the output stream . Ну, тогда вы должны опубликовать, какое именно исключение.
  • 1
    Вы неправильно используете Log.e() , и поэтому не получаете нужную информацию. Это должно быть что-то вроде Log.e("MyClassName", "my description of what went wrong", e)
Показать ещё 1 комментарий
Теги:
post
httpurlconnection

3 ответа

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.

1

Сообщение от android:

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 устарел
Показать ещё 2 комментария
0

Изображение 174551

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
    Круто, брат. Я понимаю

Ещё вопросы

Сообщество Overcoder
Наверх
Меню