
рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬрд┐рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдВрдбреНрд░реЙрдЗрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдмреАрдЪ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреБрдЫ рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдорд╛рдирдХ рднреА рдорд╛рдирддреЗ рд╣реИрдВред рдЗрд╕ рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреЗ рдХрдИ рдХрд╛рд░рдг рд╣реИрдВ: рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ REST рдПрдкреАрдЖрдИ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ, рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рдорджрдж рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЕрдиреБрд░реЛрдз рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ рдХреЛ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
рдирд┐рдореНрди рдирд┐рд░реНрднрд░рддрд╛ build.gradle
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
рд╣рдо GSON рдХрд╛ рдЙрдкрдпреЛрдЧ JSON рдХреЛ POJO рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ JSON рдХреЛ POJO рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, build.gradle
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ:
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
рдпрджрд┐ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрднреА рддрдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ AndroidManifest
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд▓рд╛рдЗрди рдЬреЛрдбрд╝рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ:
<uses-permission android:name="android.permission.INTERNET"/>
рдирд┐рд░реНрднрд░рддрд╛ рдЬреБрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
NetworkService
рдирд╛рдордХ рдПрдХ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдБ:
public class NetworkService { }
рдпрд╣ рдХреНрд▓рд╛рд╕ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕реНрдЯреИрдЯрд┐рдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдФрд░ рдПрдХ рдлрдВрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ рдЬреЛ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рдорд╛рди рд╣реА рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рд░рд┐рдЯрд░реНрди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рдкреИрдЯрд░реНрди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рджреЗрдЦреЗрдВ , рдЬрд┐рд╕рдореЗрдВ рдЬрд╛рд╡рд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред
public class NetworkService { private static NetworkService mInstance; public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } }
рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рд╣рдо JSONPlaceholder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдХрд▓реА рдСрдирд▓рд╛рдЗрди REST API рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
https://jsonplaceholder.typicode.com
рдЕрдм рд╣рдо NetworkService
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ рдШреЛрд╖рд┐рдд рдФрд░ рдЖрд░рдВрдн рдХрд░реЗрдВрдЧреЗ:
public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } }
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреВрд░реНрдг рд╣реИ, рдЕрдм рд╣рдореЗрдВ рдЙрди рд╕рдорд╛рдкрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдХрд░реЗрдВрдЧреЗред
рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдЬреЛрдбрд╝рдирд╛
JSONPlaceHolderApi
рдирд╛рдо рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдБ:
public interface JSONPlaceHolderApi { }
JSONPlaceHolder рд╕рд╛рдЗрдЯ рдкрд░ , URL /posts/id
рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рд╣реИ рдЬреЛ рдЙрдЪрд┐рдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджреЗрд╢ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдПрдХ GET рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ:
{ "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо JSON рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд POJO рдмрдирд╛рдПрдВрдЧреЗ:
public class Post { @SerializedName("userId") @Expose private int userId; @SerializedName("id") @Expose private int id; @SerializedName("title") @Expose private String title; @SerializedName("body") @Expose private String body; public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public int getId() { return id; } public void setId(int id) { this.id = 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; } }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рд╕рд░рд▓ POJO рд╡рд░реНрдЧ рд╣реИред рд╣рдордиреЗ рд╡рд╣рд╛рдВ рдирд╛рдо рдкрд╛рд╕ рдХрд░рддреЗ рд╣реБрдП @SerializedName()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛ред рдпреЗ рдирд╛рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдкреАрдЖрдИ рд╕реЗ рд▓реМрдЯреЗ JSON рдбреЗрдЯрд╛ рдХреА рдХреБрдВрдЬрд┐рдпрд╛рдБ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЕрдкрдиреА @SerializedName()
рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдирд╛рдо рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ @SerializedName()
рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдирд╛рдо JSON рдореЗрдВ рдореМрдЬреВрдж рд╣реИред
рдЙрдкрд░реЛрдХреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ, рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
public interface JSONPlaceHolderApi { @GET("/posts/{id}") public Call<Post> getPostWithID(@Path("id") int id); }
рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ GET рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрд╕ рд╡рд┐рдзрд┐ рдкрд░ @GET
рдПрдиреЛрдЯреЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ @GET
, рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рд╡рд╣ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдкреВрд░реНрдг URL рдирд╣реАрдВ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ BASE_URL
рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ BASE_URL
рдХреЛ BASE_URL
рд╡рд░реНрдЧ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╢реЗрд╖ URL рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред
рд╡рд╛рдкрд╕реА рдХреЗ рддрд░реАрдХреЗ рдХреЛ Call<Post>
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред Call
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рд╕реАрдзреЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╡рд░реНрдЧ рд╣реИред рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо JSON рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдордиреЗ Post
рдкрд╛рд╕ рдХрд░ рд▓реА рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣ рд╡рд╕реНрддреБ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо JSON рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдордиреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдФрд░ @Path
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рд╣рдордиреЗ id
рд▓рд┐рдЦрд╛ рдерд╛ред рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ рдпрд╣ рдорд╛рди рд▓реЗрдЧрд╛ рдФрд░ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдкрд░ {id}
рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рд╣рдо рдорд╛рди 1 рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛ - /posts/1
, рдпрджрд┐ рд╣рдо рдорд╛рди 10 рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛ - /posts/10
ред
рдЕрдм рд╣рдореЗрдВ JSONPlaceHolderApi
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JSONPlaceHolderApi
рдХреА JSONPlaceHolderApi
рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, create()
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } public JSONPlaceHolderApi getJSONApi() { return mRetrofit.create(JSONPlaceHolderApi.class); } }
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ JSONPlaceHolderApi
рд╕реЗ JSONPlaceHolderApi
рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
NetworkService.getInstance() .getJSONApi() .getPostWithID(1) .enqueue(new Callback<Post>() { @Override public void onResponse(@NonNull Call<Post> call, @NonNull Response<Post> response) { Post post = response.body(); textView.append(post.getId() + "\n"); textView.append(post.getUserId() + "\n"); textView.append(post.getTitle() + "\n"); textView.append(post.getBody() + "\n"); } @Override public void onFailure(@NonNull Call<Post> call, @NonNull Throwable t) { textView.append("Error occurred while getting request!"); t.printStackTrace(); } });
рд▓реМрдЯреА рд╣реБрдИ Call
рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ enqueue
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ Callback<T>
рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред onResponse
рд╣рдореЗрдВ Response<Post>
рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ Post
рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред Post
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡рдпрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо response.body()
рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдмрд╛рдХреА рдХреЛрдб рдЖрдЧреЗ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рдмрд┐рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛
JSONPlaceHolder
API рдХреЗ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
@GET("/posts") public Call<List<Post>> getAllPosts();
рд╕рднреА рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдмрджрд▓рд╛ред
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛
рдпрджрд┐ рдЖрдк рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП @Query()
рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
@GET("/posts") public Call<List<Post>> getPostOfUser(@Query("userId") int id);
рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рд╡рд┐рдзрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдорд╛рди 6 рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдЕрдЧрд▓рд╛ рд╣реЛрдЧрд╛ - /posts?userId=6
ред
рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛
POST рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
@POST("/posts") public Call<Post> postData(@Body Post data);
рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╛рд░рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП @Body
рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ Gson рдХрд╛ рдЙрдкрдпреЛрдЧ @Body
рдХреЛ JSON рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдЧрд╛ред
рдХрдИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╢реНрди рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИред
рдЕрд╡рд░реЛрдзрди рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ
рд░реЗрдЯреНрд░реЛрдлрд╝рд┐рдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрд╡рд░реЛрдзрди рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓реЙрдЧрдХреИрдЯ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рдПрдХ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдЬрд╛рджреВ рдХреЛ рджреЗрдЦреЗрдВред рдирд┐рдореНрди рдирд┐рд░реНрднрд░рддрд╛ build.gradle
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
implementation 'com.squareup.okhttp3:logging-interceptor:3.8.0'
NetworkService
рд╡рд░реНрдЧ рдХреЛ рдЗрд╕ рддрд░рд╣ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:
public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient.Builder client = new OkHttpClient.Builder() .addInterceptor(interceptor); mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .client(client.build()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } public JSONPlaceHolderApi getJSONApi() { return mRetrofit.create(JSONPlaceHolderApi.class); } }
рдЕрдм, рдЬрдм рдЖрдк рдХреЛрдИ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ URL, рд╣реЗрдбрд░, рдмреЙрдбреА рд╕рд╣рд┐рдд рдЙрд╕рдХреЗ рд╕рднреА рдбреЗрдЯрд╛ рд▓реЙрдЧ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдВрдЧреЗ:
D/OkHttp: <-- 200 https://jsonplaceholder.typicode.com/posts/1 (3030ms) date: Tue, 24 Apr 2018 15:25:19 GMT content-type: application/json; charset=utf-8 set-cookie: __cfduid=d16d4221ddfba20b5464e6829eed4e3d11524583519; expires=Wed, 24-Apr-19 15:25:19 GMT; path=/; domain=.typicode.com; HttpOnly x-powered-by: Express vary: Origin, Accept-Encoding access-control-allow-credentials: true cache-control: public, max-age=14400 pragma: no-cache expires: Tue, 24 Apr 2018 19:25:19 GMT 04-24 15:25:16.204 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: x-content-type-options: nosniff etag: W/"124-yiKdLzqO5gfBrJFrcdJ8Yq0LGnU" via: 1.1 vegur cf-cache-status: HIT expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" server: cloudflare cf-ray: 410994f328963066-SIN 04-24 15:25:16.246 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: { 04-24 15:25:16.247 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" } <-- END HTTP (292-byte body)
рдЗрд╕рд╕реЗ рд╣рдорд╛рд░рд╛ рд▓реЗрдЦ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП GitHub рдкрд░ рдХреЛрдб рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред