IOS菜鳥的所感所思(三)——通過伺服器介面獲取資料
一:你需要獲得某一個伺服器網頁的介面。(這個可以用抓包軟體獲取伺服器http的頭部資訊)
音樂歌曲對應的搜尋介面HTTP URL請求的地址:
http://music.163.com/api/search/get/web
需要設定的HTTP Haeder:
"Accept-Encoding”: "deflate,gzip"
"Content-Type”: "application/x-www-form-urlencoded"
"Referer”: "http://music.163.com/"
"User-Agent”: "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"
需要設定的HTTP Body:
NSString *body = [NSString stringWithFormat:@"s=%@&limit=%d&offset=%d&type=1”,搜尋的關鍵字,當前返回的搜尋結果數量num(num<=100),當前偏移量offset(offset==當前搜尋的頁數page*每頁返回的結果num)];
需要設定的HTTP Method:
POST
當然相關的知識資料請參考:點選開啟連結
二:建立一個介面,獲取網路資料。(新增一個繼承NSObject的FetchDataFromNet類)
1.建立一個類方法,用於獲取資料。
+ (void)fetchMusicData:(NSString *)key page:(NSInteger)page callback:(fetchTrackDataAndError)callback;
其中fetchTrackDataAndError是回撥方法,至於什麼是回撥方法,請參考:點選開啟連結。
typedef void(^fetchTrackDataAndError)(NSArray
引數的含義:key,這個是要搜尋的歌曲名;page,是第幾頁;array,是搜到的歌曲放在array中。
FetchDataFromNet.m檔案中:
#import "FetchDataFromNet.h"
#import "MusicData.h"
//定義網路路徑
#define url @"http://music.163.com/api/search/get/web"
//定義可以獲取的歌曲數
#define kLimit 1
@implementation FetchDataFromNet
+ (void
NSURL *musicURL = [NSURLURLWithString:url];
//建立該路徑下的請求,用來設定http頭部中的引數和方法型別
NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:musicURL];
[request setValue:@"deflate,gzip"forHTTPHeaderField:@"Accept-Encoding"];
[request setValue:@"application/x-www-form-urlencoded"forHTTPHeaderField:@"Content-Type"];
[request setValue:@"http://music.163.com/"forHTTPHeaderField:@"Referer"];
[request setValue:@"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"forHTTPHeaderField:@"User-Agent"];
NSLog(@"%@",request);
[request setHTTPMethod:@"POST"];
NSString *bodyString = [NSStringstringWithFormat:@"s=%@&limit=%d&offset=%ld&type=1",key,kLimit,page * kLimit];
[request setHTTPBody:[bodyString dataUsingEncoding:NSUTF8StringEncoding]];
//建立網路連結,傳送非同步請求;[NSURLConnectionsendAsynchronousRequest:request queue:[NSOperationQueuecurrentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (connectionError) {
callback(nil,page,connectionError);
} else{
//建立一個可變陣列,用來存放解析後的歌曲
NSMutableArray *trackMusicData = [NSMutableArraynew];
@try {
//建立一個字典用來儲存json格式解析後的資料
NSDictionary *itemDictionary = [NSJSONSerializationJSONObjectWithData:data options:kNilOptionserror:nil];
//列印該字典,看其中的屬性。
NSLog(@"%@",itemDictionary);
//利用屬性中的key獲得歌曲的陣列,也就獲得了songs陣列中的資料
NSArray *itemArray = [[itemDictionary objectForKey:@"result"] objectForKey:@"songs"];
//迴圈遍歷講歌曲初始化成MusicData的物件
[itemArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
MusicData *data = [MusicDatamusicDataWithDic:obj];
if (data) {
[trackMusicData addObject:data];
}
}];
}
@catch (NSException *exception) {
}
@finally {
//呼叫回撥方法,將歌曲傳給array
callback(trackMusicData,page,nil);
}
}
}];
}
@end
當然這需要你在ViewController.m呼叫一下該類的類方法。
- (void)testData:(NSString *)name page:(NSInteger)pageIndex{
[FetchDataFromNet fetchMusicData:name page:pageIndex callback:^(NSArray *array, NSInteger page, NSError *error){
if (error) {
NSLog(@"error = %@",error);
} else{
}
}];
}
- (void)viewDidLoad {
[superviewDidLoad];
[selftestData:@"lo"page:1];
}
這是一個歌曲的資訊,有很多的屬性,從而可以確定MusicData中需要哪些屬性變量了。
2015-05-20 18:13:02.509 GetData[1609:172269] {
code = 200;
result = {
songCount = 300;
songs = (
{
album = {
artist = {
albumSize = 0;
alias = (
);
id = 0;
img1v1 = 0;
img1v1Url = "http://p3.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg";
name = "";
picId = 0;
picUrl = "<null>";
trans = "<null>";
};
copyrightId = 5003;
id = 1633376;
name = "Garden Window";
picId = 562949953429998;
publishTime = 1321286400000;
size = 11;
status = 1;
};
alias = (
);
artists = (
{
albumSize = 0;
alias = (
);
id = 98435;
img1v1 = 0;
img1v1Url = "http://p4.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg";
name = "O'Brother";
picId = 0;
picUrl = "<null>";
trans = "<null>";
}
);
copyrightId = 5003;
duration = 222000;
fee = 0;
ftype = 0;
id = 17755320;
mvid = 0;
name = Lo;
rUrl = "<null>";
rtype = 0;
status = 1;
}
);
};
}
可以看出{songs({({album};{artists});id;duration})}
json的相關知識資料請參考:點選開啟連結
2.MusicData類的作用。
上面的類只是我們獲得網路資料的介面,然而若是想繼續用到這些資料,就需要對該歌曲物件進行標記,主要用key來進行識別。
MusicData.h檔案中:
//歌曲的屬性
@property(nonatomic,strong)NSString *trackIdentifier;
@property(nonatomic,strong)NSString *albumIdentifier;
@property(nonatomic,strong)NSString *artistIdentifier;
@property(nonatomic,strong)NSString *trackname;
@property(nonatomic,strong)NSString *albumname;
@property(nonatomic,strong)NSString *artistname;
@property(nonatomic,strong)NSString *logoname;
@property(nonatomic,strong)NSString *duration;
//api
+ (id)musicDataWithDic:(NSDictionary *)dic;
MusicData.m檔案中:
+ (id)musicDataWithDic:(NSDictionary *)dic{
return [[self alloc] initWithDic:dic];
}
- (id)initWithDic:(NSDictionary *)dic{
if (self = [super init]) {
self.trackIdentifier = [dic objectForKey:@"id"];
self.trackname = [dic objectForKey:@"name"];
self.duration = [dic objectForKey:@"duration"];
//進入字典中的字典去標識,用key去標識內層中的屬性
NSDictionary *albumDic = [dic objectForKey:@"album"];
self.albumIdentifier = [albumDic objectForKey:@"id"];
self.albumname = [albumDic objectForKey:@"name"];
NSDictionary *artistDic = [[dic objectForKey:@"artists" ] firstObject];
self.artistIdentifier = [artistDic objectForKey:@"id"];
self.artistname = [artistDic objectForKey:@"name"];
self.logoname = [artistDic objectForKey:@"img1v1Url"];
}
returnself;
}
這樣就可以在一個UITableVIewController檢視控制器中訪問這些資料了,可以把資料載入進cell中了。當然這些工作留在下一個的博文中。相關推薦
IOS菜鳥的所感所思(三)——通過伺服器介面獲取資料
一:你需要獲得某一個伺服器網頁的介面。(這個可以用抓包軟體獲取伺服器http的頭部資訊) 音樂歌曲對應的搜尋介面 HTTP URL請求的地址: http://music.163.com/api/search/get/web 需要設定的HTTP Haeder: "Acce
linux菜鳥基礎學習 (三)
sha then 系統安全 .com img ugo 目錄下的文件 文件讀寫 The 文件權限 1.文件屬性的查看 練習:ls 查看當前目錄下的文件和目錄ls -l 查看當前目錄下的文件和目錄屬性ll 查看當前目錄下的文件和目錄屬性 stat test 查看文件
Unity5權威講解之菜鳥讀書筆記(三)
Unity5權威講解之菜鳥讀書筆記(三) 11. Rigidbody 元件是模擬碰撞等物理效果的重要元件,具備以下屬性,如表所示。 屬性 含義 Mass
iOS菜鳥成長筆記(1)——第一個iOS應用
前言:陽光小強最近抽時間學習iOS開發,在學習過程中發現了很多有趣的東西也遇到了很多問題,為了在學習過程中能和大家交流,記錄下學習的心得和學習成果,所以就有了這一個系列文章,希望這一系列文章能形成一個系統性的東西,讓和我一樣剛步入iOS開發的朋友少走彎路,用最少的時間獲得最大
C++ 菜鳥之路 (三) Vector 的使用 與 csv檔案讀寫
Vector 的基本用法 在c++中,vector 是一個十分有用的容器, 相比一般的陣列可一方便的進行插入和刪除, 可以方便的查詢相關的資訊和清空。 (1)標頭檔案#include<vector>. (2)建立vector物件,ve
Linux菜鳥筆記——BASH(三)
實驗環境:Ubantu 16.04 一、路徑與命令查詢順序 type -a echo #打印出來的資訊中,從上到下表示執行命令的優先順序由高到低 二、bash的登入與歡迎資訊 1、登入前的資訊修改: vim /etc/issue vim /etc/issue.n
iOS開發之靜態庫(三)—— 圖片、介面xib等資原始檔封裝到.a靜態庫
轉自:https://blog.csdn.net/mylizh/article/details/38707175編譯環境:Macbook Air + OS X 10.9.2 + XCode5.1 + iPhone5s(iOS7.0.3)一、首先將資原始檔打包成bundle新建
Flume NG原始碼分析(三)使用Event介面表示資料流
Flume NG有4個主要的元件: Event表示在Flume各個Agent之間傳遞的資料流 Source表示從外部源接收Event資料流,然後傳遞給Channel Channel表示對從Source傳遞的Event資料流的臨時儲存 Sink表示從Channel中接收儲存的Event
Kotlin學習記錄(三)—— 子執行緒獲取資料,實現簡單ListView
上一篇簡單介紹了Kotlin的一些基礎構成,當然還有像物件宣告、操作符等等都未涉及到,這些會在以後用到的過程中進行詳細說明。 專案中ListView列表出現的頻率是很高的,我們就以實現一個簡單ListView為目標,介紹一下在子執行緒中獲取資料等問題。 首先在la
菜鳥成長記(十三)----- 草草啟程,半途終了?
下一步 後臺 十分鐘 一道 一是 算法題 ceo 奮鬥 同時 來北京兩個多月了,也在現在這家遊戲公司上了一個多月的班了,對於目前自己這狀態真的是撞墻的心都有了。我不知道我到底是怎麽了,一念清醒九念操蛋,心裏面清楚的知道自己應該做什麽,不應該做什麽,但是就是怎麽也控制不住
七步從AngularJS菜鳥到專家(7):Routing
們的 cat idt pan post 好的 書簽 廣播電臺 快速 這是"AngularJS – 七步從菜鳥到專家"系列的第七篇。在第一篇,我們展示了如何開始搭建一個AngularaJS應用。在第四、五篇我們討論了Angular內建的directives。上一篇了解了se
菜鳥調錯(四)——Spring與DWR集成,配置文件報錯
microsoft his www data editors bing ces myeclipse java 背景簡單介紹:該項目是市信用辦的一個系統,之前好像是一個石家莊的公司負責的。我屬於是半路接手。拿到源代碼後。依據他們給的簡(shao)單(de)明(ke)了(l
菜鳥初學redis(二)
ack 沒有 進制 序列化 cnblogs key demo 二進制 循環 如果你的redis可以在myeclipse上運行小demo了,那麽可以繼續學習了 redis Java String 實例 string是redis最基本的類型,一個key對應一個value。 st
Python從菜鳥到高手(3):聲明變量
ble href edi 一個 android 聲明變量 字符串類型 的人 重要 變量(variable)是Python語言中一個非常重要的概念。變量的主要作用就是為Python程序中的某個值起一個名字。類似於“張三”、“李四”、“王二麻子”一樣的人名,便於記憶。 ??在P
Python從菜鳥到高手(2):清空Python控制臺
cls stdout 聲明 交互 打開 成功 html 重新 指向 執行python命令會進入Python控制臺。在Python控制臺中可以用交互的方式執行Python語句。也就是執行一行Python語句,會立刻返回執行結果。 ??當Python控制臺輸入過多的Python
Python從菜鳥到高手(4):導入Python模塊
imp port fun code image 技術分享 pro 出版 麻煩 在Python代碼中導入模塊需要使用import語句,語法結構如下: import module_name ??引用模塊中函數的語法如下: module_name.function_name ??
Python從菜鳥到高手(5):數字
優先級 菜鳥 這一 轉換 介紹 href .com hex 包含 1 基礎知識 ??Python語言與其他編程語言一樣,也支持四則運算(加、減、乘、除),以及圓括號運算符。在Python語言中,數字分為整數和浮點數。整數就是無小數部分的數,浮點數就是有小數部分的數。例如,下
Python從菜鳥到高手(6):獲取用戶輸入、函數與註釋
依次 都是 正弦 .cn 應該 asc pri 控制臺 html 1. 獲取用戶輸入 要編寫一個有實際價值的程序,就需要與用戶交互。當然,與用戶交互有很多方法,例如,GUI(圖形用戶接口)就是一種非常好的與用戶交互的方式,不過我們先不討論GUI的交互
Python從菜鳥到高手(7):字符串
imageview ofo ror 如果 http 其實在 orien python語言 組合 1. 單引號字符串和轉義符 字符串與數字一樣,都是值,可以直接使用,在Python控制臺中直接輸入字符串,如"Hello World”,會按原樣
Python從菜鳥到高手(8):print函數、賦值與代碼塊
images rec 控制臺輸出 error enter sam 運算 賦值 編程語言 1.神奇的print函數 ??print函數相信讀者一定對它不陌生,因為在前面的章節,幾乎每個例子都使用了print函數,這個函數的功能就是在控制臺輸出文本。不過print在輸出文本時還