Retrofit get、post请求用法整理

昨天因为接口改动的事情,一激动跟老大说话提高到了最大分贝。现在想想真是对不起老大。记得上次他问我以前用过什么网络框架,我说retrofit。正好小伙伴不是很了解,我也快忘记怎么用了,今天整理出来,方便日后用到。

Retrofit使用步骤:
1.定义一个接口。用来封装URL地址和数据请求
2.实例化retrofit
3.调用retrofit实例创建接口和服务对象
4.接口服务对象调用接口中的方法获取call对象
5.call对象执行请求

我首先定义了一个常量类用来存放BASE_URL。紧接着定义了一个INewsBiz接口

public class Constant {
  //一个完整的url地址
  public final static String URL="http://litchiapi.jstv.com/" +
          "api/GetFeeds?column=0&PageSize=20&pageIndex=1&val=100511D3BE5301280E0992C73A9DEC41";
  //上边URL的根路径
  public final static String BASE_URL="http://litchiapi.jstv.com/";
  //完整路径: http://42.120.4.67/api/app/business/category?app_id=161
  public final static String TEABASE_URL="http://42.120.4.67/api/app/business/";

  //下载图片地址
  public final static String IMAGE_URL="http://img5.imgtn.bdimg.com/it/u=4080105893,4096129906&fm=206&gp=0.jpg/";
  //登录地址  http://10.0.152.244:8080/WebServiceDemo/LoginServlet
  public final static String LOGIN_URL="http://10.0.152.244:8080/WebServiceDemo/";
  public final static String UPLOAD_URL="http://192.168.1.103:8080/UploadServer/";
}
public interface INewsBiz {
    /*
    通过@GET注解标示为get请求 @GET中填写的value和baseUrl指定的地址组成完成的访问路径
    baseUrl构造retrofit对象时指定
    */
    @GET("api/GetFeeds?column=0&PageSize=20&pageIndex=1&val=100511D3BE5301280E0992C73A9DEC41")
    Call getResonsebody();

    @GET("api/GetFeeds?column=0&PageSize=20&pageIndex=1&val=100511D3BE5301280E0992C73A9DEC41")
    Call getJsonString();

    @GET("category?app_id=161")
    Call> getTeas();

    @GET("api/{type}?column=0&PageSize=20&pageIndex=1&val=100511D3BE5301280E0992C73A9DEC41")
    Call getNewsInfo(@Path("type") String type);//String type="GetFeeds"

    //http://42.120.4.67/api/app/business/category?app_id=161
    @GET("category")
    Call> getTeaByNetWork(@Query("app_id") int id);//int id=161

    //api/GetFeeds?column=0&PageSize=20&pageIndex=1&val=100511D3BE5301280E0992C73A9DEC41
    @GET("api/GetFeeds")
    Call getInfo(@QueryMap Map map);

//    @GET("api/{type}")
//    Call getInfo(@Path("type") String type,@QueryMap Map map);

    //网络上下载文件
    @GET("download")
     Call downLoad();

    //post请求中通过@FormUrlEncoded和@POST注解 指明访问的地址  @Field("向服务器提交的key")
    @POST("LoginServlet")//采用post请求方式
    @FormUrlEncoded  //表单提交
    Call login(@Field("username") String username,
                       @Field("password") String password);
}

普通额get请求,对应接口中的getResponseBody()方法

    /**
     * 普通get请求,返回ResponseBody
     */
    public void initRetrofit01(){
        //构建Retrofit网络访问对象
        Retrofit retrofit=new Retrofit
                .Builder()
                .baseUrl(Constant.BASE_URL)//设置访问的跟路径
                .build();
        //根据接口的字节码文件对象获取接口的对象
        INewsBiz iNewsBiz=retrofit.create(INewsBiz.class);
        //调用接口中定义的函数
        Call call=iNewsBiz.getResonsebody();
        /*enqueue 采用异步访问数据   execute()采用同步访问数据*/
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                if(response.isSuccessful()){//成功的获取响应
                    try {
                        String result=response.body().string();//获取网络访问的字符串
                        tv.setText(result);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

            @Override
            public void onFailure(Call call, Throwable t) {

            }
        });
    }
