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();
?>
'only logcat message is IOException, которое происходит сразу после записи в выходной поток'. Ну, тогда вы должны точно указать, какое исключение. – greenapps
Вы используете 'Log.e()' неправильно, и именно поэтому вы не получаете необходимую информацию. Это должно быть что-то вроде «Log.e» («MyClassName», «мое описание того, что пошло не так», e) ' –
@Dan Getz Ничего себе, извините. Я полностью перешел на передачу фактического исключения из журнала. Я получаю «неожиданный конец потока». Включено редактирование выше, чтобы отразить это! –