Android平台下用GET获得公开API数据的方法--Retrofit

最近根据同学的建议,编写了一个网络音乐播放器的小项目。主要目的在练习网络相关的内容,其中根据百度音乐公开的API进行网络部分的编写。这就遇到了获取返回JSON数据的问题。很多人都知道,公开的API格式一般是这样的:</span>

http://tingapi.ting.baidu.com/v1/restserver/ting?format=json&calback=&from=webapp_music&method=baidu.ting.billboard.billList&type=1&size=10&offset=0 

这其中?号之前的是域名,基于http协议,?号之后是参数及参数值,也就是在这个域名里根据各个参数的赋值,服务器将决定返回什么信息。

上面这个API是百度音乐的新歌榜的接口,返回的是JSON数据。因为是GET方法获取的,所以浏览器支持,把以上链接直接复制到浏览器中,就能得到返回的JSON数据。

刚看到这个JSON数据的时候是不是很头大。我刚看到也是醉的一塌糊涂,上千个字符的JSON,怎么写bean文件?没有bean文件怎么解析?赶紧请教大神同学,原来android studio中的Gsonformat插件可以直接根据浏览器中返回的JSON数据自动生成bean文件,简直太方便了(大神们贱笑了)。至于跟我一样也不知道这个插件的童鞋,可以试试,怎么装我就不说了,相信大家都会,不会的肯定也知道百度。

下面言归正传,接着说这个个get方法。最原始的肯定是用输入输出流来进行获得比如一下代码:

下载类 NUtils:

public class NUtils {
    public interface Callback{
        //是否取消下载
        public boolean isCancelled(String url);

        //下载完成之后,将数据回传
        public void response(String url, byte[] bytes);
    }

    public static class AbsCallback implements Callback{
        @Override
        public boolean isCancelled(String url) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public void response(String url, byte[] bytes) {
            // TODO Auto-generated method stub

        }
    }

    private static Handler mHandler =new Handler();
    private static ExecutorService service= Executors.newFixedThreadPool(5);

    public static void get(final String path, final Callback callback) throws UnsupportedEncodingException {
        Log.e("Get",path);
        service.execute(new Runnable() {

            @Override
            public void run() {
                try{
                    HttpURLConnection conn=(HttpURLConnection) new URL(path).openConnection();
                    conn.setRequestProperty("Accept-Charset", "GBK");
                    conn.setRequestProperty("contentType", "GBK");
                    InputStream is=conn.getInputStream();
                    byte[] buffer=new byte[10*1024];
                    int len=-1;

                    ByteArrayOutputStream baos=new ByteArrayOutputStream();

                    if(conn.getResponseCode()==200){
                        while((len=is.read(buffer))!=-1){

                            baos.write(buffer, 0, len);

                            //判断是否取消
                            if(callback.isCancelled(path)){

                                return;
                            }
                        }

                        final byte[] bytes=baos.toByteArray();

                        mHandler.post(new Runnable(){
                            @Override
                            public void run() {
                                // TODO Auto-generated method stub
                                callback.response(path, bytes);
                            }
                        });
                    }

                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        });
    }
}
调用类:

private void search(String searchstr) throws UnsupportedEncodingException {
        Log.e("str",searchstr);
        String path="http://tingapi.ting.baidu.com/v1/restserver/ting?format=json&calback=&from=webapp_music&method=baidu.ting.search.catalogSug&query="+searchstr;
//        String path=new String(string.getBytes("UTF-8"),"iso-8859-1");
        NUtils.get(path , new NUtils.AbsCallback() {
            @Override
            public void response(String url, byte[] bytes) {
                super.response(url, bytes);
                String json = new String(bytes);
//                Log.e("json",json.toString());
                String Json=json.trim();
                SearchBean bean= fastJsonTools.createJsonBean(Json,SearchBean.class);
//                Log.e("bean",bean.toString());
                setSearchBean(bean);
            }
        });
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值