/**
     *  采用同步访问的方式 excute()
     */
    public void initRetrofit08(){
        Retrofit retrofit=new Retrofit
                .Builder()
                .baseUrl(Constant.BASE_URL)
                .build();
        final INewsBiz iNewsBiz=retrofit.create(INewsBiz.class);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Call call=iNewsBiz.getResonsebody();
                    // 采用同步方式请求数据
                    Response response=call.execute();
                    final String str=response.body().string();
                    tv.post(new Runnable() {
                        @Override
                        public void run() {
                            tv.setText(str);
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
/**
     * 普通get请求 返回的数据为String类型
     */
    public void initRetrofit02(){
        Retrofit retrofit=new Retrofit
                .Builder()
                .baseUrl(Constant.BASE_URL)
                //设置回调时的适配器 get请求后可以返回String字符串类型的内容
                .addConverterFactory(ScalarsConverterFactory.create())
                .build();
        INewsBiz iNewsBiz=retrofit.create(INewsBiz.class);
        Call call=iNewsBiz.getJsonString();
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                if(response.isSuccessful()){
                    tv.setText(response.body());
                }
            }

            @Override
            public void onFailure(Call call, Throwable t) {

            }
        });
    }
/**
     * 普通的get请求 返回的数据为gson解析后的list集合
     */
    public void initRetrofit03(){
        Retrofit retrofit=new Retrofit
                .Builder()
                .baseUrl(Constant.TEABASE_URL)
                //如果服务器返回的时json格式数据 设置了GsonConverterFactory
                //实现对对象的转化
                // 自定义数据解析器 只要解析器继承Converter.Factory即可
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        INewsBiz iNewsBiz=retrofit.create(INewsBiz.class);
        Call> call=iNewsBiz.getTeas();
        call.enqueue(new Callback>() {
            @Override
            public void onResponse(Call> call, Response> response) {
                if(response.isSuccessful()){
                    List list=response.body();//获取解析后的集合
                    StringBuilder sb=new StringBuilder();
                    for(Tea t:list){
                        sb.append(t.getProduct_cat_name());
                    }
                    tv.setText(sb.toString());
                }
            }

            @Override
            public void onFailure(Call> call, Throwable t) {

            }
        });

    }

以上都为普通的get请求,区别仅在于同步异步,及因为配置的解析器不同,所得到的数据类型不同。

通过占位符指定path路径,在得到call对象时,通过调用接口中的方法,获取占位符所需要的变量。

/**
     * get请求 通过占位符指定path路径
     */
    public void initRetrofit04(){
        Retrofit retrofit=new Retrofit
                .Builder()
                .baseUrl(Constant.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        INewsBiz iNewsBiz=retrofit.create(INewsBiz.class);
        Call call=iNewsBiz.getNewsInfo("GetFeeds");
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                if(response.isSuccessful()){
                    List.ParamzBean.FeedsBean> news=
                            response.body().getParamz().getFeeds();
                    StringBuilder sb=new StringBuilder();
                    for(NewsInfo.ParamzBean.FeedsBean feed:news){
                        sb.append(feed.getData().getSubject());
                    }
                    tv.setText(sb.toString());
                }
            }

            @Override
            public void onFailure(Call call, Throwable t) {

            }
        });
    }

@query与@QueryMap将参数以key-value对的形式使用

    /**
     get请求 通过@query注解动态传递参数的值
     */
    public void initRetrofit05(){
        Retrofit retrofit=new Retrofit
                .Builder()
                .baseUrl(Constant.TEABASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        INewsBiz iNewsBiz=retrofit.create(INewsBiz.class);
        Call> call=iNewsBiz.getTeaByNetWork(161);
        call.enqueue(new Callback>() {
            @Override
            public void onResponse(Call> call, Response> response) {
                if(response.isSuccessful()){
                    StringBuilder sb=new StringBuilder();
                    List list=response.body();
                    for(Tea t:list){
                        sb.append(t.getProduct_cat_name());
                    }
                    tv.setText(sb.toString());
                }
            }

            @Override
            public void onFailure(Call> call, Throwable t) {

            }
        });
    }
/**
     * get 请求通过@queryMap注解动态传递多个参数
     */
    public void initRetrofit06(){
        Retrofit retrofit=new Retrofit
                .Builder()
                .baseUrl(Constant.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        INewsBiz iNewsBiz=retrofit.create(INewsBiz.class);
        //column=0&PageSize=20&pageIndex=1&val=100511D3BE5301280E0992C73A9DEC41
        //将参数根据key-value对的形式存储到map集合中
        Map map=new HashMap<>();
        map.put("column",0+"");
        map.put("PageSize",20+"");
        map.put("pageIndex",1+"");
        map.put("val","100511D3BE5301280E0992C73A9DEC41");
        Call call=iNewsBiz.getInfo(map);
        //api/GetFeeds?column=0&PageSize=20&pageIndex=1&val=100511D3BE5301280E0992C73A9DEC41
//        Call call=iNewsBiz.getInfo("GetFeeds",map);
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                if(response.isSuccessful()){
                    List.ParamzBean.FeedsBean> news=
                            response.body().getParamz().getFeeds();
                    StringBuilder sb=new StringBuilder();
                    for(NewsInfo.ParamzBean.FeedsBean feed:news){
                        sb.append(feed.getData().getSubject());
                    }
                    tv.setText(sb.toString());
                }
            }

            @Override
            public void onFailure(Call call, Throwable t) {

            }
        });
    }
/**
     * 下载网络图片文件
     */
    public void initRetrofit07(){
        Retrofit retrofit=new Retrofit
                .Builder()
                .baseUrl(Constant.IMAGE_URL)
                .build();
        INewsBiz iNewsBiz=retrofit.create(INewsBiz.class);
        Call call=iNewsBiz.downLoad();
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                if(response.isSuccessful()){
//                    String str=response.body().string();
//                    byte[] buff=response.body().bytes();
                    InputStream inputStream=response.body().byteStream();
                    Bitmap bm= BitmapFactory.decodeStream(inputStream);
                    iv.setImageBitmap(bm);
                }
            }

            @Override
            public void onFailure(Call call, Throwable t) {

            }
        });
    }

其实还有一个很重要的利用retrofit提交json格式数据
1.先定义一个实体类
2.需要添加头

@Headers({"Content-Type: application/json","Accept: application/json"})//需要添加头
    @POST("api/FlyRoute/Add")
    Call postTeaRoute(@Body RequestBody route);//传入的参数为RequestBody  

3.转换

PostRoute postRoute=retrofit.create(PostRoute.class);  
    RequestBody body=RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),route);  
    Call call=postRoute.postFlyRoute(body);

除了这些与get请求不同之外,其它都没有什么差别。
对于post请求上传json格式,可以参照博客:
http://blog.csdn.net/zhupumao/article/details/51628698

好啦,整理完毕,以后可以欢快的用了。整理完用法,下次该回忆回忆注解是个什么鬼了。我这还不如金鱼七秒钟的记忆呀。

你可能感兴趣的:(android,框架,url,android)