❶ iOS開發中網路請求的代碼放到哪兒比較好
一般網路請求的代碼都封裝到一個工具類中。MVC的話就放到model層中
❷ iOS網路請求庫
這已經是老生常談的問題了。
作為一個入門級、大眾級的封裝,彷彿在網上隨隨便便就能找到一套適用於自己的方案。在afnetworking一統天下之後(得到了蘋果官方認可),基於其afnetworking的封裝也越來越全面、強大。
但是,每一個開發者都想擁有屬於自己的網路請求庫☺,而且很多別人的封裝用起來隔靴搔癢,所以我們在整理了項目內所有網路請求的痛點之後,搞了一套最適合我們自己的方案。
我們現在就用最流行的「影響地圖」來解構這套框架。
由於類名有所修改,所以這個框架圖可以參考來看
這套方案能為我們帶來什麼
相比於afnetworking,ZZCHTTPSession提供了以下功能:
適用項目
除了URL的管理稍顯復雜之外,其他都盡量向輕量級,適用性靠攏。
適合中小型項目的開發使用,個人開發尤其推薦(使用鏈式的方式傳參,完全是不想聲明那麼多的API啊,盡管有一部分開發試聽抗拒這種方式的😂)。
支持大部分APP對URL管理、內存硬碟緩存、多個請求管理、model管理的要求。對依賴路由的APP能發揮最大優勢。(完全解耦)
基本思想
ZZCURLManagement配置URL,ZZCHTTPSessionSignal配置請求,建議加一個協議層,用來管理所有的signal。
協議層使用ZZCHTTPServer的分類。
簡單demo:
相關使用:
git地址:
https://github.com/lzy1010/ZZCHTTPManager
❸ IOS怎麼抓取網路請求包
好吧,蘋果提供了命令行監控的方法,將iPhone連接到Mac電腦的USB,輸入特定命令來監聽iPhone的所有網路請求。
請求的內容會寫入到一個文件,讀取該文件即可獲取所有網路請求。
而該文件需要特定工具才能打開,用WireShark,它再次派上了用場。
——————監控網路請求的步驟—————–
1.將iPhone連接到Mac電腦
2.從Xcode或者iTunes獲得iPhone的UUID,一串32位的標示,類似0B6814B3-EB2F-5B85-929D-7C5C5SS8DB64
3.命令行輸入rvictl -s [你的手機UUID標示],打開Mac監聽
4.命令行輸入sudo tcpmp -i rv0 -n -s 0 -w mpFile.pcap tcp,開始向文件寫入監控數據
結束監聽時,ctrl+c關閉tcpmp進程。
關閉Mac監聽,命令是 rvictl -v [你的手機UUID標示]
——————步驟結束———————–
以下是蘋果官方文檔
iOS Packet Tracing
iOS does not support packet tracing directly. However, if you』re developing for iOS you can take a packet trace of your app in a number of different ways:
If the problem you』re trying to debug occurs on Wi-Fi, you can put your iOS device on a test Wi-Fi network. See Wi-Fi Capture for details.
If your app uses HTTP, you can configure your iOS device to use a debugging HTTP proxy (such as Charles HTTP Proxy).
In iOS 5 and later you can use the remote virtual interface facility.
Remote Virtual Interface
iOS 5 added a remote virtual interface (RVI) facility that lets you use OS X packet trace programs to capture traces from an iOS device. The basic strategy is:
Connect your iOS device to your Mac via USB.
Set up an RVI for that device. This creates a virtual network interface on your Mac that represents the iOS device』s networking stack.
Run your OS X packet trace program, and point it at the RVI created in the previous step.
To set up an RVI, you should run the rvictl tool as shown below.
# First get the current list of interfaces.# First get the current list of interfaces. ifconfig -l
lo0 gif0 stf0 en0 en1 p2p0 fw0 ppp0 utun0
# Then run the tool with the UDID of the device.# Then run the tool with the UDID of the device. rvictl -s
Starting device [SUCCEEDED]
# Get the list of interfaces again, and you can see the new virtual# Get the list of interfaces again, and you can see the new virtual # network interface, rvi0, added by the previous command.
$ ifconfig -l
lo0 gif0 stf0 en0 en1 p2p0 fw0 ppp0 utun0 rvi0
Now that you know the name of the RVI, you can point your packet trace tool at it. For example, here』s how you might run tcpmp to take a packet trace from the RVI and write it to the file trace.pcap.
$ sudo tcpmp -i rvi0 -w trace.pcap
tcpmp: WARNING: rvi0: That device doesn』t support promiscuous mode
(BIOCPROMISC: Operation not supported on socket)
tcpmp: WARNING: rvi0: no IPv4 address assigned
tcpmp: verbose output suppressed, use -v or -vv for full protocol decode
listening on rvi0, link-type RAW (Raw IP), capture size 65535 bytes
When you』re done you can remove the RVI with the following command.
$ rvictl -x
Stopping device [SUCCEEDED]
Important: The RVI represents the entire networking stack of the iOS device; there』s no way to trace a specific interface on the device, or even learn which packets were transferred on which interface.
❹ android 網路請求數據一般寫在哪
一、需要用到的場景 在jQuery中使用$.post()就可以方便的發起一個post請求,在android程序中有時也要從伺服器獲取一些數據,就也必須得使用post請求了。 二、需要用到的主要類 在android中使用post請求主要要用到的類是HttpPost、HttpResponse、EntityUtils 三、主要思路 1、創建HttpPost實例,設置需要請求伺服器的url。 2、為創建的HttpPost實例設置參數,參數設置時使用鍵值對的方式用到NameValuePair類。 3、發起post請求獲取返回實例HttpResponse 4、使用EntityUtils對返回值的實體進行處理(可以取得返回的字元串,也可以取得返回的byte數組) 代碼也比較簡單,注釋也加上了,就直接貼出來了 [java] package com.justsy.url; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import android.app.Activity; import android.os.Bundle; public class HttpURLActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); System.out.println("start url..."); String url = "192.168.2.112:8080/JustsyApp/Applet"; // 第一步,創建HttpPost對象 HttpPost httpPost = new HttpPost(url); // 設置HTTP POST請求參數必須用NameValuePair對象 List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("action", "downloadAndroidApp")); params.add(new BasicNameValuePair("packageId", "89dcb664-50a7-4bf2-aeed-49c08af6a58a")); params.add(new BasicNameValuePair("uuid", "test_ok1")); HttpResponse httpResponse = null; try { // 設置httpPost請求參數 httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); httpResponse = new DefaultHttpClient().execute(httpPost); //System.out.println(httpResponse.getStatusLine().getStatusCode()); if (httpResponse.getStatusLine().getStatusCode() == 200) { // 第三步,使用getEntity方法活得返回結果 String result = EntityUtils.toString(httpResponse.getEntity()); System.out.println("result:" + result); T.displayToast(HttpURLActivity.this, "result:" + result); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("end url..."); setContentView(R.layout.main); } } ADD:使用HttpURLConnection 進行post請求 [java] String path = "192.168.2.115:8080/android-web-server/httpConnectServlet.do?PackageID=89dcb664-50a7-4bf2-aeed-49c08af6a58a"; URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(5000); System.out.println(conn.getResponseCode()); ============================================================================================================================ 通過get和post方式向伺服器發送請求 首先說一下get和post的區別 get請求方式是將提交的參數拼接在url地址後面,例如/index.jsp?num=23&jjj=888; 但是這種形式對於那種比較隱私的參數是不適合的,而且參數的大小也是有限制的,一般是1K左右吧,對於上傳文件 就不是很適合。 post請求方式是將參數放在消息體內將其發送到伺服器,所以對大小沒有限制,對於隱私的內容也比較合適。 如下Post請求 POST /LoginCheck HTTP/1.1 Accept: text/html, application/xhtml+xml, */* Referer: 192.168.2.1/login.asp Accept-Language: zh-CN User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; BOIE9;ZHCN) Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: 192.168.2.1 Content-Length: 39 Connection: Keep-Alive Cache-Control: no-cache Cookie: language=en Username=admin&checkEn=0&Password=admin //參數位置 在android中用get方式向伺服器提交請求: 在android模擬器中訪問本機中的tomcat伺服器時,注意:不能寫localhost,因為模擬器是一個單獨的手機系統,所以要寫真是的IP地址。 否則無法訪問到伺服器。 //要訪問的伺服器地址,下面的代碼是要向伺服器提交用戶名和密碼,提交時中文先要經過URLEncoder編碼,因為模擬器默認的編碼格式是utf-8 //而tomcat內部默認的編碼格式是ISO8859-1,所以先將參數進行編碼,再向伺服器提交。 private String address = "192.168.2.101:80/server/loginServlet"; public boolean get(String username, String password) throws Exception { username = URLEncoder.encode(username);// 中文數據需要經過URL編碼 password = URLEncoder.encode(password); String params = "username=" + username + "&password=" + password; //將參數拼接在URl地址後面 URL url = new URL(address + "?" + params); //通過url地址打開連接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //設置超時時間 conn.setConnectTimeout(3000); //設置請求方式 conn.setRequestMethod("GET"); //如果返回的狀態碼是200,則一切Ok,連接成功。 return conn.getResponseCode() == 200; } 在android中通過post方式提交數據。 public boolean post(String username, String password) throws Exception { username = URLEncoder.encode(username);// 中文數據需要經過URL編碼 password = URLEncoder.encode(password); String params = "username=" + username + "&password=" + password; byte[] data = params.getBytes(); URL url = new URL(address); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(3000); //這是請求方式為POST conn.setRequestMethod("POST"); //設置post請求必要的請求頭 conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");// 請求頭, 必須設置 conn.setRequestProperty("Content-Length", data.length + "");// 注意是位元組長度, 不是字元長度 conn.setDoOutput(true);// 准備寫出 conn.getOutputStream().write(data);// 寫出數據 return conn.getResponseCode() == 200;
❺ iOS 14:為什麼APP請求本地網路想要掃描本地網路追蹤
隨著iOS 14正式版的推送升級到新版本的用戶越來越多 , 不過也有用戶發現升級後系統在某些方面似乎有些變化。
比如屏幕頂部經常提示某某應用讀取剪切板、音視頻通話時屏幕頂部出現圓點,還有彈出本地網路訪問許可權許可。
本地網路訪問許可權指的是什麼?APP是否有必要讀取本地網路?用戶是否需要進行授予?本文我們給大家分析下。
什麼是本地網路:
本地網路其實指的就是本地區域網,比如我們的手機連接家裡的路由器,通過這台路由器可以構建家庭的區域網。
iOS 14里新增的本地網路訪問許可權是蘋果為增加隱私透明度引入的 , 實際上在此前版本這個許可權可以被任意訪問。
當APP調用相關介面時即可通過蘋果設備訪問用戶所在區域網,包括掃描該區域網下的所有設備並收集相關信息。
蘋果在新版本里為提高透明度要求APP添加本地網路隱私許可權支持,即需要調用時必須徵得用戶同意後才可訪問。
APP是否有必要讀取本地網路:
本地網路訪問許可權是個非必要的許可權,也就是說有些應用程序基於其實際功能確實需要調用本地網路的訪問許可權。
例如微軟推出的遠程桌面協議客戶端,我們安裝該客戶端後可以通過區域網內的計算機IP地址連接對應的計算機。
如果不授予本地網路訪問許可權的話則遠程桌面協議客戶端無法訪問對應的內網地址,導致無法連接區域網計算機。
因此微軟遠程桌面協議客戶端訪問本地網路完全合理的,因為不授予的話會造成該應用的主要功能無法正常使用。
而有些APP根本不需要與本地網路進行交互,例如電商類應用並不需要連接本地設備,那就沒必要讀取本地網路。
用戶是否應該授予本地網路許可權:
是否授予本地網路許可權取決於應用是否需要使用本地網路許可權,如果需要使用的話那用戶則必須授予對應的許可權。
例如小米米家系列控制類的APP,這些應用需要連接本地網路中的物聯網設備,因此使用本地網路許可權是合理的。
也就是說凡是應用因為其功能必須訪問區域網里的設備那使用就是合理的,反之使用本地網路許可權就是不合理的。
更簡單的判斷方法:任何APP請求本地網路許可權直接拒絕,拒絕後若是影響其主要功能的使用那就去設置里恢復。
如果拒絕讀取本地網路後並不影響APP主要功能的使用那就是不合理的調用,因此用戶拒絕其讀取是完全沒事的。
在哪裡調整本地網路許可權 :轉到設置的隱私里即可看到本地網路,點開後就會羅列所有請求的應用可以隨時開關。
購物軟體調用本地網路多半是追蹤用戶:
在藍點網的實際測試中我們發現大多數應用都不會調用本地網路或者是合理調用,少部分應用則存在不合理調用。
例如電商購物類軟體調用本地網路大多數都是不合理的,這些應用無需與本地網路交互也不控制連接區域網設備。
那為什麼這類軟體要調用本地網路呢?我們猜測這可能是用於追蹤用戶,通過掃描區域網設備來收集用戶的信息。
掃描區域網可以獲得:1、區域網設備例如路由器和其他設備IP和MAC ;2、利用這些信息生成用戶身份標識符。
這些信息可以生成的標識符甚至可以跨設備、跨應用、持續性的追蹤用戶,並根據收集的信息對用戶進行畫像等。
因此我們推薦用戶拒絕所有APP請求本地網路許可權,除非出現工作不正常否則沒必要授予、防止自己被持續追蹤。
❻ iOS 網路請求有哪些方式
兩種請求方式GET,POST
兩種請求方式的比較
相同點:都能給伺服器傳輸數據
不同點:
1、給伺服器傳輸數據的方式:
GET:通過網址字元串。POST:通過data
2、傳輸數據的大小:GET:⽹址字元串最多255位元組。POST:使用NSData,容量超過1G
3、安全性:GET:所有傳輸給伺服器的數據,顯示在網址里,類似於密碼的明文輸入,直接可見。
POST:數據被轉成NSData(二進制數據),類似於密碼的密文輸⼊入,⽆無法直接讀取。
連接方式
同步:使用一個線程(主線程)完成所有的工作,效率低,當線程正在執行一個任務的時候無法執行另一個任務,所有如果使用同步進行網路數據的請求,那麼在該線程進行網路請求時,暫時無法響應用戶的點擊事件,用戶體驗極差
非同步:再開一個線程(子線程)去完成任務,此時,主線程依然可以監聽用戶的點擊事件,不會造成卡頓,用戶體驗較好
❼ ios開發怎麼用定時器進行網路請求
看下是不是你需要的答案(實在搞不定,可以到我們27773技術眾包平台,顧問能幫你找合適的技術牛人)?
如何通過URL獲取json數據
第一種,利用AFJSONRequestOperation,官方網站上給的例子:
NSString *str=[NSString stringWithFormat:@"https://alpha-api.app.net/stream/0/posts/stream/global"];
NSURL *url = [NSURL URLWithString:[str :NSUTF8StringEncoding]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 從URL獲取json數據
AFJSONRequestOperation *operation1 = [AFJSONRequestOperation :requestsuccess:^(NSURLRequest *request, NSHTTPURLResponse *response, NSDictionary* JSON) {
NSLog(@"獲取到的數據為:%@",JSON);
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id data) {
NSLog(@"發生錯誤!%@",error);
}];
[operation1 start];
第二種方法,利用AFHTTPRequestOperation 先獲取到字元串形式的數據,然後轉換成json格式,將NSString格式的數據轉換成json數據,利用IOS5自帶的json解析方法:
NSString *str=[NSString stringWithFormat:@"https://alpha-api.app.net/stream/0/posts/stream/global"];
NSURL *url = [NSURL URLWithString:[str :NSUTF8StringEncoding]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *html = operation.responseString;
NSData* data=[html dataUsingEncoding:NSUTF8StringEncoding];
id dict=[NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"獲取到的數據為:%@",dict);
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"發生錯誤!%@",error);
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation];
如果發生Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0x14defc80 {NSUnderlyingError=0x14deea10 "bad URL", NSLocalizedDescription=bad URL這個錯誤,請檢查URL編碼格式。有沒有進行:NSUTF8StringEncoding
如何通過URL獲取圖片
非同步獲取圖片,通過隊列實現,而且圖片會有緩存,在下次請求相同的鏈接時,系統會自動調用緩存,而不從網上請求數據。
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 100.0f, 100.0f, 100.0f)]; [imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"]placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]]; [self.view addSubview:imageView];
上面的方法是官方提供的,還有一種方法,
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.scott-sherwood.com/wp-content/uploads/2013/01/scene.png"]];
AFImageRequestOperation *operation = [AFImageRequestOperation :requestimageProcessingBlock:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
self.backgroundImageView.image = image;
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"Error %@",error);
}];[operation start];
如果使用第一種URLWithString: placeholderImage:會有更多的細節處理,其實實現還是通過AFImageRequestOperation處理,可以點擊URLWithString: placeholderImage:方法進去看一下就一目瞭然了。所以我覺得還是用第一種好。
如何通過URL獲取plist文件
通過url獲取plist文件的內容,用的很少,這個方法在官方提供的方法裡面沒有
NSString *weatherUrl = @"http://www.calinks.com.cn/buick/kls/Buickhousekeeper.plist";
NSURL *url = [NSURL URLWithString:[weatherUrl :NSUTF8StringEncoding]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[ addAcceptableContentTypes:[NSSet setWithObject:@"text/plain"]];
*operation = [ :request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id propertyList) {
NSLog(@"%@",(NSDictionary *)propertyList);
}failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id propertyList) {
NSLog(@"%@",error);
}];[operation start];
如果稍不留神,可能就出現Error Domain=AFNetworkingErrorDomain Code=-1016 "Expected content type {(
"application/x-plist"
)}, got text/plain" UserInfo=0x16e91ce0 {NSLocalizedRecoverySuggestion=...
...
, = { }, NSErrorFailingURLKey=, NSLocalizedDescription=Expected content type {(
"application/x-plist"
)}, got text/plain, = { URL: } { status code: 200, headers {
"Accept-Ranges" = bytes;
Connection = "keep-alive";
"Content-Length" = 974;
"Content-Type" = "text/plain";
Date = "Sat, 25 Jan 2014 07:29:26 GMT";
Etag = ""1014c2-3ce-4ee63e1c80e00"";
"Last-Modified" = "Wed, 25 Dec 2013 23:04:24 GMT";
Server = "nginx/1.4.2";} }}
可能還會出現亂碼,解決辦法就是[ addAcceptableContentTypes:[NSSet setWithObject:@"text/plain"]];
如何通過URL獲取XML數據
xml解析使用AFXMLRequestOperation,需要實現蘋果自帶的NSXMLParserDelegate委託方法,XML中有一些不需要的協議格式內容,所以就不能像json那樣解析,還得實現委託。我之前有想過能否所有的XML鏈接用一個類處理,而且跟服務端做了溝通,結果很不方便,效果不好。XML大多標簽不同,格式也不固定,所以就有問題,使用json就要方便的多。
第一步;在.h文件中加入委託NSXMLParserDelegate
第二步;在.m文件方法中加入代碼
NSURL *url = [NSURL URLWithString:@"http://113.106.90.22:5244/sshopinfo"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFXMLRequestOperation *operation =
[AFXMLRequestOperation :request success:^(NSURLRequest *request,NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
XMLParser.delegate = self;
[XMLParser setShouldProcessNamespaces:YES];
[XMLParser parse];
}failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLParser *XMLParser) {
NSLog(@"%@",error);
}];
[operation start];
第三步;在.m文件中實現委託方法
//在文檔開始的時候觸發
-(void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"解析開始!");
}
//解析起始標記
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
NSLog(@"標記:%@",elementName);
}
//解析文本節點
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSLog(@"值:%@",string);
}
//解析結束標記
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
NSLog(@"結束標記:%@",elementName);
}
//文檔結束時觸發
-(void) parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"解析結束!");
❽ iOS開發 GET、POST請求方法(NSURLConnection篇)
Web Service使用的主要協議是HTTP協議,即 超文本傳輸協議 。
HTTP/1.1協議共定義了8種請求方法(OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT)作為Web伺服器。
GET方法 ,是向指定的資源發送請求,請求的參數「顯式」地在URL的後面。有點像明信片,把內容「顯式」寫在外面,因此安全性比較差。一般使用於讀取數據、例如從伺服器讀取靜態圖片、或查詢數據等。
POST方法 ,是向指定資源提交數據,請求伺服器進行處理,數據包含在 請求體 中。參數和地址分開,放在body裡面。有點像把信內容放在信封中,接觸的人看不到,安全性比較高。一般用於例如提交表單、上傳文件等(請求的的動態資源,與查詢類似,每個方法調用都要傳遞很多參數,因此需要使用NSMutableURLRequest創建請求。 )
iOS SDK中為HTTP請求提供了同步和非同步請求這兩種不同的API,
同步請求,可以從網際網路請求數據,一旦發送同步請求,程序將停止用戶交互,直至伺服器返回數據完成,才可以進行下一步操作,意味著線程阻塞;
非同步請求,不會阻塞主線程,而會建立一個新的線程來操作,用戶發出非同步請求後,依然可以對UI進行操作,程序可以繼續運行;
它們的主要區別在於連接方式的不同。
下面通過請求一個登陸介面介紹有關於網路請求中的不同情況。
【本次開發環境: Xcode:7.2 iOS Simulator:iphone6 By:啊左】
一、GET方法
1.同步get方法:
//1.創建一個web路徑
NSString*webPath=[NSString stringWithFormat:@"http://172.16.2.254/php/phonelogin?name=%@&pass=%@&btn=login",yourname,yourpass];
webPath=[webPath :NSUTF8StringEncoding]; //url不允許為中文等特殊字元,需要進行字元串的轉碼為URL字元串,例如空格轉換後為「%20」;
NSURL *url=[NSURL URLWithString:webPath];
//2.根據WEB路徑創建一個請求
NSURLRequest *request=[NSURLRequest requestWithURL:url];
NSURLResponse *respone;//獲取連接的響應信息,可以為nil
NSError *error; //獲取連接的錯誤時的信息,可以為nil
//3.得到伺服器數據
NSData*data=[NSURLConnection sendSynchronousRequest: request returningResponse: respone error: &error];
if(data==nil) { NSLog(@"登陸失敗:%@,請重試",error); return; }
/* 4.對伺服器獲取的數據data進行相應的處理; */
2.非同步get方法:
非同步請求與同步請求的不同在於使用NSURLConnectionDataDelegate委託協議,指定代理.
@interface ViewController : UIViewController // 遵循協議
@property (weak,nonatomic) NSMutableData *receiveData; //創建一個可變data,用於非同步接收伺服器的數據
@end
創建網路請求:
//1.創建一個web路徑
NSString*webPath=[NSString stringWithFormat: @"http://172.16.2.254/php/phonelogin?name=%@&pass=%@&btn=login",yourname,yourpass];
webPath=[webPath :NSUTF8StringEncoding];
NSURL *url=[NSURL URLWithString:webPath];
//2.根據WEB路徑創建一個請求
NSURLRequest *request=[NSURLRequest requestWithURL:url];
//3.指定代理 以非同步的方式接收數據NSURLConnectionDataDelegate
NSURLConnection *con=[NSURLConnection connectionWithRequest:request delegate:self];
if(con==nil)
{
NSLog(@"創建連接失敗.");
return;
}
else//成功 准備接數據
{
if(self.receiveData==nil)
{
self.receiveData=[[NSMutableData alloc] init];
}
}
非同步的代理行為:
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
NSLog(@"已經響應成功.");
//清空 為當前連接做准備
self.receiveData.length=0;
}
-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ NSLog(@"已經接收到了數據.");
//追加接收到的數據
[self.receiveData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSLog(@"接收數據已經完成.");
/* 對伺服器獲取的數據receiveData進行相應的處理; */
}
-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ NSLog(@"連接失敗.");
}
二、POST方法
1.同步post方法:
//1.創建一個web路徑
NSString *webPath=@"http://172.16.2.254/php/phoneloginpost.php";
webPath = [webPath :NSUTF8StringEncoding]; NSURL *url=[NSURL URLWithString:webPath];
//2.建立一個帶協議緩存類型的請求 (使用NSMutableURLRequest,是post方法的關鍵) NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url cachePolicy:() timeoutInterval:10]; //3.設置表單提交的方法(默認為get) [request setHTTPMethod: @"post"];
//4.設置要提交的參數 NSString *args=[NSString stringWithFormat:@"uname=%@&upas=%@&btn=login",uname,upas]; [request setHTTPBody: [args dataUsingEncoding:NSUTF8StringEncoding]];
NSData *recvData=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; if(recvData!=nil) {
/*
對伺服器獲取的數據recvData進行相應的處理
*/
}
else
{
NSLog(@"連接失敗,請重試!");
}
2.post方法的非同步與同步的區別在於使用NSURLConnectionDataDelegate委託協議,指定代理.
這一點與get方法一致,所以就不進行長篇幅的演示了。
以上就是關於部分網路同步非同步請求,get、post請求方法的演示,由於UI控制項還有其他的處理沒有附上,具體的讀者可以進行相應細節的調整,進行完整的網路請求項目開發。
由於iOS開始,引入了新的網路介面NSURLSession,而在iOS9中NSURLConnection被宣布棄用,因此關於NSURLSession發送GET和POST請求的資料部分,有興趣的可以參考:
iOS開發 GET、POST請求方法(NSURLSession篇)
by:啊左~
❾ 我的蘋果x網路啟動失敗怎麼解決師傅
蘋果手機顯示網路請求失敗的解決方法:
1、解鎖iphonex手機到主頁面後,選擇並打開【設置】選項;
2、在【設置】中心裡打開【通用】;
3、頁面跳轉至【通用】的設置列表中,選擇【還原】;
4、在【還原】設置的詳細選項列表下,點擊【還原網路設置】,如圖:
5、手動輸入6位數字密碼,對【還原網路設置】進行授權工作,見下圖所示:
6、完成授權後,等待系統進行網路還原完成,長按iphonex機身側面的【電源鍵】進行關機重啟。
7、還原網路設置並重啟iphonex手機後,解鎖至主屏幕頁面,即可使網路狀態恢復至正常,解決iphonex手機顯示網路請求失敗的問題。