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":{
}}
公共响应参数:
参数名 | 类型 | 说明 | 示例 |
---|---|---|---|
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()); } } }); }
未完待续~下班~下班~吃饭~减肥~
~
本文出自 “梁肖技术中心” 博客,请务必保留此出处http://liangxiao.blog.51cto.com/3626612/1896768
以上是关于Android Studio第三十期 - 介绍几种网络请求方式写法的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio第三十九期 - popWindows置顶
Android Studio第三十七期 - webview与js交互
Android Studio第三十一期 - 记录RecyclerView滚动位置并恢复