SlideShare uma empresa Scribd logo
1 de 9
Baixar para ler offline
OHHTTPSTUBS
Bouchonner vos requêtes réseau facilement!
sans modifier le code de votre application

CocoaHeads Rennes!
20 février 2014

SmallTalk par O.Halligon
OBJECTIF
• Intercepter
• Retourner

les requêtes réseau sortantes!

une réponse toute faite à la place!

•

La requête ne part finalement pas sur le net!

•

On se substitue au serveur pour retourner la réponse qu’on veut
CAS D’USAGE
•

Tests Unitaires
•
•

•

Sans dépendre du réseau ou de la connectivité!
Avec des réponses déterministes et invariantes.

Tests d’asynchronisme en conditions dégradées
•
•

•

Simuler un réseau lent!
Vérifier que votre application ne gèle pas et affiche des spinners

Développement avant la livraison des BackEnds / WS
•

Développez vos modules d’appel aux WebServices

même si ceux-ci ne sont pas encore prêts
EXEMPLES
• Toutes les requêtes retournent un texte constant

[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {

!
!
}
!
!

return YES;
withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) {

}];

NSData* stubData = [@"Hello World!" dataUsingEncoding:NSUTF8StringEncoding];
return [OHHTTPStubsResponse responseWithData:stubData statusCode:200 headers:nil];
EXEMPLES
• Seulement les requêtes vers mywebservice.com!
• Utilisation d’un fichier « .json » (embarqué dans l’application)!
• Headers spécifiques
[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {

!
!
}
!
!

return [request.URL.host isEqualToString:@"mywebservice.com"];
withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) {

}];

return [OHHTTPStubsResponse responseWithFileAtPath:OHPathForFileInBundle(@"wsresponse.json",nil)
statusCode:200 headers:@{@"Content-Type":@"text/json"}];
EXEMPLES
• Seulement les requêtes vers mywebservice.com!
• Utilisation d’un NSDictionary converti automatiquement en JSON!
• Simulation d’un temps de réponse
[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {

!
!
}
!
!

return [request.URL.host isEqualToString:@"mywebservice.com"];
withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) {
NSArray* stringList = [request.URL pathComponents];
NSDictionary* dico = @{@"response": stringList, @"error":@NO};
return [[OHHTTPStubsResponse responseWithJSONObject:dico statusCode:200 headers:nil]
responseTime:OHHTTPStubsDownloadSpeed3G];

}];

Catégorie OHHTTPStubsResponse+JSON.h!
Sérialise le dictionnaire en JSON + rajoute le header «application/json»
EXEMPLES
@implementation MyWebService
+ (NSString*)baseURL { return @"http://myserver.tld/webservice/"; }

!

+ (void)fetchUserWithID:(int)userID completion:(void(^)(id user))completion
{
NSURL* baseURL = [NSURL URLWithString:self.baseURL];
AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL];

}
@end

[sessionManager GET:[NSString stringWithFormat:@"user/%d",userID]
parameters:nil
success:^(NSURLSessionDataTask *task, id responseObject) {
completion(responseObject);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
completion(nil);
}];
EXEMPLES
@implementation MyWebService
+ (NSString*)baseURL { return @"http://myserver.tld/webservice/"; }

!

+ (void)fetchUserWithID:(int)userID completion:(void(^)(id user))completion
{
NSURL* baseURL = [NSURL URLWithString:self.baseURL];
AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL];

{

[sessionManager GET:[NSString stringWithFormat:@"user/%d",userID]
parameters:nil
success:^(NSURLSessionDataTask *task, id responseObject) {
completion(responseObject);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
completion(nil);
}];
(void)testFetchUser
}
@end

NSDictionary *expectedUser = @{@"id":@123,@"firstname":@"John",@"lastname":@"Appleseed"};
[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {
return [request.URL.absoluteString hasPrefix:[MyWebService baseURL]];
} withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) {
return [OHHTTPStubsResponse responseWithJSONObject:expectedUser statusCode:200 headers:nil];
}];
[MyWebService fetchUserWithID:123 completion:^(id user) {
STAssertEqualObjects(user, expectedUser, @"Unexpected data received");
[self notifyAsyncOperationDone];
}];

}

[self waitForAsyncOperationWithTimeout:1.0];
INSTALLATION
• Sur

GITHub : http://github.com/AliSoftware/OHHTTPStubs!

• Disponible

via CocoaPods!

pod "OHHTTPStubs"

• Fonctionne

avec tout framework réseau utilisant l’URL Loading
System standard de Cocoa!
NSURLConnection, NSURLSession, AFNetworking, …!

• Limitations

:!

• Ne

supporte pas les Background Sessions!

• Ne

bouchonne pas l’upload de données

Mais conteúdo relacionado

Mais procurados

Réu technodejs
Réu technodejsRéu technodejs
Réu technodejs
naholyr
 

Mais procurados (20)

Consul @Criteo - usages et patches
Consul @Criteo - usages et patchesConsul @Criteo - usages et patches
Consul @Criteo - usages et patches
 
Gatling Tool in Action at DevoxxFR 2012
Gatling Tool in Action at DevoxxFR 2012Gatling Tool in Action at DevoxxFR 2012
Gatling Tool in Action at DevoxxFR 2012
 
Java (8) eXperiments - DevoxxFR 2016
Java (8) eXperiments - DevoxxFR 2016Java (8) eXperiments - DevoxxFR 2016
Java (8) eXperiments - DevoxxFR 2016
 
Php 7.3 et ses RFC (AFUP Toulouse)
Php 7.3 et ses RFC  (AFUP Toulouse)Php 7.3 et ses RFC  (AFUP Toulouse)
Php 7.3 et ses RFC (AFUP Toulouse)
 
Gatekeeper par Guillaume Faure
Gatekeeper par Guillaume FaureGatekeeper par Guillaume Faure
Gatekeeper par Guillaume Faure
 
Développer sereinement avec Node.js
Développer sereinement avec Node.jsDévelopper sereinement avec Node.js
Développer sereinement avec Node.js
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
Réu technodejs
Réu technodejsRéu technodejs
Réu technodejs
 
Retour d'expérience technique Go, gRPC, Kubernetes
Retour d'expérience technique Go, gRPC, KubernetesRetour d'expérience technique Go, gRPC, Kubernetes
Retour d'expérience technique Go, gRPC, Kubernetes
 
Serveur http
Serveur httpServeur http
Serveur http
 
Programmation réactive avec Spring 5 et Reactor
Programmation réactive avec Spring 5 et ReactorProgrammation réactive avec Spring 5 et Reactor
Programmation réactive avec Spring 5 et Reactor
 
CocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - Epitez
 
[FR] Présentatation d'Ansible
[FR] Présentatation d'Ansible [FR] Présentatation d'Ansible
[FR] Présentatation d'Ansible
 
Apache Flink par Bilal Baltagi Paris Spark Meetup Dec 2015
Apache Flink par Bilal Baltagi Paris Spark Meetup Dec 2015Apache Flink par Bilal Baltagi Paris Spark Meetup Dec 2015
Apache Flink par Bilal Baltagi Paris Spark Meetup Dec 2015
 
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearchParis Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
 
Présentation de Node.js
Présentation de Node.jsPrésentation de Node.js
Présentation de Node.js
 
Explorez vos données avec apache zeppelin
Explorez vos données avec apache zeppelinExplorez vos données avec apache zeppelin
Explorez vos données avec apache zeppelin
 
Programmation concurrente en Java
Programmation concurrente en JavaProgrammation concurrente en Java
Programmation concurrente en Java
 
Meetup kafka 21 Novembre 2017
Meetup kafka 21 Novembre 2017Meetup kafka 21 Novembre 2017
Meetup kafka 21 Novembre 2017
 
Big Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBig Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache Zeppelin
 

Destaque

Destaque (20)

Project Entourage
Project EntourageProject Entourage
Project Entourage
 
BitTorrent on iOS
BitTorrent on iOSBitTorrent on iOS
BitTorrent on iOS
 
Let's migrate to Swift 3.0
Let's migrate to Swift 3.0Let's migrate to Swift 3.0
Let's migrate to Swift 3.0
 
Build a lego app with CocoaPods
Build a lego app with CocoaPodsBuild a lego app with CocoaPods
Build a lego app with CocoaPods
 
CloudKit as a backend
CloudKit as a backendCloudKit as a backend
CloudKit as a backend
 
Présentation de HomeKit
Présentation de HomeKitPrésentation de HomeKit
Présentation de HomeKit
 
What's new in iOS9
What's new in iOS9What's new in iOS9
What's new in iOS9
 
Programme MFI retour d'expérience
Programme MFI retour d'expérienceProgramme MFI retour d'expérience
Programme MFI retour d'expérience
 
SwiftyGPIO
SwiftyGPIOSwiftyGPIO
SwiftyGPIO
 
How to communicate with Smart things?
How to communicate with Smart things?How to communicate with Smart things?
How to communicate with Smart things?
 
IoT Best practices
 IoT Best practices IoT Best practices
IoT Best practices
 
La sécurité sur iOS par Arnaud de Bock
La sécurité sur iOS par Arnaud de BockLa sécurité sur iOS par Arnaud de Bock
La sécurité sur iOS par Arnaud de Bock
 
CocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical RecordCocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical Record
 
CocoaHeads Rennes #13 : CocoaPods
CocoaHeads Rennes #13 : CocoaPodsCocoaHeads Rennes #13 : CocoaPods
CocoaHeads Rennes #13 : CocoaPods
 
CocoaHeads Rennes #14: Programmation Responsive par Celedev
CocoaHeads Rennes #14: Programmation Responsive par CeledevCocoaHeads Rennes #14: Programmation Responsive par Celedev
CocoaHeads Rennes #14: Programmation Responsive par Celedev
 
CocoaHeads Rennes #14: iOS7 Controllers Transitions
 CocoaHeads Rennes #14: iOS7 Controllers Transitions CocoaHeads Rennes #14: iOS7 Controllers Transitions
CocoaHeads Rennes #14: iOS7 Controllers Transitions
 
Gaikan
GaikanGaikan
Gaikan
 
Présentation SoLocal
Présentation SoLocalPrésentation SoLocal
Présentation SoLocal
 
Comment je ne rate plus mon train
Comment je ne rate plus mon trainComment je ne rate plus mon train
Comment je ne rate plus mon train
 
L'intégration continue chez Pages Jaunes - Build Bot Mobile
L'intégration continue chez Pages Jaunes - Build Bot MobileL'intégration continue chez Pages Jaunes - Build Bot Mobile
L'intégration continue chez Pages Jaunes - Build Bot Mobile
 

Semelhante a CocoaHeads Rennes #16: OHHTTPStubs

Semelhante a CocoaHeads Rennes #16: OHHTTPStubs (20)

Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshopMigrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
 
Rails 3 au Djangocong
Rails 3 au DjangocongRails 3 au Djangocong
Rails 3 au Djangocong
 
Cours 2/3 - Architecture Web
Cours 2/3 - Architecture WebCours 2/3 - Architecture Web
Cours 2/3 - Architecture Web
 
Vincent biret azure functions et flow #AosCanadianTour (quebec)
Vincent biret azure functions et flow #AosCanadianTour (quebec)Vincent biret azure functions et flow #AosCanadianTour (quebec)
Vincent biret azure functions et flow #AosCanadianTour (quebec)
 
Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express js
 
spring.pdf
spring.pdfspring.pdf
spring.pdf
 
FIP_pl-sql.pdf
FIP_pl-sql.pdfFIP_pl-sql.pdf
FIP_pl-sql.pdf
 
Service WEB de type REST avec Java
Service WEB de type REST avec JavaService WEB de type REST avec Java
Service WEB de type REST avec Java
 
Collab365 - Office 365 API & PowerShell : Le meilleur des deux mondes!
Collab365 - Office 365 API & PowerShell : Le meilleur des deux mondes!Collab365 - Office 365 API & PowerShell : Le meilleur des deux mondes!
Collab365 - Office 365 API & PowerShell : Le meilleur des deux mondes!
 
