Time relationship, this article on the simple use of Retrofit 2.0 to explain as to the principle after the free to analyze
The project is comprehensive, simple and easy to understand address:
The simple use of Retrofit 2.0 is as follows: Https://gitee.com/bimingcong/MyRetrofit
Private voidInitget () {Retrofit Retrofit=NewRetrofit.builder (). BASEURL ("Http://v.juhe.cn/"). Addconverterfactory (Gsonconverterfactory.create ()). build (); GetService Service= Retrofit.create (GetService.class); FinalCall<getbean> call = Service.getstring3 ("Toutiao", "Shehui", "D05B58FA6901AD9BED77A1EF08BD6CCB"); Call.enqueue (NewCallback<getbean>() {@Override Public voidOnresponse (call<getbean> call, response<getbean>response) { if(Response.issuccessful ()) {Getbean=Response.body (); }} @Override Public voidOnFailure (call<getbean>Call , Throwable t) { } }); }
What GetService is the inside of the @query can actually be understood as a GET request URL? The key value pair of the string parameter behind it
Public InterfaceGetService {//Direct stitching, remember to add a question mark@GET ("TOUTIAO/INDEX?TYPE=SHEHUI&KEY=D05B58FA6901AD9BED77A1EF08BD6CCB") Call<GetBean>getString (); //{name} can be simplest understood as a path substitution block, denoted by "{}", used in conjunction with the annotation @path, to understand the decoupling, parameter Name==toutiao@GET ("{NAME}/INDEX?TYPE=SHEHUI&KEY=D05B58FA6901AD9BED77A1EF08BD6CCB") Call<GetBean> getString2 (@Path ("name") String name); //for @get, parameter information can be uploaded directly to the URL. Then you will react immediately, and there is a serious coupling as well! //So, there's @query.@GET ("{Name}/index") Call<GetBean> GetString3 (@Path ("name") String name, @Query ("type") String type, @Query ("Key") String key); //Suppose I want to upload 10 parameters in a parameter? Which means I'm going to declare 10 @query parameters in the method? Of course not! //retrofit also considered this, so the needle for the complex parameter upload, for us to prepare the @querymap@GET ("{Name}/index") Call<GetBean> GetString4 (@Path ("name") String name, @QueryMap hashmap<string, string>HashMap); //General get has no request body, so directly get interface URL can be dynamic URL@GET () Observable<ResponseBody>getString5 (@Url String Url);}
The @field in the POST request can actually be interpreted as a post to submit a parameter key value pair which also has a single file and multiple file uploads
Public InterfacePostservice {@FormUrlEncoded @POST ("Toutiao/index") Call<PostBean> poststring (@Field ("type") String type, @Field ("Key") String key); //Post form submission-Multiple parameters [email protected]@FormUrlEncoded @POST ("Toutiao/index") Call<PostBean> postString2 (@FieldMap hashmap<string, string>params); //Post file submission, each key value pair needs to use @part annotation key name//Multipart support File Upload@Multipart @POST ("Https://pan.baidu.com/disk/home?#/all?vmode=list&path=%2Fas") Call<TestBean> Postfile (@Part ("photo\"; filename=\ "test.png\" ") requestbody body); @Multipart @POST ("XXXX") Call<TestBean> PostFile2 (@PartMap hashmap<string, requestbody> Bodymap, @Field ("token") String token);}
The corresponding examples are as follows:
// What to do when I get the data successful Public Interface Onsuccesslistener { void onsuccess (Object o); void onfaile (); }
//provides methods to invoke the service entity class, requestbody upload a single file Public voidUploadFile (Requestbody body,FinalOnsuccesslistener Listener) { Call<TestBean> call =Mservice.postfile (body); Call.enqueue (NewCallback<testbean>() {@Override Public voidOnresponse (call<testbean> call, response<testbean>response) {listener.onsuccess (response); } @Override Public voidOnFailure (call<testbean>Call , Throwable t) {Listener.onfaile (); } }); }
Converter:
As for the custom converter, this is the parameter below.
New Retrofit.builder () . BaseUrl("http://v.juhe.cn/") . Addconverterfactory ( Gsonconverterfactory.create ()) . Build ();
For example, we just want the return data to be of type string, we need to customize a converterfactory
Public classStringconverfactoryextendsConverter.factory { Public Staticstringconverfactory Create () {return Newstringconverfactory (); } @Override PublicConverter<responsebody,?>responsebodyconverter (type type, annotation[] annotations, Retrofit Retrofit) {LOG.D ("Wyz", "Read data: Responsebodyconverter" +type); if(Type = = String.class) {//Type here my understanding is that the call object parameter defines the return value type LOG.D ("Wyz", "Execution Start"); returnstringresponsebodyconverter.instance; } return NULL; } @Nullable @Override Publicconverter<?, requestbody>requestbodyconverter (type type, annotation[] parameterannotations, annotation[] methodannotations, Retrofit Retrofit) {LOG.D ("Wyz", "Request data type:" +type); if(Type = = Netrequest.class){ } return NULL; }
final class Stringresponsebodyconverter implements converter<responsebody, string>< Span style= "COLOR: #000000" > { public Static final stringresponsebodyconverter INSTANCE =new Stringresponsebodyconverter (); @Override public String convert (responsebody value) throws IOException {log.d (" Wyz "," Convert start: "+ value); String s = value.string (); return S; }
Finally, the convertfactory is set to the retrofit instance.
New Retrofit.builder (). baseUrl (base_url). Client (getokhttpclient ()) . addconverterfactory (stringconverfactory. Create ())
Log:
Finally, the red part is to add a custom client here primarily to intercept the corresponding level of log
There is no log function in retrofit2.0. However, the retrofit2.0 relies on okhttp, so it is possible to implement the actual underlying request and response logs through the interceptor in the Okhttp. Here we need to modify the previous retrofit instance to customize the custom okhttpclient for it. The code is as follows:
Newnew okhttpclient.builder () . Addinterceptor (httplogginginterceptor) New Retrofit.builder (). Addcalladapterfactory (Rxjavacalladapterfactory.create ()) . Client (okhttpclient) . BASEURL ("https://api.github.com/") . Addconverterfactory (Gsonconverterfactory.create ()) . Build ();
Dependencies need to be added:
Compile ' com.squareup.okhttp3:logging-interceptor:3.1.2 '
Effect:
More detailed demo can go to my open source China to see Https://gitee.com/bimingcong/MyRetrofit
Retrofit 2.0 based on okhttp more efficient and faster network framework and custom converters