框架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":{
}}
公共响应参数:
参数名 | 类型 | 说明 | 示例 |
---|---|---|---|
ok | boolean | 网络请求返回状态 | true |
code | int | 网络请求状态码 | 200 |
message | string | 网络请求状态信息 | ok |
- data | object | 返回数据内容,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
参数:
无 返回:
字段 | 类型 | 描述 |
---|---|---|
data | List<PlaylistTag> | 标签列表 |
code | Integer | 200 正常 500 异常 |
获取分类歌单列表
Uri: /playlist/oftag
参数:
字段 | 类型 | 描述 |
---|---|---|
name | String | 标签名称 |
order | String | hot or new |
limit | Integer | 返回数据量 |
offset | Integer | 偏移 |
返回:
字段 | 类型 | 描述 |
---|---|---|
data | List<Playlist> | 歌单列表 |
code | Integer | 200 正常 500 异常 |
hasMore | boolean | 是否还有更多 |
歌曲的Url
Uri: /url
参数:
字段 | 类型 | 描述 |
---|---|---|
songId | String | 歌曲Id |
bitrate | Integer | 比特率(只支持320/160/96三个数值,对应320/160/96kbps) |
返回:
正确调用会302跳转至歌曲对应的url,可直接播放或下载。songId不存在将返回httpcode:400
如果调用到达上限(每天每个设备320kbits的获取次数上限为1000次),将返回httpcode:401
歌曲的Url
Uri: /song/playurl
参数:
字段 | 类型 | 描述 |
---|---|---|
songId | String | 歌曲Id |
bitrate | Integer | 比特率(只支持320/160/96三个数值,对应320/160/96kbps) |
返回:
字段 | 类型 | 描述 |
---|---|---|
data | UrlInfoData | 播放音频信息 |
code | Integer | 200 正常 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());
}
}
});
}
未完待续~下班~下班~吃饭~减肥~
~