سلام دوستان عزیر در این سری از آموزش برنامه نویسی اندروید به آموزش Retrofit 2 در اندروید می پردازیم در آموزش های قبلی از Retrofit استفاده کردیم و در این آموزش نحوه کار با Retrofit 2 HTTP Client قرار میدهیم در ادامه با ما همراه باشید تا نحوه Post کردن اطلاعات با استفاده از این کتابخانه فوق العاده (Retrofit) را یاد گیرید.
برای اطلاعات بیشتر در مورد کتابخانه Retrofit به مقاله زیر مراجعه کنید.
Retrofit چیست ؟
ما در این آموزش از سه کتابخانه استفاده می کنیم اولی Retrofit دومی Gson و سومی Converter مربوط به Gson از دو کتابخانه آخری به منظور پارس Json استفاده می شود (برای تبدیل به کلاس Pojo و استفاده از داده های آن)
ابتدا وارد فایل Build.gradle از نوع Module شده و در بخش dependencies سه خط زیر را کپی کرده و دکمه sync را بزنید.
dependencies
1 2 3 | compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.google.code.gson:gson:2.6.1' compile 'com.squareup.retrofit2:converter-gson:2.1.0' |
وارد فایل AndroidManifest شده و دسترسی زیر را اضافه کنید.
Permision - AndroidManifest
1 | <uses-permission android:name="android.permission.INTERNET" /> |
Post.class
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 | package ir.programchi.model; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Post { @SerializedName("title") @Expose private String title; @SerializedName("body") @Expose private String body; @SerializedName("userId") @Expose private Integer userId; @SerializedName("id") @Expose private Integer id; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Override public String toString() { return "Post{" + "title='" + title + '\'' + ", body='" + body + '\'' + ", userId=" + userId + ", id=" + id + '}'; } } |
یک کلاس به نام RetrofitClient.java ایجاد کنید و کدهای زیر را در آن قرار دهید.
RetrofitClient.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | package ir.programchi; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class RetrofitClient { private static Retrofit retrofit = null; public static Retrofit getClient(String baseUrl) { if (retrofit==null) { retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; } } |
پس یک فایل به نام APIService.java ایجاد کرده و کدهای زیر را در آن قرار دهید.
APIService.class
1 2 3 4 5 6 7 8 9 10 11 12 13 | package ir.programchi; import com.chikeandroid.retrofittutorial2.data.model.Post; import retrofit2.Call; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; public interface APIService { @POST("/posts") @FormUrlEncoded Call<Post> savePost(@Field("title") String title, @Field("body") String body, @Field("userId") long userId); } |
در نهایت داده به این آدرس Post می شود
Post
1 | http://jsonplaceholder.typicode.com/posts |
و درنهایت یک کلاس به نام ApiUtils داریم که با فراخوانی آن عمل ارسال Request انجام می شود.
پس یک کلاس به نام ApiUtils.java ایجاد کرده و کدهای زیر را در آن قرار دهید.
ApiUtils.class
1 2 3 4 5 6 7 8 | package ir.programchi; public class ApiUtils { private ApiUtils() {} public static final String BASE_URL = "http://jsonplaceholder.typicode.com/"; public static APIService getAPIService() { return RetrofitClient.getClient(BASE_URL).create(APIService.class); } } |
یک لاایه درست کنید و کدهای زیر را در آن قرار دهید (در اینجا لایه ما activity_main.xml است.)
activity_main.xml
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 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_post" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.chikeandroid.retrofittutorial2.AddEditPostActivity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:textAppearance="@style/TextAppearance.AppCompat.Title" android:text="Programchi.ir :D"/> <EditText android:id="@+id/et_title" android:layout_marginTop="18dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/hint_title"/> <EditText android:id="@+id/et_body" android:lines="4" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/hint_body"/> <Button android:id="@+id/btn_submit" android:layout_marginTop="18dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorAccent" android:textColor="@android:color/white" android:text="@string/action_submit"/> <TextView android:id="@+id/tv_response" android:layout_marginTop="35dp" android:visibility="gone" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> |
MainActivity.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 | private TextView mResponseTv; private APIService mAPIService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText titleEt = (EditText) findViewById(R.id.et_title); final EditText bodyEt = (EditText) findViewById(R.id.et_body); Button submitBtn = (Button) findViewById(R.id.btn_submit); mResponseTv = (TextView) findViewById(R.id.tv_response); mAPIService = ApiUtils.getAPIService(); submitBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String title = titleEt.getText().toString().trim(); String body = bodyEt.getText().toString().trim(); if(!TextUtils.isEmpty(title) && !TextUtils.isEmpty(body)) { sendPost(title, body); } } }); } public void sendPost(String title, String body) { mAPIService.savePost(title, body, 1).enqueue(new Callback<Post>() { @Override public void onResponse(Call<Post> call, Response<Post> response) { if(response.isSuccessful()) { showResponse(response.body().toString()); Log.i(TAG, "post submitted to API." + response.body().toString()); } } @Override public void onFailure(Call<Post> call, Throwable t) { Log.e(TAG, "Unable to submit post to API."); } }); } public void showResponse(String response) { if(mResponseTv.getVisibility() == View.GONE) { mResponseTv.setVisibility(View.VISIBLE); } mResponseTv.setText(response); } |
این آموزش هم به پایان رسید.
موفق و پیروز باشید.
استفاده از volley که خیلی راحت تره چه برتری های داره که ازretrofit استفاده کنیم؟
سلام و درود
لینک زیر را مطالعه کنید.
https://programchi.ir/2018/08/24/%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87-%DA%A9%D8%AA%D8%A7%D8%A8%D8%AE%D8%A7%D9%86%D9%87-volley-%D9%88-retrofit/
موفق و پیروز باشید.
سلام ؛ من مشابه آموزش انجام دادم ولی این ارور کلافم کرده (کلی هم سرچ کردم ولی هر کاری کردم نشد که نشد) لطفا راهنمایی کنید ؛
Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $
* در ضمن با postman تست کردم سالمه با اپلیکیشن هم این ارور رو میده ولی دیتاها رو تو دیتابیس سرور ثبت میکنه !!
در واقع قسمت onresponse اصلا کار نمیکنه همش onfailure اجرا میشه ..
سلام و درود مثل زیر عمل کنید.
این راهم جواب نمیده متاسفانه … ارور زیر رو میده :
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path$
سلام خسته نباشید. به این ارور برخورد کردم و هرکاری می کنم درست نمیشه