Приветствую, уважаемые программисты.
Изучаю программирование на Android. Пытаюсь сделать простенькое клиент-серверное приложение.
Задачу следующая - с android-а на сервер отправляется post запрос с данными для регистрации пользователя, сервер в ответ отправляет "yes" или "no", в зависимости от того произошла регистрация или нет.
Веб-сервер - Apache/2.4.17 (Win64) PHP/5.6.15.
Клиент - эмулятор Android API 15.
Код на Андроид:
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
| private void insertToDatabase(String name, String pass, String firs, String last, String uinf){
class SendPostReqAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
String paramUsername = params[0];
String paramPassword = params[1];
String paramFirstName = params[2];
String paramLastName = params[3];
String paramUserInfo = params[4];
String name = editTextUsername.getText().toString();
String pass = editTextPassword.getText().toString();
String firs = editTextFirstName.getText().toString();
String last = editTextLastName.getText().toString();
String uinf = editTextUserInfo.getText().toString();
HashMap<String, String> postDataParams = new HashMap<String, String>();
postDataParams.put("username", name);
postDataParams.put("password", pass);
postDataParams.put("first_name", firs);
postDataParams.put("last_name", last);
postDataParams.put("user_info", uinf);
URL url;
String response = "";
try {
url = new URL("http://mysyte.ru/test/create-new-user.php");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
writer.write(getPostDataString(postDataParams));
writer.flush();
writer.close();
os.close();
int responseCode=conn.getResponseCode();
if (responseCode == HttpsURLConnection.HTTP_OK) {
String line;
BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line=br.readLine()) != null) {
response+=line;
}
}
else {
response="";
throw new HttpException(responseCode+"");
}
} catch (Exception e) {
e.printStackTrace();
}
mAnswer = response;
return mAnswer;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(mAnswer);
Toast.makeText(getApplicationContext(), mAnswer, Toast.LENGTH_LONG).show();
if (mAnswer == "no")
{Toast.makeText(getApplicationContext(),"Не получилось, попробуйте другой логин", Toast.LENGTH_SHORT).show();}
else if (mAnswer == "yes")
{Toast.makeText(getApplicationContext(),"Вы зарегистрированы", Toast.LENGTH_SHORT).show();
SharedPreferences.Editor editor = mSettings.edit();
editor.putString(APP_PREFERENCES_USERNAME, mUsername);
editor.putString(APP_PREFERENCES_PASSWORD, mPassword);
editor.putString(APP_PREFERENCES_FIRST_NAME, mFirstName);
editor.putString(APP_PREFERENCES_LAST_NAME, mLastName);
editor.putString(APP_PREFERENCES_USER_INFO, mUserInfo);
editor.apply();
Intent intent_inbox = new Intent(RegistrationActivity.this, AboutActivity.class);
startActivity(intent_inbox);
}
}
}
SendPostReqAsyncTask sendPostReqAsyncTask = new SendPostReqAsyncTask();
sendPostReqAsyncTask.execute(name, pass, firs, last, uinf);
} |
|
Код на PHP
PHP |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| <?php
define('HOST','localhost');
define('USER','root');
define('PASS','000000');
define('DB','test_db');
$con = mysqli_connect(HOST,USER,PASS,DB);
$username = $_POST['username'];
$password = $_POST['password'];
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
$user_info = $_POST['user_info'];
$sql = "insert into userlist (username, user_password, user_first_name, user_last_name, user_info)
values ('$username','$password', '$first_name', '$last_name', '$user_info')";
if(mysqli_query($con,$sql)){
echo 'yes';
}
else{
echo 'no';
}
mysqli_close($con);
?> |
|
По задумке приложение получив ответ ("yes" или "no") сначала выводит этот ответ в виде всплывающего сообщения, потом обрабатывает полученный ответ.
Так вот проблема в том, что ответ приложение выводит, но не обрабатывает.
С БД все в порядке - данные заносятся исправно. Проблема именно в обработке ответа на стороне клиента.
Если я правильно понимаю, это связано с кодировками, т.е. веб-сервер отправляет ответ в UTF-8, а в Java String-и в UTF-16 или UCS-2(точно не знаю). Пытался поменять кодировку файла create-new-user.php на UCS-2 в Notepad++ - в этом случае отправка данных вообще не работает и во всплывающем сообщении отображается содержимое всего файла(с двумя непонятными символами перед текстом).
Кто уже сталкивался с проблемой или знает как решить - подскажите нубу