1. 程式人生 > >IOS菜鳥的所感所思(三)——通過伺服器介面獲取資料

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

*array, NSInteger page, NSError *error);

引數的含義: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
)fetchMusicData:(NSString *)key page:(NSInteger)page callback:(fetchTrackDataAndError)callback{

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在輸出文本時還