你的位置:首页 > 操作系统

[操作系统]Retrofit 入门学习


Retrofit 入门学习官方RetrofitAPI

官方的一个例子

public interface GitHubService { @GET("users/{user}/repos") Call<List<Repo>> listRepos(@Path("user") String user);}

 

这些注解都有一个参数 value,用来配置其路径,比如示例中的 users/{user}/repos, 我们还注意到在构造 Retrofit 之时我们还传入了一个 baseUrl("https://api.github.com/"), 请求的完整 Url

https://api.github.com/users/{user}/repos 传入user参数替换{user}

 

就是通过 baseUrl 与注解的 value(下面称 “path“ ) 整合起来的,具体整合的规则如下:

 path 是绝对路径的形式:  path = "/apath",baseUrl = "http://host:port/a/b"   Url = "http://host:port/apath"  path 是相对路径,baseUrl 是目录形式:   path = "apath",baseUrl = "http://host:port/a/b/"   Url = "http://host:port/a/b/apath"  path 是相对路径,baseUrl 是文件形式:   path = "apath",baseUrl = "http://host:port/a/b"   Url = "http://host:port/a/apath"  path 是完整的 Url:   path = "http://host:port/aa/apath",baseUrl = "http://host:port/a/b"   Url = "http://host:port/aa/apath"

 

(@Path("user") String user) 中user参数会替换 @GET("users/{user}/repos")中的{user}

建议采用第二种方式来配置,并尽量使用同一种路径形式

请求

Retrofit retrofit = new Retrofit.Builder()  .baseUrl("https://api.github.com/")  .build();GitHubService service = retrofit.create(GitHubService.class);

 

调用

Call<List<Repo>> repos = service.listRepos("octocat");

 

这个是个什么鬼List 找了半天没找到Repo这个类

尝试去访问

https://api.github.com/users/octocat/repos

 

终于有东东了,把结果转成JAVA BEAN

 package com.liu.retrofit2demo.bean;  import com.google.gson.annotations.SerializedName;  /**   * @Description: 描述   * @AUTHOR 刘楠 Create By 2016/9/19 0019 18:10   */  public class Repo {    /**     * id : 68529654     * name : aidlDemo     * full_name : ln0491/aidlDemo     * owner : {"login":"ln0491","id":10574995,"avatar_url":"https://avatars.githubusercontent.com/u/10574995?v=3","gravatar_id":"","url":"https://api.github.com/users/ln0491","html_url":"https://github.com/ln0491","followers_url":"https://api.github.com/users/ln0491/followers","following_url":"https://api.github.com/users/ln0491/following{/other_user}","gists_url":"https://api.github.com/users/ln0491/gists{/gist_id}","starred_url":"https://api.github.com/users/ln0491/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ln0491/subscriptions","organizations_url":"https://api.github.com/users/ln0491/orgs","repos_url":"https://api.github.com/users/ln0491/repos","events_url":"https://api.github.com/users/ln0491/events{/privacy}","received_events_url":"https://api.github.com/users/ln0491/received_events","type":"User","site_admin":false}     * private : false     * html_url : https://github.com/ln0491/aidlDemo     * description : null     * fork : false     * url : https://api.github.com/repos/ln0491/aidlDemo     * forks_url : https://api.github.com/repos/ln0491/aidlDemo/forks     * keys_url : https://api.github.com/repos/ln0491/aidlDemo/keys{/key_id}     * collaborators_url : https://api.github.com/repos/ln0491/aidlDemo/collaborators{/collaborator}     * teams_url : https://api.github.com/repos/ln0491/aidlDemo/teams     * hooks_url : https://api.github.com/repos/ln0491/aidlDemo/hooks     * issue_events_url : https://api.github.com/repos/ln0491/aidlDemo/issues/events{/number}     * events_url : https://api.github.com/repos/ln0491/aidlDemo/events     * assignees_url : https://api.github.com/repos/ln0491/aidlDemo/assignees{/user}     * branches_url : https://api.github.com/repos/ln0491/aidlDemo/branches{/branch}     * tags_url : https://api.github.com/repos/ln0491/aidlDemo/tags     * blobs_url : https://api.github.com/repos/ln0491/aidlDemo/git/blobs{/sha}     * git_tags_url : https://api.github.com/repos/ln0491/aidlDemo/git/tags{/sha}     * git_refs_url : https://api.github.com/repos/ln0491/aidlDemo/git/refs{/sha}     * trees_url : https://api.github.com/repos/ln0491/aidlDemo/git/trees{/sha}     * statuses_url : https://api.github.com/repos/ln0491/aidlDemo/statuses/{sha}     * languages_url : https://api.github.com/repos/ln0491/aidlDemo/languages     * stargazers_url : https://api.github.com/repos/ln0491/aidlDemo/stargazers     * contributors_url : https://api.github.com/repos/ln0491/aidlDemo/contributors     * subscribers_url : https://api.github.com/repos/ln0491/aidlDemo/subscribers     * subscription_url : https://api.github.com/repos/ln0491/aidlDemo/subscription     * commits_url : https://api.github.com/repos/ln0491/aidlDemo/commits{/sha}     * git_commits_url : https://api.github.com/repos/ln0491/aidlDemo/git/commits{/sha}     * comments_url : https://api.github.com/repos/ln0491/aidlDemo/comments{/number}     * issue_comment_url : https://api.github.com/repos/ln0491/aidlDemo/issues/comments{/number}     * contents_url : https://api.github.com/repos/ln0491/aidlDemo/contents/{+path}     * compare_url : https://api.github.com/repos/ln0491/aidlDemo/compare/{base}...{head}     * merges_url : https://api.github.com/repos/ln0491/aidlDemo/merges     * archive_url : https://api.github.com/repos/ln0491/aidlDemo/{archive_format}{/ref}     * downloads_url : https://api.github.com/repos/ln0491/aidlDemo/downloads     * issues_url : https://api.github.com/repos/ln0491/aidlDemo/issues{/number}     * pulls_url : https://api.github.com/repos/ln0491/aidlDemo/pulls{/number}     * milestones_url : https://api.github.com/repos/ln0491/aidlDemo/milestones{/number}     * notifications_url : https://api.github.com/repos/ln0491/aidlDemo/notifications{?since,all,participating}     * labels_url : https://api.github.com/repos/ln0491/aidlDemo/labels{/name}     * releases_url : https://api.github.com/repos/ln0491/aidlDemo/releases{/id}     * deployments_url : https://api.github.com/repos/ln0491/aidlDemo/deployments     * created_at : 2016-09-18T15:24:32Z     * updated_at : 2016-09-18T15:29:01Z     * pushed_at : 2016-09-19T06:06:09Z     * git_url : git://github.com/ln0491/aidlDemo.git     * ssh_url : git@github.com:ln0491/aidlDemo.git     * clone_url : https://github.com/ln0491/aidlDemo.git     * svn_url : https://github.com/ln0491/aidlDemo     * homepage : null     * size : 229     * stargazers_count : 0     * watchers_count : 0     * language : Java     * has_issues : true     * has_downloads : true     * has_wiki : true     * has_pages : false     * forks_count : 0     * mirror_url : null     * open_issues_count : 0     * forks : 0     * open_issues : 0     * watchers : 0     * default_branch : master     */    public int id;    public String name;    public String full_name;    /**     * login : ln0491     * id : 10574995     * avatar_url : https://avatars.githubusercontent.com/u/10574995?v=3     * gravatar_id :     * url : https://api.github.com/users/ln0491     * html_url : https://github.com/ln0491     * followers_url : https://api.github.com/users/ln0491/followers     * following_url : https://api.github.com/users/ln0491/following{/other_user}     * gists_url : https://api.github.com/users/ln0491/gists{/gist_id}     * starred_url : https://api.github.com/users/ln0491/starred{/owner}{/repo}     * subscriptions_url : https://api.github.com/users/ln0491/subscriptions     * organizations_url : https://api.github.com/users/ln0491/orgs     * repos_url : https://api.github.com/users/ln0491/repos     * events_url : https://api.github.com/users/ln0491/events{/privacy}     * received_events_url : https://api.github.com/users/ln0491/received_events     * type : User     * site_admin : false     */    public OwnerEntity owner;    @SerializedName("private")    public boolean privateX;    public String html_url;    public Object description;    public boolean fork;    public String url;    public String forks_url;    public String keys_url;    public String collaborators_url;    public String teams_url;    public String hooks_url;    public String issue_events_url;    public String events_url;    public String assignees_url;    public String branches_url;    public String tags_url;    public String blobs_url;    public String git_tags_url;    public String git_refs_url;    public String trees_url;    public String statuses_url;    public String languages_url;    public String stargazers_url;    public String contributors_url;    public String subscribers_url;    public String subscription_url;    public String commits_url;    public String git_commits_url;    public String comments_url;    public String issue_comment_url;    public String contents_url;    public String compare_url;    public String merges_url;    public String archive_url;    public String downloads_url;    public String issues_url;    public String pulls_url;    public String milestones_url;    public String notifications_url;    public String labels_url;    public String releases_url;    public String deployments_url;    public String created_at;    public String updated_at;    public String pushed_at;    public String git_url;    public String ssh_url;    public String clone_url;    public String svn_url;    public Object homepage;    public int   size;    public int   stargazers_count;    public int   watchers_count;    public String language;    public boolean has_issues;    public boolean has_downloads;    public boolean has_wiki;    public boolean has_pages;    public int   forks_count;    public Object mirror_url;    public int   open_issues_count;    public int   forks;    public int   open_issues;    public int   watchers;    public String default_branch;    public static class OwnerEntity {      public String login;      public int   id;      public String avatar_url;      public String gravatar_id;      public String url;      public String html_url;      public String followers_url;      public String following_url;      public String gists_url;      public String starred_url;      public String subscriptions_url;      public String organizations_url;      public String repos_url;      public String events_url;      public String received_events_url;      public String type;      public boolean site_admin;      @Override      public String toString() {        return "OwnerEntity{" +            "login='" + login + '\'' +            ", id=" + id +            ", avatar_url='" + avatar_url + '\'' +            ", gravatar_id='" + gravatar_id + '\'' +            ", url='" + url + '\'' +            ", html_url='" + html_url + '\'' +            ", followers_url='" + followers_url + '\'' +            ", following_url='" + following_url + '\'' +            ", gists_url='" + gists_url + '\'' +            ", starred_url='" + starred_url + '\'' +            ", subscriptions_url='" + subscriptions_url + '\'' +            ", organizations_url='" + organizations_url + '\'' +            ", repos_url='" + repos_url + '\'' +            ", events_url='" + events_url + '\'' +            ", received_events_url='" + received_events_url + '\'' +            ", type='" + type + '\'' +            ", site_admin=" + site_admin +            '}';      }    }    @Override    public String toString() {      return "Repo{" +          "id=" + id +          ", name='" + name + '\'' +          ", full_name='" + full_name + '\'' +          ", owner=" + owner +          ", privateX=" + privateX +          ", html_url='" + html_url + '\'' +          ", description=" + description +          ", fork=" + fork +          ", url='" + url + '\'' +          ", forks_url='" + forks_url + '\'' +          ", keys_url='" + keys_url + '\'' +          ", collaborators_url='" + collaborators_url + '\'' +          ", teams_url='" + teams_url + '\'' +          ", hooks_url='" + hooks_url + '\'' +          ", issue_events_url='" + issue_events_url + '\'' +          ", events_url='" + events_url + '\'' +          ", assignees_url='" + assignees_url + '\'' +          ", branches_url='" + branches_url + '\'' +          ", tags_url='" + tags_url + '\'' +          ", blobs_url='" + blobs_url + '\'' +          ", git_tags_url='" + git_tags_url + '\'' +          ", git_refs_url='" + git_refs_url + '\'' +          ", trees_url='" + trees_url + '\'' +          ", statuses_url='" + statuses_url + '\'' +          ", languages_url='" + languages_url + '\'' +          ", stargazers_url='" + stargazers_url + '\'' +          ", contributors_url='" + contributors_url + '\'' +          ", subscribers_url='" + subscribers_url + '\'' +          ", subscription_url='" + subscription_url + '\'' +          ", commits_url='" + commits_url + '\'' +          ", git_commits_url='" + git_commits_url + '\'' +          ", comments_url='" + comments_url + '\'' +          ", issue_comment_url='" + issue_comment_url + '\'' +          ", contents_url='" + contents_url + '\'' +          ", compare_url='" + compare_url + '\'' +          ", merges_url='" + merges_url + '\'' +          ", archive_url='" + archive_url + '\'' +          ", downloads_url='" + downloads_url + '\'' +          ", issues_url='" + issues_url + '\'' +          ", pulls_url='" + pulls_url + '\'' +          ", milestones_url='" + milestones_url + '\'' +          ", notifications_url='" + notifications_url + '\'' +          ", labels_url='" + labels_url + '\'' +          ", releases_url='" + releases_url + '\'' +          ", deployments_url='" + deployments_url + '\'' +          ", created_at='" + created_at + '\'' +          ", updated_at='" + updated_at + '\'' +          ", pushed_at='" + pushed_at + '\'' +          ", git_url='" + git_url + '\'' +          ", ssh_url='" + ssh_url + '\'' +          ", clone_url='" + clone_url + '\'' +          ", svn_url='" + svn_url + '\'' +          ", homepage=" + homepage +          ", size=" + size +          ", stargazers_count=" + stargazers_count +          ", watchers_count=" + watchers_count +          ", language='" + language + '\'' +          ", has_issues=" + has_issues +          ", has_downloads=" + has_downloads +          ", has_wiki=" + has_wiki +          ", has_pages=" + has_pages +          ", forks_count=" + forks_count +          ", mirror_url=" + mirror_url +          ", open_issues_count=" + open_issues_count +          ", forks=" + forks +          ", open_issues=" + open_issues +          ", watchers=" + watchers +          ", default_branch='" + default_branch + '\'' +          '}';    }  }

 

使用

导入依赖

   compile 'com.squareup.retrofit2:retrofit:2.1.0'  compile 'com.squareup.retrofit2:converter-gson:2.1.0'

 

建立Service

public interface GitHubService {  @GET("users/{user}/repos")  Call<List<Repo>> listRepos(@Path("user") String user);}

 

构造 Retrofit 使用单例

public class RetrofitWrapper {  private static RetrofitWrapper instance;  private    Retrofit    mRetrofit;  private RetrofitWrapper() {    //初始化 添加转换工厂    mRetrofit = new Retrofit.Builder().baseUrl(Constant.BASE_URL).addConverterFactory(GsonConverterFactory.create()).build();  }  public static RetrofitWrapper getInstance() {    if(instance == null) {      synchronized(RetrofitWrapper.class) {        if(instance == null) {          instance = new RetrofitWrapper();        }      }    }    return instance;  }  /**   * 转换为对象的Service   * @param service   * @param <T>   * @return   */  public <T> T create(Class<T> service){    return mRetrofit.create(service);  }  /**   * 常量类 基本的URL   */  public class Constant {      //BASE_URL 可以自行替换    public static final String BASE_URL = "https://api.github.com/";  }}

 

在Activity中调用

添加网络权限

 <uses-permission android:name="android.permission.INTERNET"/>

 

在点击事件时调用

private void getUserRepo() {    GitHubService gitHubService = RetrofitWrapper.getInstance().create(GitHubService.class);    Call<List<Repo>> call = gitHubService.listRepos("octocat");    call.enqueue(new Callback<List<Repo>>() {      @Override      public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {        //接收结果        List<Repo> list = response.body();        Log.d(TAG, "onResponse: " + list.size() + "  " + list.toString());        Log.d(TAG, "onResponse:当前线程 "+Thread.currentThread().getName());                 /**                 * 回调是在主线程可以更新UI                 */                mTv.setText(list.get(0).full_name);                mPb.setProgress(50);      }      @Override      public void onFailure(Call<List<Repo>> call, Throwable t) {        Log.d(TAG, "onFailure: " + t.getMessage());        Log.d(TAG, "onFailure:当前线程 "+Thread.currentThread().getName());      }    });  }

 

日志

onResponse: 7  [Repo{id=18221276, name='git-...太长省略onResponse:当前线程 main

 

不容易,终于成功了. 突然觉得请求接口就好像访问自家的方法 也看到了回调是在主线程中。可以做UI操作

接都走官方的API

BASE_URL

https://api.github.com/

 

API

http://square.github.io/retrofit/

 

public interface GitHubService {  @GET("users/{user}/repos")  Call<List<Repo>> listRepos(@Path("user") String user);  @GET("users/list")  Call<User> getUser();}

 

调用

private void getUser() {    GitHubService gitHubService = RetrofitWrapper.getInstance().create(GitHubService.class);    Call<User> userCall = gitHubService.getUser();    userCall.enqueue(new Callback<User>() {      @Override      public void onResponse(Call<User> call, Response<User> response) {        User user = response.body();        Log.d(TAG, "getUser onResponse: "+user.toString());        Log.d(TAG, " getUser onResponse: "+response.code()+"  "+response.isSuccessful()+"  "+response.message());        mTv.setText(user.toString());        mPb.setProgress(100);      }      @Override      public void onFailure(Call<User> call, Throwable t) {        Log.d(TAG, "onFailure: "+t.getMessage());      }    });  }

 

日志

 getUser onResponse: User{login='list', id=1133421, avatar_url='https://avatars.githubusercontent.com/u/1133421?v=3',...省略 getUser onResponse: 200  true  OK

 

访问根路径

@GET("/")Call<GithubBean> getGitHubApi();

 

一定要有 ("/") 不然会报错

private void getGithubApi() {  GitHubService gitHubService = RetrofitWrapper.getInstance().create(GitHubService.class);  Call<GithubBean> apiBeanCall = gitHubService.getGitHubApi();  apiBeanCall.enqueue(new Callback<GithubBean>() {    @Override    public void onResponse(Call<GithubBean> call, Response<GithubBean> response) {      Log.d(TAG, "getGithubApi onResponse: "+response.message());      GithubBean githubBean = response.body();      Log.d(TAG, "onResponse: "+githubBean.toString());      mTv.setText(githubBean.toString());      mPb.setProgress(78);    }    @Override    public void onFailure(Call<GithubBean> call, Throwable t) {      Log.d(TAG, "getGithubApi onFailure: "+t.getMessage());    }  });}

 

带参数的get请求

Query
public interface MyServcie {@GET(AppUrl.GET_USE_HELP)Call<UseHelpBean> getUseHelp(@Query("sign")String sign,@Query("appKey") String appKey,@Query("osName")String osName);}

 

日志

getUseHelp onResponse: OKonResponse: UseHelpBean{info=InfoEntity{questList=[QuestListEntity{typeName='生活宝箱', reply='可以,选择你想加为好友的用户,点击“加好友”便可。', typeId=1002}, QuestListEntity{typeName='账户', reply='可以,点击用户...

 

QueryMap

@GET(AppUrl.GET_USE_HELP)Call<UseHelpBean> getUseHelp(@Query("sign")String sign,@Query("appKey") String appKey,@Query("osName")int osName);@GET(AppUrl.GET_USE_HELP)Call<UseHelpBean> getUseHelps(@QueryMap Map<String,String> params);

 

结果与上面一样

再看一个天气的

https://www.juhe.cn/docs/api/id/235

 

开放的API可以自己申请

BASE_URL

http://v.juhe.cn/weather/key:88ca9906a9ac5408ecd46b42c8e5324f

 

Service

public interface WeatherService {  @GET("index")  Call<WeatherData> getWeather(@Query("cityname") String cityname,@Query("key") String key,@Query("dtype") String dtype,@Query("format") int format);  @GET("index")  Call<WeatherData> getWeathers(@QueryMap Map<String,String> params);}

 

POST请求 --POST 提交表单Field & FieldMap

表单-参数Field

@FormUrlEncoded@POST("index")Call<CheckBean> getInfo(@Field("info")String info,@Field("key")String key);

 

表单 -多参数用FieldMap

@FormUrlEncoded@POST("index")Call<CheckBean> getInfos(@FieldMap Map<String,String> params);

 

源码:

https://github.com/ln0491/Retrofit2Demo