Event based asynchronous pattern
Event based asynchronous patternEvent based asynchronous pattern
Event based asynchronous pattern
 
Softshake 2013 Apiness SA l'envers du décor
Softshake 2013 Apiness SA l'envers du décorSoftshake 2013 Apiness SA l'envers du décor
Softshake 2013 Apiness SA l'envers du décor
 
Softshake apiness l'envers du décor
Softshake apiness l'envers du décorSoftshake apiness l'envers du décor
Softshake apiness l'envers du décor
 
Les Servlets et JSP
Les Servlets et JSPLes Servlets et JSP
Les Servlets et JSP
 
Tout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCTout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFC
 
Web dev open door
Web dev   open doorWeb dev   open door
Web dev open door
 
Sql
SqlSql
Sql
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
 
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big DataJournées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
 
Ns python web 1
Ns python web 1Ns python web 1
Ns python web 1
 
Java EE _ Servlet et vue (1).pdf
Java EE _ Servlet et vue (1).pdfJava EE _ Servlet et vue (1).pdf
Java EE _ Servlet et vue (1).pdf
 

Mais de CocoaHeadsRNS

CocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeads Rennes #4 : la rotation sur iOSCocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeadsRNS
 

Mais de CocoaHeadsRNS (14)

CocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock ObjectsCocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock Objects
 
CocoaHeads Rennes #10 : Notifications
CocoaHeads Rennes #10 : NotificationsCocoaHeads Rennes #10 : Notifications
CocoaHeads Rennes #10 : Notifications
 
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expertCocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
 
CocoaHeads Rennes #7 : Intégration continue pour les nuls
CocoaHeads Rennes #7 : Intégration continue pour les nulsCocoaHeads Rennes #7 : Intégration continue pour les nuls
CocoaHeads Rennes #7 : Intégration continue pour les nuls
 
CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeads Rennes #6
CocoaHeads Rennes #6
 
CocoaHeads Rennes #5 : iOS & Android
CocoaHeads Rennes #5 : iOS & AndroidCocoaHeads Rennes #5 : iOS & Android
CocoaHeads Rennes #5 : iOS & Android
 
CocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOSCocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOS
 
CocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeads Rennes #4 : la rotation sur iOSCocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeads Rennes #4 : la rotation sur iOS
 
Cocoaheads Rennes #3 : Bien coder sur iOS
Cocoaheads Rennes #3 : Bien coder sur iOSCocoaheads Rennes #3 : Bien coder sur iOS
Cocoaheads Rennes #3 : Bien coder sur iOS
 
CocoaHeads Rennes #3 : Bien débuter sur iOS
CocoaHeads Rennes #3 : Bien débuter sur iOSCocoaHeads Rennes #3 : Bien débuter sur iOS
CocoaHeads Rennes #3 : Bien débuter sur iOS
 
CocoaHeads Rennes #2 : Xcode 4
CocoaHeads Rennes #2 : Xcode 4CocoaHeads Rennes #2 : Xcode 4
CocoaHeads Rennes #2 : Xcode 4
 
CocoaHeads Rennes #2 : Pratiques de développement itératif
CocoaHeads Rennes #2 : Pratiques de développement itératifCocoaHeads Rennes #2 : Pratiques de développement itératif
CocoaHeads Rennes #2 : Pratiques de développement itératif
 
CocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central DispatchCocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central Dispatch
 
CocoaHeads Rennes #1 : internationalisation
CocoaHeads Rennes #1 : internationalisationCocoaHeads Rennes #1 : internationalisation
CocoaHeads Rennes #1 : internationalisation
 

