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();
?>
Похоже, я это исправил!
Я изменился
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.
Сообщение от 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;
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
}
});
only logcat message is an IOException, which occurs just after writing to the output stream
. Ну, тогда вы должны опубликовать, какое именно исключение.Log.e()
, и поэтому не получаете нужную информацию. Это должно быть что-то вродеLog.e("MyClassName", "my description of what went wrong", e)