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

宝剑锋从磨砺出,梅花香自苦寒来。这篇文章主要讲述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平台)是经过加密安全处理的,遵守以下规则:

  • 【Android Studio第三十期 - 介绍几种网络请求方式写法】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)
       
Android Studio第三十期 - 介绍几种网络请求方式写法

文章图片

{         "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());                                 }                         }                 });         }

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

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

文章图片

    ~

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

    推荐阅读