در این پست قصد دارم نحوه استفاده از کتابخانه retrofit برای فراخوانی سرویس web api را اموزش دهم. فرض بر این است که به web api مسلط هستید. اما به نمونه ای از سرویس ایجاد شده در web api نیز اشاره خواهد شد:

در کلاس زیر نمونه ای دو متد در Web api را مشاهده میکنید:

public class BankController : ApiController
    {
        private Entities db = new Entities();

        // GET api/Bank
        public IQueryable<tblBank> GettblBanks()
        {
            return db.tblBanks;
        }

        // GET api/Bank/5
        [ResponseType(typeof(tblBank))]
        public async Task<IHttpActionResult> GettblBank(string id)
        {
            tblBank tblbank = await db.tblBanks.FindAsync(id);
            if (tblbank == null)
            {
                return NotFound();
            }

            return Ok(tblbank);
        } }

دقت کنید برای نمایش دیتا به فرمت json در WebApiConfig تکه کد زیر اضافه شد:

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        }
    }


در آندروید استودیو یک کلاس به صورت زیر تعریف کنید که معرف فرمت خروجی شما خواهد بود: (دقت کنید که SerializedName باید با نام پروپرتی های شما در json یکسان باشد یعنی با نام پروپرتی های کلاس مدل در web api)

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Bank {
    @SerializedName("CODE")
    @Expose
    private String code;

    @SerializedName("BANK_NAME")
    @Expose
    private String bank_name;

    @SerializedName("PROPERTY_NAME")
    @Expose
    private String property_name;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getBank_name() {
        return bank_name;
    }

    public void setBank_name(String bank_name) {
        this.bank_name = bank_name;
    }

    public String getProperty_name() {
        return property_name;
    }

    public void setProperty_name(String property_name) {
        this.property_name = property_name;
    }
}

سپس کلاس زیر برای تعریف سرویسهای web api در اندروید:

import java.util.List;

import retrofit.Callback;
import retrofit.http.Body;
import retrofit.http.DELETE;
import retrofit.http.GET;
import retrofit.http.POST;
import retrofit.http.PUT;
import retrofit.http.Path;

public interface BankService {

    @GET("/api/Bank")
    public void getBank(Callback<List<Bank>> callback);
   
    @GET("/api/Bank/{id}")
    public void getBankById(@Path("id") String id,Callback<Bank> callback);
	
    @DELETE("/api/Bank/{id}")
    public void deleteBankById(@Path("id") String id,Callback<Bank> callback);

    @PUT("/api/Bank/{id}")
    public void updateBankById(@Path("id") String id,@Body Bank bank,Callback<Bank> callback);

    @POST("/api/Bank")
    public void addBank(@Body Bank bank,Callback<Bank> callback);
}
و کلاس زیر برای معرفی url‌سرویس در اندروید:
public class RestService {
    private static final String URL = "http://your-server-ip/";
    private retrofit.RestAdapter restAdapter;
    private BankService apiService;

    public RestService()
    {
        restAdapter = new retrofit.RestAdapter.Builder()
                .setEndpoint(URL)
                .setLogLevel(retrofit.RestAdapter.LogLevel.FULL)
                .build();

        apiService = restAdapter.create(BankService.class);
    }

    public BankService getService()
    {
        return apiService;
    }
}

و در آخر در اکتیویتی مورد نظر:

import java.util.List;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;

public class MainActivity extends AppCompatActivity{
		
    RestService restService;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        restService = new RestService();
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.update) {
        } else if (id == R.id.getBank) {
            String bankId = "10";
            restService.getService().getBankById(bankId, new Callback<Bank>() {
                @Override
                public void success(Bank bank, Response response) {
                    Toast.makeText(MainActivity.this, bank.getBank_name(), Toast.LENGTH_LONG).show();
                }

                @Override
                public void failure(RetrofitError retrofitError) {
                    Toast.makeText(MainActivity.this, retrofitError.getMessage().toString(), Toast.LENGTH_LONG).show();
                }
            });
        } else if (id == R.id.getAllBanks) {
restService.getService().getBank(new Callback<List<Bank>>() { @Override public void success(List<Bank> banks, Response response) { Toast.makeText(MainActivity.this, String.format("%s",banks.size()), Toast.LENGTH_LONG).show(); } @Override public void failure(RetrofitError retrofitError) { Toast.makeText(MainActivity.this, retrofitError.getMessage().toString(), Toast.LENGTH_LONG).show(); } }); } } }

برای استفاده از retrofit نیاز به کتابخانه هایی دایرد که در فایل زیر یکجا در اختیار شما قرار میگیرد: دریافت حجم: 598 کیلوبایت

موفق باشید

میلاد