WebServislere bağlanmak için daha önceden Volley’i incelemiştik. Şimdi ise Retrofit ile basic authentication olan bir servise post request işlemi gerçekleştireceğiz.
Projemizi oluşturduktan sonra ilk olarak internete çıkmak için izin almamız gerekiyor. AndroidManifest.xml dosyamıza aşağıdaki izni yazıyoruz.
1 2 3 4 5 |
<uses-permission android:name="android.permission.INTERNET"></uses-permission> |
build.gradle dosyasına dependency olarak refrofit kütüphanesini ekliyoruz. Retrofit bizim için convert işlemini hallediyor. Bu yüzden ikinci olarak Gson converter ekliyoruz.
1 2 3 4 5 6 |
implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'com.squareup.retrofit2:converter-gson:2.3.0' |
Bir kullanıcı kayıt işemi gerçekleştireceğiz. Bunun için kullanıcıdan isim, soyisim, email ve şifre bilgileri alacağız. xml kodları uzun olacağı için paylaşmayacağım. Bu kısmı sizler tasarlayabilirsiniz.
Kullanacağımız ui elementlerini tanımlıyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
private ProgressDialog progressDialog; private EditText txtName; private EditText txtSurname; private EditText txtEmail; private EditText txtPassword; private Button btnRegister; private void init() { txtName = findViewById(R.id.txtRegisterName); txtSurname = findViewById(R.id.txtRegisterSurname); txtEmail = findViewById(R.id.txtRegisterEmail); txtPassword = findViewById(R.id.txtRegisterPassword); btnRegister = findViewById(R.id.btnRegister); } |
Öncelikle RetrofitClient isminde thread safe singleton bir class oluşturuyoruz ve burada oluşturduğumuz refrofit objesi üzerinden işlemlerimizi gerçekleştireceğiz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class RetrofitClient { private static Retrofit retrofit; private static final String BASE_URL = "http://127.0.0.1:8090"; private RetrofitClient() { } public static synchronized Retrofit getRetrofitInstance() { if (retrofit == null) { retrofit = new retrofit2.Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; } } |
Retrofit ile request işlemleri için end-point tanımlarını yapmamız gerek. Bunun için bir interface tanımlıyoruz.
1 2 3 4 5 6 |
@POST("/users") Call<UserDTO> createUser(@Header("Authorization") String authKey, @Body User user); |
- @POST ile post metoduğunu
- @Body ile body kısmında gidecek objeyi
- @Header ile ise header kısmındaki bilgileri belirtiyoruz. Eğer sizin servisinizde authentication yoksa bu kısım sizin için olmayacak. Ama bu gerekli gibi gibi kodlamaya devam edeceğiz.
Burada UserDTO class’ını görüyoruz. Servisten dönüş tipi olarak beklediğimiz UserDTO ise şöyle olmalıdır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class UserDTO implements Serializable { @SerializedName("firstName") private String firstName; @SerializedName("lastName") private String lastName; @SerializedName("email") private String email; @SerializedName("password") private String password; //constructor ve getter / setter } |
@SerializedName annotation ile belirtiğiniz değer servisinizden dönen ve sizin pars etmek istediğiniz değer ile aynı olmalıdır.
Şimdi ise tek yapmamız gereken parçaları birleştirerek requesti gerçekleştirmek.
1 2 3 4 5 6 7 |
User user = new User(txtName.getText().toString(), txtSurname.getText().toString(), txtEmail.getText().toString(), txtPassword.getText().toString()); IUserAPI userService = RetrofitClient.getRetrofitInstance().create(IUserAPI.class); Call<UserDTO> call = userService.createUser(AuthToken.getAuthToken(), user); |
RetrofitClient’dan bir obje oluşturduk ve create metoduna servisimizin bulunduğu interface’i verdik ve bu interface’deki createUser metodunu çağırdık. Bu metod ise Call tipinde bir obje dönüyor. Bu objeyi çağırmak için şimdilik bekletiyoruz. createUser metodu iki parametre alan bir metod ve user’ı yukarıdaki gibi oluşturduk. Authentication için ise aşağıdaki gibi bir metod yazıyoruz.
Bir hata meydana geldi. Daha sonra tekrar deneyin. |
Şimdi ise yarım bıraktığımız yerden devam ediyoruz.
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 |
call.enqueue(new Callback<UserDTO>() { @Override public void onResponse(Call<UserDTO> call, retrofit2.Response<UserDTO> response) { progressDialog.dismiss(); UserDTO userResponse = response.body(); if (response.body() != null) { Intent intent = new Intent(getApplicationContext(), MainActivity.class); intent.putExtra("userResponse", userResponse); Toast.makeText(getApplicationContext(), "Başarılı", Toast.LENGTH_SHORT).show(); startActivity(intent); } else { Toast.makeText(getApplicationContext(), "Hata oluştu", Toast.LENGTH_SHORT).show(); } } @Override public void onFailure(Call<UserDTO> call, Throwable t) { progressDialog.dismiss(); Toast.makeText(getApplicationContext(), "Hata oluştu", Toast.LENGTH_SHORT).show(); Log.e(TAG, call.request().toString(), t); } }); |
RegisterActivity class’ımızın tamamı ise aşağıdaki gibidir.
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 |
public class RegisterActivity extends AppCompatActivity { public static final String TAG = "RegisterActivityTAG"; private ProgressDialog progressDialog; private EditText txtName; private EditText txtSurname; private EditText txtEmail; private EditText txtPassword; private Button btnRegister; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); init(); btnRegister.setOnClickListener(registerBtnListener); } private void init() { txtName = findViewById(R.id.txtRegisterName); txtSurname = findViewById(R.id.txtRegisterSurname); txtEmail = findViewById(R.id.txtRegisterEmail); txtPassword = findViewById(R.id.txtRegisterPassword); btnRegister = findViewById(R.id.btnRegister); } private View.OnClickListener registerBtnListener = new View.OnClickListener() { @Override public void onClick(View v) { User user = new User(txtName.getText().toString(), txtSurname.getText().toString(), txtEmail.getText().toString(), txtPassword.getText().toString()); UserValidator.validate(user); registerUser(user); } }; private void registerUser(User user) { progressDialog = new ProgressDialog(RegisterActivity.this); progressDialog.setMessage("Lütfen Bekleyiniz"); progressDialog.show(); IUserAPI userService = RetrofitClient.getRetrofitInstance().create(IUserAPI.class); Call<UserDTO> call = userService.createUser(AuthToken.getAuthToken(), user); Log.w(TAG, call.request().toString()); call.enqueue(new Callback<UserDTO>() { @Override public void onResponse(Call<UserDTO> call, retrofit2.Response<UserDTO> response) { progressDialog.dismiss(); UserDTO userResponse = response.body(); if (response.body() != null) { Intent intent = new Intent(getApplicationContext(), MainActivity.class); intent.putExtra("userResponse", userResponse); Toast.makeText(getApplicationContext(), "Kayıt başarılı.", Toast.LENGTH_SHORT).show(); startActivity(intent); } else { Toast.makeText(getApplicationContext(), "Kaydetme işlemi sırasında bir hata oluştu.", Toast.LENGTH_SHORT).show(); } } @Override public void onFailure(Call<UserDTO> call, Throwable t) { progressDialog.dismiss(); Toast.makeText(getApplicationContext(), "Kaydetme işlemi sırasında bir hata oluştu.", Toast.LENGTH_SHORT).show(); Log.e(TAG, call.request().toString(), t); } }); } } |
Faydalı olması dileğiyle.
Teşekkürler