Retrofit: Type-safe REST Client for Android &java
Monday, May 5, 2014
21:11
Official website: http://square.github.io/retrofit/
GitHub Address: https://github.com/square/retrofit
JavaDocs Address: http://square.github.io/retrofit/javadoc/index.html
This essay is a translation of the official website tutorial, put out for everyone to reference!
Outline
@GET, @POST, @PUT, @DELETE, @HEAD
@Path: {ID}
@Query: Name=value
@QueryMap
@Body : Passing Objects
@FormUrlEncoded, @Field
@Multipart, @Part: typedfile Send File
@Headers, @Header
Requestinterceptor : Add Header via Interceptor
Callback (void return ),Observable: Async
Back to Response
Setconverter: Configure Gson, automatically with converter
Seterrorhandler: Setting error handling
Overview: Define your request API in a Java interface:
Public interface Githubservice { @GET ("/users/{user}/repos") List<repo> Listrepos (@Path ("user") String user); } |
It then generates an implementation of the interface through the Restadapter class.
Restadapter restadapter = new Restadapter.builder () . setEndPoint ("https://api.github.com") . build (); Githubservice service = restadapter.create (Githubservice.class); |
You can then call the following:
list<repo> repos = Service.listrepos ("Octocat"); |
A . To make an HTTP request via annotations:
- URL parameter substitution and query parameter support (that is, ?name=value&... meaning)
- customizing for POJO class conversions (automatically converts responses to POJO classes,Gson)
- Multipart Request object and File upload support (the request contains multiple media types, slices, etc.)
Two . Request method:
Support GET,POST,PUT,DELETE,HEAD
- A normal request:
Request method: request via Annotations General request @GET("/users/list") The request can be directly added to query Parameter:sort=desc @GET("/users/list?sort=desc") Parameters can be replaced by @path annotations and {name} syntax: ID @GET("/group/{id}/users") List<user> grouplist (@Path ("id") int groupId); Request parameters can be added via @query: sort @GET("/group/{id}/users") List<user> grouplist (@Path ("id") int groupId, @Query ("sort") String sort); Request parameters can be added in bulk via @querymap: Options @GET("/group/{id}/users") List<user> grouplist (@Path ("id") int groupId, @QueryMap map<string, string> options); |
- Special requests:
by @Body You can send an object directly through the restadapter conversion @POST("/users/new") void CreateUser (@Body User user, callback<user> cb); Send form-encoded data via @formurlencoded and @field annotations? Todo @FormUrlEncoded @POST("/user/edit") User UpdateUser (@Field ("First_Name") string first, @Field ("Last_Name") string last); Multipart request via @multipart and @part annotations @Multipart @PUT("/user/photo") User UpdateUser (@Part ("photo") Typedfile photo, @Part ("description") typedstring description); |
- Add Header
static Add mode Add a single head @Headers("cache-control:max-age=640000") @GET("/widget/list") List<widget> widgetlist (); @Headers Multiple header information: can have duplicate names @Headers({ "Accept:application/vnd.github.v3.full+json", "User-agent:retrofit-sample-app" }) @GET("/users/{username}") User GetUser (@Path ("username") String username); Adding headers dynamically Add head dynamically: Authorization @GET("/user") void GetUser (@Header("Authorization") String Authorization, callback<user> Callback) Add all information If you want to add the head to all requests, you can pass the Requestintercepter class. Requestinterceptor requestinterceptor = new Requestinterceptor () { @Override public void intercept (Requestfacade request) { Request.addheader ("User-agent", "Retrofit-sample-app"); } }; Restadapter restadapter = new Restadapter.builder () . setEndPoint ("https://api.github.com") . Setrequestinterceptor (Requestinterceptor) . build (); |
- Synchronous asynchronous and Rx. Observable
there is a way to return the synchronization method @GET("/user/{id}/photo") Photo Getuserphoto (@Path ("id") int id); The last method is callback<t>, which is the asynchronous request (T is the data to be returned) @GET("/user/{id}/photo") void Getuserphoto (@Path("id") int ID, callback<photo> CB); Retrofit also integrates R small Java to support the return of a rx.observable to support asynchronous requests @GET("/user/{id}/photo") Observable<photo> Getuserphoto (@Path ("id") int id); |
Three . return Object type: Can be returned by the function return type,Callback,Observable get
// return Back to object @GET ( "/users/list" ) list<user> userlist (); //via callback @GET ( "/users/list" void UserList (callback<list<user> > CB); //via observable @GET ( "/users/list" observable<list<user>> userlist (); |
Can return native Http Response: By returning Response
@GET ("/users/list") Response userlist (); @GET("/users/list") void userlist (callback<response> CB); @GET("/users/list") Observable<response> userlist (); |
Iv. . Restadapter configuration: Can be configured by default or can be customized
- config gson: Custom gson example
gson Gson = new Gsonbuilder () .setfieldnamingpolicy (fieldnamingpolicy.lower_case_with_underscores) .registertypeadapter (Date.class, New Datetypeadapter ()) .create (); restadapter restadapter = new Restadapter.builder () .setendpoint ("https://api.github.com") .setconverter (new Gsonconverter (Gson)) .build (); githubservice service = restadapter.create (githubservice.class); |
- Returns the configuration of the data type (which can support XML): The default is JSON, or you can define convertor to support other return data formats such as XML, such as a default simplexmlconverter)
Restadapter restadapter = new Restadapter.builder () . setEndPoint ("https://api.soundcloud.com") . Setconverter (New Simplexmlconverter ()) . build (); Soundcloudservice service = restadapter.create (Soundcloudservice.class); |
- custom converter : To implement converter interface is available.
- Custom Synchronization Request Error handler: ErrorHandler
class MyErrorHandler implements ErrorHandler { @Override public throwable handleError (retrofiterror cause) { response r = Cause.getresponse (); if (r! = null && r.getstatus () = = 401) { return new unauthorizedexception (cause); } return cause; } } restadapter restadapter = new Restadapter.builder () .setendpoint ("https://api.github.com") . Seterrorhandler (New MyErrorHandler ()) .build (); |
Maven Integration:
<dependency> <groupId>com.squareup.retrofit</groupId> <artifactId>retrofit</artifactId> <version>1.5.0</version> </dependency> |