前言:很多初学者学到一定的知识时候,会想说 我们从服务端怎么接受数据,最近在做一个音乐播放器,前段时间自己弄了自定义歌词滚动,后来发现 这个满足不了,歌词文件怎么办,想到了去服务器下载。于是我找了很多 比如说QQ音乐,百度音乐,酷狗音乐,好像都没有提供API ,最后找到了一个交歌词迷的API。虽然资源比较少,但是凑合着用,毕竟免费的,接下来 来展示下从服务器如何接受数据。
从服务器接收回来的数据一般有两种格式 一种是json/xml
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
XML
HTTP(GET) / GBK,UTF-8 这个就不用说了会点网络编程都知道
2.接口返回值类型
JSON
3.根据歌名/歌手获取JSON数据
请求的地址:http://geci.me/api/lyric/ SongName (这里的SongName 指的是歌名)
请求的地址:http://geci.me/api/lyric/ SongName/Artist (这里的SongName 指的是歌名,Artist指的是歌手名)
接下来我们看下实际的操作:
比如说我们请求
http://geci.me/api/lyric/海阔天空
则我们会接收到网页返回来一串字符串:
{
"count": 15,
"code": 0,
"result":
[
{"aid": 1563419, "lrc": "http://s.geci.me/lrc/166/16685/1668536.lrc", "artist": "Beyond", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 1668536},
{"aid": 1571906, "lrc": "http://s.geci.me/lrc/167/16796/1679605.lrc", "artist": "Beyond", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 1679605},
{"aid": 1573814, "lrc": "http://s.geci.me/lrc/168/16819/1681961.lrc", "artist": "Beyond", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 1681961},
{"aid": 1618733, "lrc": "http://s.geci.me/lrc/174/17407/1740790.lrc", "artist": "\u5468\u534e\u5065", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 1740790},
{"aid": 1656038, "lrc": "http://s.geci.me/lrc/179/17907/1790768.lrc", "artist": "Beyond", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 1790768},
{"aid": 1718741, "lrc": "http://s.geci.me/lrc/187/18757/1875769.lrc", "artist": "Beyond", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 1875769},
{"aid": 1889264, "lrc": "http://s.geci.me/lrc/210/21070/2107014.lrc", "artist": "\u8d39\u7fd4", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2107014},
{"aid": 2003267, "lrc": "http://s.geci.me/lrc/226/22642/2264296.lrc", "artist": "Beyond", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2264296},
{"aid": 2020610, "lrc": "http://s.geci.me/lrc/228/22889/2288967.lrc", "artist": "Beyond", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2288967},
{"aid": 2051678, "lrc": "http://s.geci.me/lrc/233/23323/2332322.lrc", "artist": "Beyond", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2332322},
{"aid": 2075717, "lrc": "http://s.geci.me/lrc/236/23651/2365157.lrc", "artist": "\u8d39\u7fd4", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2365157},
{"aid": 2253359, "lrc": "http://s.geci.me/lrc/261/26128/2612812.lrc", "artist": "\u9ec4\u79cb\u751f", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2612812},
{"aid": 2319680, "lrc": "http://s.geci.me/lrc/270/27055/2705565.lrc", "artist": "\u4efb\u8d24\u9f50", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2705565},
{"aid": 2346662, "lrc": "http://s.geci.me/lrc/274/27442/2744281.lrc", "artist": "\u6797\u5b50\u7965", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2744281},
{"aid": 2412272, "lrc": "http://s.geci.me/lrc/283/28370/2837015.lrc", "artist": "DJ Tommy", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2837015}
]
}
这样的一串字符串则为JSON,至于如何解析等下再来。获取到网页这么一串字符串我们最后怎么解析。
首先我们要先获取到这么一串字符串,当然是通过URL网页请求来获取内容:
public static String NewToolString(String path)
{
DefaultHttpClient client1 = new DefaultHttpClient();
/** NameValuePair是传送给服务器的请求参数 param.get("name") **/
UrlEncodedFormEntity entity1 = null;
/** 新建一个get请求 **/
HttpGet get = new HttpGet(path);
HttpResponse response1 = null;
String strResult1 = "";
try
{
/** 客服端向服务器发送请求 **/
response1 = client1.execute(get);
} catch (ClientProtocolException e)
{
e.printStackTrace();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
/** 请求发送成功,并得到响应 **/
if (response1.getStatusLine().getStatusCode() == 200)
{
try
{
/** 读取服务器返回过来的json字符串数据 **/
strResult1 = EntityUtils.toString(response1.getEntity());
return strResult1;
} catch (IllegalStateException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return "";
}
参数path:则为我们传进去的请求网页比如 http://geci.me/api/lyric/童话/光良
获取到这么一串字符串,我们就要开始解析,这里我就简单的提一下解析,想要更深入了解可以去看书籍以及视频,
记得我很早之前学习的时候是通过老罗的视频第一季学习的。
JSON格式 都是以键值对存在 一个{}为一个JSON对象 当然{}里面还可以嵌套一个{} 或[] 数组
{
“count”:1;
“code”:0
"result":
[
{},
{}
]
}
从上面可以看出 result 是一个数组 数组里面都为一个JSON对象 一次类推,通过JSON数组的下标继续访问里面的键值对
具体怎么访问,接下来 铁代码
public static void getInfors(String jString)
{
try
{
JSONObject jsonObject = new JSONObject(jString);
int count = jsonObject.getInt("count");
Log.i("TAG", count + "");
int code = jsonObject.getInt("code");
Log.i("TAG", code + "");
// JSONObject result=jsonObject.getJSONObject("result");
JSONArray result = jsonObject.getJSONArray("result");
if (result.length() != 0)
{
for (int i = 0; i < result.length(); i++)
{
JSONObject jsonObject2 = result.getJSONObject(i);
int aid = jsonObject2.getInt("aid");
Log.i("TAG", aid + "");
String lrc = jsonObject2.getString("lrc");
Log.i("TAG", lrc);
String song = jsonObject2.getString("song");
Log.i("TAG", song);
int artist_id = jsonObject2.getInt("artist_id");
Log.i("TAG", artist_id + "");
int sid = jsonObject2.getInt("sid");
Log.i("TAG", sid + "");
}
}
} catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我用日志打出了崔后解析的结果 就像上图一样。
其他的API接口也是一样的使用。只是服务器返回的信息不一样 解析的信息不一样而已,