Android Studio第三十期 - 介绍几种网络请求方式写法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Studio第三十期 - 介绍几种网络请求方式写法相关的知识,希望对你有一定的参考价值。

    框架git地址:附(爱一个人就要爱他(loader)的全部~)

    https://github.com/geeklx/MakeJarAAR


    1:http://192.168.200.96/v2/weather/weather.get.info

    请求方式:POST

    请求示例

{
    "verify_info":{
        "app":{
            "app_id":"2e263d60-2d48-43d9-b699-6f3bdb38eff8",
            "version":"1.0.0",
            "api_version":160815,
            "user_id":"201605131806550245"
        },
        "device":{
            "platform":"XiaoMi Note2",
            "model":"android 4.4.2",
            "factory":"XiaoMi",
            "screen_size":"1920*1080",
            "denstiy":2,
            "imei":"352105068965016/01",
            "mac":"50-8D-4F-4S-55-5D",
            "gprs":"4G",
            "latitude":39.972907,
            "longitude":116.503154
        },
        "token_check":{
            "access_token":"3420d0e0-ed77-45e1-8370-2b55af0a62e8",
            "timestamp":"1453116822556",
            "sign":"fac5ff3fce1c5890a6bae11e7670dc1f",
            "client_id":"356877020056553-08002700DC94",
            "sequence_id":"08002700DC94-15110519074300001",
            "language":"zh-cn",
            "timezone":"8"
        }    },
    "data":{

    }}

公共响应参数:

参数名类型说明示例
okboolean网络请求返回状态true
codeint网络请求状态码200
messagestring网络请求状态信息ok
- dataobject返回数据内容,json数据jsonObject

响应参数示例

{
    "ok":true,
    "code":200,
    "message":"成功",
    "data":{
        "qlty":"良",
        "txt":"多云",
        "tmp":32
       }
}

    写法:

    接口部分:ConstantNetUtil.URL_THIRD="http://192.168.200.96/"  

public interface DemoApi{
    /**
     * 单曲列表
     * @param json
     * @return
     */
    @JSON(ConstantNetUtil.URL_THIRD+"v2/weather/weather.get.info")
    Call<NetsMySongCollectBean> getNetsCollectList(String json);

}

    请求部分:

private void doNewWork(String user_id) {
        Net.getInstance().get().cancel(getClass().getName() + "MainActivityTAG");
        MaterialProgressLoadingUtil.showProgressDialog(this, "加载中....");
        DemoParams p = new DemoParams(user_id);
        Net.build(DemoApi.class,
                getClass().getName() + "MainActivityTAG").getDemoModel(ParamsUtils.just(null)).enqueue(new Callback<DemoWeatherModel>() {
            @Override
            public void onResponse(Result<DemoWeatherModel> result) {
                if (result.isOK()) {
                    DemoWeatherModel dwm = result.getResult();
                    if (dwm != null) {
                        tv_context1.setText(dwm.getQlty() + "," + dwm.getTxt() + "," + dwm.getTmp());
                    }
//                    demoModel = new DemoModel();
//                    demoModel_item = new DemoModel_item();
//                    demoModel_list = new ArrayList<DemoModel_list>();
//                    demoModel_item = result.getResult().getPage_info();
//                    demoModel_list = result.getResult().getFood_list();
//                    if (demoModel_list != null && demoModel_list.size() > 0) {
//                        //有数据状态
//                        //处理自己的逻辑 你要是不会 神都救不了你了~
//                        ToastUtil.showToastCenter("有数据");
//                    } else {
//                        //无数据状态
//                        //可以使用自定义布局 参考:http://liangxiao.blog.51cto.com/3626612/1851105
//                        ToastUtil.showToastCenter("无数据");
//                    }
                } else {
                    //无网状态
//                    ToastUtil.showToastCenter("无网状态 请重新请求服务器!");
                }
//                MaterialProgressLoadingUtil.dismissProgressDialog();
            }
        });
    }

    2.POST请求格式:

  • 网易云音乐对第三方提供的接口(Android平台)是经过加密安全处理的,遵守以下规则:

  • 1. 每个产品有对应的 $(productname)

  • 2. 需要引用附件中的libpoison.so

  • 3. 引用该so的Android软件的签名md5事先提供给云音乐。非该签名的软件将无法正常使用该so。(签名md5获取方法:eclipse->设置->Preferences->Android->Build->MD5 fingerprint)

  • 4. 所有接口都是用固定url:

测试环境
http://api.igame.163.com/openapi/$(productname) 

线上环境
http://api.music.163.com/openapi/$(productname)

utf-8编码。具体请求信息放在“参数params”(参数名为params)中。


  • 5. 接口使用请参考“第三方接口说明”,并调用so中函数来构造“参数params”的值 

  • 6. 接口“歌曲的url”使用http Get,其他接口使用http Post。

  • 7. 接口“歌曲的url”每天每个设备320kbits的获取次数上限为1000次,请做好到达上限提示。建议只有在下载开始前才调用该接口。



代码调用示例:


package com.netease.cloudmusic.utils;

import android.content.Context;

import com.netease.cloudmusic.NeteaseMusicApplication;

public class NeteaseMusicUtils {
static {
System.loadLibrary("poison");
nativeInit(NeteaseMusicApplication.getInstance());//这里改成自己的context
//example
//String params = getUrlParameters("/search","{\"keyword\":\"周杰伦\",\"limit\":10,\"offset\":0}\")
//httpPost.post("http://music.163.com/openapi/vivo", new pair("params", params))
}

/**
* 初始化,必须
* @param context
*/
public native static void nativeInit(Context context);
/**
* 获取请求中"params"的值
* 例:如果调用搜索接口,搜索keyword=周杰伦 limit=10 offset=0
* params=getUrlParameters("/search","{\"keyword\":\"周杰伦\",\"limit\":10,\"offset\":0}\")
* @param requestUri 接口说明中的uri
* @param paramJson 接口说明中的参数json表达,如果为空请传"{}"
* @return
*/
public native static String getUrlParameters(String requestUri, String paramJson);
}



  • 歌单分类

Uri: /playlist/tags
参数:
无 返回:

字段类型描述
dataList<PlaylistTag>标签列表
codeInteger200 正常 
500 异常

  • 获取分类歌单列表

Uri: /playlist/oftag
参数:

字段类型描述
nameString标签名称
orderStringhot or new
limitInteger返回数据量
offsetInteger偏移

返回:


字段类型描述
dataList<Playlist>歌单列表
codeInteger200 正常 
500 异常
hasMoreboolean是否还有更多




  • 歌曲的Url

Uri: /url
参数:

字段类型描述
songIdString歌曲Id
bitrateInteger比特率(只支持320/160/96三个数值,对应320/160/96kbps)

返回:
正确调用会302跳转至歌曲对应的url,可直接播放或下载。songId不存在将返回httpcode:400
如果调用到达上限(每天每个设备320kbits的获取次数上限为1000次),将返回httpcode:401



  • 歌曲的Url

Uri: /song/playurl
参数:

字段类型描述
songIdString歌曲Id
bitrateInteger比特率(只支持320/160/96三个数值,对应320/160/96kbps)

返回:

字段类型描述
dataUrlInfoData播放音频信息
codeInteger200 正常 
500 异常

    写法:

    接口部分:

public interface NeteaseMusicApi {
    //测试
    @POST(ConstantNetUtil.NETEASE_MUSIC)
    Call<String> neatease(@Arg("params") String params);

    /**
     * nets index list
     * @param params
     * @return
     */
    @POST(ConstantNetUtil.NETEASE_MUSIC)
    Call<NetsListResult> getNetsClassifyList(@Arg("params") String params);

}

    请求部分:

public void getNetsClassifyList(String name, String order, int limit, int offset) {
    String a = "{\"name\":\"" + name + "\",\"order\":\"" + order + "\",\"limit\":" + limit + ",\"offset\":" + offset + "}";
    String b = "{\"b1\":\"" + name + "\",\"b2\":\"" + order + "\",\"b3\":\"" + limit + ", \"b4\":\"" + offset + "}";
    String c = "{}";
    String d = "{\"songid\":"+name+"}";
    String p = NeteaseMusicUtils.getUrlParameters("/playlist/oftag", a);
    NeteaseNet.build(NeteaseMusicApi.class, getClass().getName()).getNetsClassifyList(p).enqueue(new Callback<NetsListResult>() {
        @Override
        public void onResponse(Result<NetsListResult> result) {
            if (!hasView()) {
                return;
            }
            if (!result.isOK()) {
                getView().onNetsClassifyFailure();
                return;
            }
            if (result.getResult().getCode() == HttpURLConnection.HTTP_OK) {
                if (result.getResult() != null) {
                    getView().onNetsClassifySuccess(result.getResult().getData(), result.getResult().isHasMore());
                } else {
                    getView().onNetsClassifyFailure();
                }
            } else {
                getView().onNetsClassifyFailure();
            }
        }
    });
}

    附:转义字符写法要注意:

String a = "{\"name\":\"" + name + "\",\"order\":\"" + order + "\",\"limit\":" + limit + ",\"offset\":" + offset + "}";

String b = "{\"b1\":\"" + name + "\",\"b2\":\"" + order + "\",\"b3\":\"" + limit + ", \"b4\":\"" + offset + "}";

String c = "{}";

String d = "{\"songid\":"+name+"}";

String params = "{\"type\":\"" + type + "\",\"key\":\"" + key + "\"}";

    3.未加密的键值对请求方式:(这里使用聚合数据demo)

    技术分享

{
    "reason": "成功的返回",
    "result": {
        "stat": "1",
        "data": [
            {
                "uniquekey": "3d2c710e656006674ca3db585d1aa30b",
                "title": "痛惜!山东临沂一小女孩命丧滑雪场",
                "date": "2017-02-09 15:31",
                "category": "头条",
                "author_name": "齐鲁壹点",
                "url": "http://mini.eastday.com/mobile/170209153114657.html",
                "thumbnail_pic_s": "http://07.imgmini.eastday.com/mobile/20170209/20170209153114_7d1b97e6f4a356210dbb0708f53f813e_1_mwpm_03200403.jpeg",
                "thumbnail_pic_s02": "http://07.imgmini.eastday.com/mobile/20170209/20170209153114_7d1b97e6f4a356210dbb0708f53f813e_2_mwpm_03200403.jpeg",
                "thumbnail_pic_s03": "http://07.imgmini.eastday.com/mobile/20170209/20170209153114_7d1b97e6f4a356210dbb0708f53f813e_3_mwpm_03200403.jpeg"
            },
            {
                "uniquekey": "b77f92aecb69a3804c35b4146fe8eef5",
                "title": "宝钢股份董事长陈德荣辞职 武钢2月14日终止上市",
                "date": "2017-02-09 13:34",
                "category": "头条",
                "author_name": "澎湃新闻网",
                "url": "http://mini.eastday.com/mobile/170209133442780.html",
                "thumbnail_pic_s": "http://01.imgmini.eastday.com/mobile/20170209/20170209133442_d2ad04dc6237b87b71e182c0dda657db_1_mwpm_03200403.jpeg"
            }
        ]
    },
    "error_code": 0
}

    写法:

接口部分:

public interface JuheApi {
    @POST(SERVER_JUHE+"toutiao/index")
    Call<DemoJuheModel> getList(@Arg("type") String type, @Arg("key") String key);
}

请求部分:

  /**
     * 直接根据地质拼接键值对解析的请求方式
     * @param type
     * @param key
     */
    private void doNetWork_juhe(String type, String key) {
        JuheNet.getsInstance().get().cancel(getClass().getName() + "MainActivityTAG_JUHE");
        JuheNet.build(JuheApi.class,getClass().getName() + "MainActivityTAG_JUHE").getList(type, key).enqueue(new Callback<DemoJuheModel>() {
            @Override
            public void onResponse(Result<DemoJuheModel> result) {
                if (!result.isOK()){
                    return;
                }
                DemoJuheModel djm = result.getResult();
                if (djm!=null){
                    tv_context1.setText(djm.getResult().getStat());
                }
            }
        });
    }

    未完待续~下班~下班~吃饭~减肥~

    技术分享

    ~

本文出自 “梁肖技术中心” 博客,请务必保留此出处http://liangxiao.blog.51cto.com/3626612/1896768

以上是关于Android Studio第三十期 - 介绍几种网络请求方式写法的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio第三十九期 - popWindows置顶

Android Studio第三十三期 - 蓝牙开发初识~

Android Studio第三十七期 - webview与js交互

Android Studio第三十一期 - 记录RecyclerView滚动位置并恢复

Android Studio第三十六期 - 模块化Activity管理Fragment

Android Studio第三十二期 - RecycleView不同布局适配器写法