Oluşturmaya çalıştığım, veritabanı bağlantısı olan bir web uygulama ve iletiş kurduğu bir Android uygulaması var.
Bu iki uygulamada yapmaya çalıştığım sıralı işler:
- Kullanıcıdan
idnumber
vepassword
olmak üzere iki bilgi alıpJSON
ile web uygulamasına birpost request
göndermek- Gönderilen
request
mesajını web uygulama içerisinde çözümleyip, veritabanında sorgulamak- Eğer sorgulamada bir eşleşme sağlanırsa değeri
true
olan yeni birJSON
nesnesi oluşturup cevap (response
) olarak ikinci aktiviteyi başlatması için Android uygulamasına göndermek- Eğer herhangi bir eşleşme bulunamazsa, değeri
false
olan başka birJSON
nesnesi oluşturup birtoast
nesnesi ileböyle bir kullanıcının bulunmadığını
söyleyen bir mesaj çıkararak herhangi birintent
başlatmadan kullanıcıdan doğru bilgileri girmesini beklemek
Sunucu tarafından android uygulamasına gönderilen cevaba kadar tüm süreç doğru bir şekilde ilerliyor. Ama bazı tuhaf mesajların yanısıra gönderilen cevap true
yada false
olması dikkate alınmaksızın ikinci aktivite başlatılıyor.
--------------------------Sunucu tarafında bulunan Servlet sınıfı----------------------------------------
import jdbc.model.User;
public class GetAndroidRequest extends HttpServlet {
public GetAndroidRequest() {
super();
}
private static final long serialVersionUID = 1L;
List<Users> users = new ArrayList<Users>();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
doPost(request, response);
ObjectMapper mapper = new ObjectMapper();
response.setContentType("application/json");
mapper.writeValue(response.getOutputStream(), users);
}
// doPost(): receives JSON data, parse it, map it and send back as JSON
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// receiving JSON data from request
BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
String user_credentials = "";
user_credentials = br.readLine();
ObjectMapper mapper = new ObjectMapper();
Users user = mapper.readValue(user_credentials, Users.class);
response.setContentType("application/json");
users.add(user);
int listSize = users.size() - 1;
String user_idnumber = users.get(listSize).getIdnumber();
String user_password = users.get(listSize).getPassword();
System.out.println("list: " + users);
System.out.println("list size: " + users.size());
System.out.println("user_idnumber: " + user_idnumber);
System.out.println("user_password: " + user_password);
Boolean result;
result = check(user_idnumber, user_password).get("server_result").getAsBoolean();
System.out.println("124: server_result: "+result);
if (result == true) {
mapper.writeValueAsString("accepted");
System.out.println("accepted");
mapper.writeValue(response.getOutputStream(), result);
} else if (result == false) {
mapper.writeValueAsString("rejected");
System.out.println("rejected");
mapper.writeValue(response.getOutputStream(), result);
}
}
private static JsonObject check(String idNumber, String Password) {
try {
UsersDAO user_query = new UsersDAO();
Users user = user_query.getUser(idNumber, Password);
JsonObject resp = new JsonObject();
Gson resp_in_gson = new GsonBuilder().create();
if (user != null) {
resp.addProperty("server_result", Boolean.TRUE);
resp_in_gson.toJson(resp);
System.out.println(resp);
return resp;
} else if (user == null) {
resp.addProperty("server_result", Boolean.FALSE);
resp_in_gson.toJson(resp);
System.out.println(resp);
return resp;
} else {
System.out.println("No such User with ID number : " + idNumber);
}
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("noting");
return null;
}
}
-----------------------------------------İstemci tarafında bulunan LoginActivity
aktivitesi----------------------------------------
import app.util.User;
public class LoginActivity extends Activity implements OnClickListener
{
EditText txt_id;
EditText txt_password;
Button buttonPost;
User user;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
// getting reference to the views
txt_id = (EditText) findViewById(R.id.edittext_idnumber);
txt_password = (EditText) findViewById(R.id.edittext_password);
buttonPost = (Button) findViewById(R.id.button_Post);
// add click listener to Button "POST"
buttonPost.setOnClickListener(this);
}
public String POST(String url, User user)
{
InputStream inputStream;
String result = "";
try {
// 1. create HttpClient
HttpClient httpclient = new DefaultHttpClient();
// 2. make POST request to the given URL
HttpPost httpPost = new HttpPost(url);
String json;
// 3. build jsonObject -
JSONObject jsonObject = new JSONObject();
jsonObject.accumulate("idnumber", user.getIdnumber());
jsonObject.accumulate("password", user.getPassword());
// 4. convert JSONObject to JSON to String
json = jsonObject.toString();
// 5. set json to StringEntity
StringEntity se = new StringEntity(json);
// 6. set httpPost Entity
httpPost.setEntity(se);
// 7. Set some headers to inform server about the type of the content
httpPost.setHeader("Accept", "application/json");
//httpPost.setHeader("Content-type", "application/json");
// 8. Execute POST request to the given URL
HttpResponse httpResponse = httpclient.execute(httpPost);
// 9. receive response as inputStream
inputStream = httpResponse.getEntity().getContent();
// 10. convert inputstream to string
if(inputStream != null)
result = convertInputStreamToString(inputStream);
else
result = "Did not work!";
// 11. get HTTP post status
StatusLine statusLine = httpResponse.getStatusLine();
Log.v("result", result);
/*if ( result.toString().equals("true") )
{
return result;
} else if ( result.toString().equals("false") ){
Toast.makeText(getBaseContext(), "No such user", Toast.LENGTH_LONG).show();
Log.v("----------->", result);
return null;
}*/
} catch (ClientProtocolException e) {
Log.w("HTTP2:", e);
} catch (IOException e) {
Log.w("HTTP3:", e);
} catch (Exception e) {
Log.d("!!Exception!!", e.getLocalizedMessage());
}
return result;
}
@Override
public void onClick(View view)
{
switch(view.getId()){
case R.id.button_Post:
{
// If any idnumber or password NOT entered
if( !validate() )
{
Toast.makeText(getBaseContext(), "Enter some data!", Toast.LENGTH_LONG).show();
} else {
// call AsynTask to perform network operation on separate thread
String webApp_URL_overIP = "http://192.168.1.100:8080/WebApp/GetAndroidRequest";
Intent intent = new Intent(LoginActivity.this, HelpActivity.class);
startActivity(intent);
finish();
}
break;
}
}
}
private class HttpAsyncTask extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... urls)
{
user = new User();
user.setIdnumber(txt_id.getText().toString());
user.setPassword(txt_password.getText().toString());
return POST(urls[0],user);
}
@Override
protected void onPostExecute(String result)
{
super.onPostExecute(result);
if ( doInBackground(result).equals(false) || ( doInBackground(result).equals("false") ) )
{
Toast.makeText(getBaseContext(), "No such User! ", Toast.LENGTH_LONG).show();
Log.d("-----------", "nO Such user mesajı");
} else if ( ( doInBackground(result).equals(true) ) || ( doInBackground(result).equals("true") ) ) {
Toast.makeText(getBaseContext(), "Success!!!!! ", Toast.LENGTH_LONG).show();
Log.d(doInBackground(result), "Success!!!!!");
}
}
@Override
protected void onCancelled(String s) {
super.onCancelled();
}
}
private boolean validate()
{
if(txt_id.getText().toString().trim().equals(""))
{
return false;
}else if(txt_password.getText().toString().trim().equals(""))
{
return false;
}else
{
return !((txt_password.getText().toString().equals("")) && (txt_id.getText().toString().trim().equals("")));
}
private static String convertInputStreamToString(InputStream inputStream) throws IOException
{
BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
String line;
String result = "";
while((line = bufferedReader.readLine()) != null)
result += line;
inputStream.close();
return result;
}
}
-------------------------------Hem Sunucu hem de İstemci tarafında aynı olan User
model sınıfı-----------------------------
public class Users {
private String idnumber;
private String password;
public Users() {
}
public Users(String idnumber, String password) {
this.idnumber = idnumber;
this.password = password;
}
public String getIdnumber() {
return idnumber;
}
public void setIdnumber(String idnumber) {
this.idnumber = idnumber;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [idnumber=" + idnumber + ", password=" + password + "]";
}
}
Eşleşme bulunan bir girş bilgisi post request
edildiğinde oluşan çıktı mesajları:
--------------------------------------------------------
Server Side
--------------------------------------------------------
list: [User [idnumber=046789051865, password=641102331]]
list size: 1
user_idnumber: 046789051865
user_password: 641102331
*****************
Connecting to database...
*******************
{"server_result":true}
server_result: true
accepted
--------------------------------------------------------
Client Side
--------------------------------------------------------
I/ActivityManager﹕ Starting: Intent
V/result﹕ <!>app.LoginActivity 125<!> true
D/!!Exception!!﹕ <i>app.LoginActivity 121<!> Target host must not be null, or set in parameters.
D/!!Exception!!﹕ <i>app.LoginActivity 121<!> Target host must not be null, or set in parameters.
D/!!Exception!!﹕ <i>app.LoginActivity 121<!> Target host must not be null, or set in parameters.
D/!!Exception!!﹕ <i>app.LoginActivity 121<!> Target host must not be null, or set in parameters.
Herhangi bir eşleşme bulunmayan bir giriş bilgisi post request
edildiğinde oluşan çıktı mesajları:
--------------------------------------------------------
Server Side
--------------------------------------------------------
list: [User [idnumber=00000, password=00000]]
list size: 1
user_idnumber: 00000
user_password: 00000
*****************
Connecting to database...
*******************
{"server_result":false}
server_result: false
rejected
--------------------------------------------------------
Client Side
--------------------------------------------------------
I/ActivityManager﹕ Starting: Intent
V/result﹕ <!>app.LoginActivity 125<!> false
D/!!Exception!!﹕ <i>app.LoginActivity 121<!> Target host must not be null, or set in parameters.
D/!!Exception!!﹕ <i>app.LoginActivity 121<!> Target host must not be null, or set in parameters.
D/!!Exception!!﹕ <i>app.LoginActivity 121<!> Target host must not be null, or set in parameters.
D/!!Exception!!﹕ <i>app.LoginActivity 121<!> Target host must not be null, or set in parameters
Her iki şekilde de intent
başlatılıyor. Esasında false
olarak gönderilen cevap ile intent
başlatılmaması gerekiyor. Sanıyorum onPostExecute()
metodunda yanlışlık var, yada ben HttpAsyncTask
sınıfını hiç anlamadım.
Sorunun uzun olmasından ötürü kusurum affola. Görüşlerinizi sabırsızlıkla bekliyorum. Saygılar.