CocoaHeads Rennes #16: OHHTTPStubs

  • 1. OHHTTPSTUBS Bouchonner vos requêtes réseau facilement! sans modifier le code de votre application CocoaHeads Rennes! 20 février 2014 SmallTalk par O.Halligon
  • 2. OBJECTIF • Intercepter • Retourner les requêtes réseau sortantes! une réponse toute faite à la place! • La requête ne part finalement pas sur le net! • On se substitue au serveur pour retourner la réponse qu’on veut
  • 3. CAS D’USAGE • Tests Unitaires • • • Sans dépendre du réseau ou de la connectivité! Avec des réponses déterministes et invariantes. Tests d’asynchronisme en conditions dégradées • • • Simuler un réseau lent! Vérifier que votre application ne gèle pas et affiche des spinners Développement avant la livraison des BackEnds / WS • Développez vos modules d’appel aux WebServices
 même si ceux-ci ne sont pas encore prêts
  • 4. EXEMPLES • Toutes les requêtes retournent un texte constant [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { ! ! } ! ! return YES; withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) { }]; NSData* stubData = [@"Hello World!" dataUsingEncoding:NSUTF8StringEncoding]; return [OHHTTPStubsResponse responseWithData:stubData statusCode:200 headers:nil];
  • 5. EXEMPLES • Seulement les requêtes vers mywebservice.com! • Utilisation d’un fichier « .json » (embarqué dans l’application)! • Headers spécifiques [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { ! ! } ! ! return [request.URL.host isEqualToString:@"mywebservice.com"]; withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) { }]; return [OHHTTPStubsResponse responseWithFileAtPath:OHPathForFileInBundle(@"wsresponse.json",nil) statusCode:200 headers:@{@"Content-Type":@"text/json"}];
  • 6. EXEMPLES • Seulement les requêtes vers mywebservice.com! • Utilisation d’un NSDictionary converti automatiquement en JSON! • Simulation d’un temps de réponse [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { ! ! } ! ! return [request.URL.host isEqualToString:@"mywebservice.com"]; withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) { NSArray* stringList = [request.URL pathComponents]; NSDictionary* dico = @{@"response": stringList, @"error":@NO}; return [[OHHTTPStubsResponse responseWithJSONObject:dico statusCode:200 headers:nil] responseTime:OHHTTPStubsDownloadSpeed3G]; }]; Catégorie OHHTTPStubsResponse+JSON.h! Sérialise le dictionnaire en JSON + rajoute le header «application/json»
  • 7. EXEMPLES @implementation MyWebService + (NSString*)baseURL { return @"http://myserver.tld/webservice/"; } ! + (void)fetchUserWithID:(int)userID completion:(void(^)(id user))completion { NSURL* baseURL = [NSURL URLWithString:self.baseURL]; AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL]; } @end [sessionManager GET:[NSString stringWithFormat:@"user/%d",userID] parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { completion(responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) { completion(nil); }];
  • 8. EXEMPLES @implementation MyWebService + (NSString*)baseURL { return @"http://myserver.tld/webservice/"; } ! + (void)fetchUserWithID:(int)userID completion:(void(^)(id user))completion { NSURL* baseURL = [NSURL URLWithString:self.baseURL]; AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL]; { [sessionManager GET:[NSString stringWithFormat:@"user/%d",userID] parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { completion(responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) { completion(nil); }]; (void)testFetchUser } @end NSDictionary *expectedUser = @{@"id":@123,@"firstname":@"John",@"lastname":@"Appleseed"}; [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { return [request.URL.absoluteString hasPrefix:[MyWebService baseURL]]; } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { return [OHHTTPStubsResponse responseWithJSONObject:expectedUser statusCode:200 headers:nil]; }]; [MyWebService fetchUserWithID:123 completion:^(id user) { STAssertEqualObjects(user, expectedUser, @"Unexpected data received"); [self notifyAsyncOperationDone]; }]; } [self waitForAsyncOperationWithTimeout:1.0];
  • 9. INSTALLATION • Sur GITHub : http://github.com/AliSoftware/OHHTTPStubs! • Disponible via CocoaPods! pod "OHHTTPStubs" • Fonctionne avec tout framework réseau utilisant l’URL Loading System standard de Cocoa! NSURLConnection, NSURLSession, AFNetworking, …! • Limitations :! • Ne supporte pas les Background Sessions! • Ne bouchonne pas l’upload de données