Ressourcenanforderung von iOS-Anwendungen
improve this page | report issueÜbersicht
Mit der MobileFirst erstellte Anwendungen können mit der REST-API WLResourceRequest
auf Ressourcen zugreifen.
Die REST-API funktioniert mit allen Adaptern und externen Ressourcen.
Voraussetzungen:
- Stellen Sie sicher, dass das SDK der Mobile Foundation zu Ihrem nativen iOS-Projekt hinzugefügt wurde.
- Informieren Sie sich über das Erstellen von Adaptern.
WLResourceRequest
Die Klasse WLResourceRequest
handhabt an Adapter oder externe Ressourcen gerichtete Ressourcenanforderungen.
Erstellen Sie ein WLResourceRequest
-Objekt und geben Sie den Pfad zu der Ressource und die HTTP-Methode an.
Verfügbare Methoden sind WLHttpMethodGet
, WLHttpMethodPost
, WLHttpMethodPut
und WLHttpMethodDelete
.
Objective-C
WLResourceRequest *request = [WLResourceRequest requestWithURL:[NSURL URLWithString:@"/adapters/JavaAdapter/users/"] method:WLHttpMethodGet];
Swift
let request = WLResourceRequestSwift(
URL: URL(string: "/adapters/JavaAdapter/users"),
method: WLResourceRequestSwift.WLHttpMethodGet
)
- Verwenden Sie für JavaScript-Adapter
/adapters/{AdapterName}/{procedureName}
. - Verwenden Sie für Java-Adapter
/adapters/{AdapterName}/{path}
. Die Angabe fürpath
hängt davon ab, wie Sie Ihre@Path
-Annotationen im Java-Code definiert haben. Eingeschlossen sind auch alle verwendeten@PathParam
-Annotationen. - Wenn Sie auf Ressourcen außerhalb des Projekts zugreifen möchten, verwenden Sie die vollständige URL nach Maßgabe des externen Servers.
- timeout: Anforderungszeitlimit in Millisekunden (optional)
Anforderung senden
Fordern Sie die Ressource mit der Methode sendWithCompletionHandler
an.
Geben Sie einen Completion-Handler für die abgerufenen Daten an:
Objective-C
[request sendWithCompletionHandler:^(WLResponse *response, NSError *error) {
if (error == nil){
NSLog(@"%@", response.responseText);
} else {
NSLog(@"%@", error.description);
}
}];
Swift
request.send() {(response, error) in
if (error != nil){
print("Failure: " , error!);
}
else if (response != nil){
print("Success: " + response!.responseText);
}
}
Alternativ können Sie sendWithDelegate
verwenden und einen mit den Protokollen NSURLConnectionDataDelegate
und NSURLConnectionDelegate
konformen Delegaten angeben. So können Sie die Antwort differenzierter bearbeiten, wie es beispielsweise bei binären Antworten der Fall ist.
Parameter
Bevor Sie Ihre Anforderung senden, können Sie nach Bedarf Parameter hinzufügen.
Pfadparameter
Pfadparameter (/path/value1/value2
) werden - wie bereits erläutert - während der Erstellung des WLResourceRequest
-Objekts festgelegt.
Abfrageparameter
Wenn Sie Abfrageparameter (/path?param1=value1...
) senden möchten, verwenden Sie für die einzelnen Parameter die Methode setQueryParameter
:
Objective-C
[request setQueryParameterValue:@"value1" forName:@"param1"];
[request setQueryParameterValue:@"value2" forName:@"param2"];
Swift
request.setQueryParameterValue("value1", forName: "param1")
request.setQueryParameterValue("value2", forName: "param2")
JavaScript-Adapter
JavaScript-Adapter verwenden sortierte unbenannte Parameter. Wenn Sie Parameter an einen JavaScript-Adapter übergeben möchten, definieren Sie ein Parameter-Array mit dem Namen params
:
Objective-C
[request setQueryParameterValue:@"['value1', 'value2']" forName:@"params"];
Swift
request.setQueryParameterValue("['value1', 'value2']", forName: "params")
Dieses Array sollte mit WLHttpMethodGet
verwendet werden.
Formularparameter
Wenn Sie im Hauptteil Formularparameter senden möchten, verwenden Sie sendWithFormParameters
anstelle von sendWithCompletionHandler
:
Objective-C
//@FormParam("height")
NSDictionary *formParams = @{@"height":@"175"};
// Anforderung mit Formularparametern senden
[request sendWithFormParameters:formParams completionHandler:^(WLResponse *response, NSError *error) {
if (error == nil){
NSLog(@"%@", response.responseText);
} else {
NSLog(@"%@", error.description);
}
}];
Swift
//@FormParam("height")
let formParams = ["height":"175"]
// Anforderung mit Formularparametern senden
request.send(withFormParameters: formParams) {(response, error) in
if (error != nil){
print("Failure: " , error!);
}
else if (response != nil){
print("Success: " + response!.responseText);
}
}
JavaScript-Adapter
JavaScript-Adapter verwenden sortierte unbenannte Parameter. Wenn Sie Parameter an einen JavaScript-Adapter übergeben möchten, definieren Sie ein Parameter-Array mit dem Namen params
:
Objective-C
NSDictionary *formParams = @{@"params":@"['value1', 'value2']"};
Swift
let formParams = ["params":"['value1', 'value2']"]
Dieses Array sollte mit WLHttpMethodPost
verwendet werden.
Headerparameter
Wenn Sie einen Parameter als HTTP-Header senden möchten, verwenden Sie die API setHeaderValue
:
Objective-C
//@HeaderParam("Date")
[request setHeaderValue:@"2015-06-06" forName:@"birthdate"];
Swift
//@HeaderParam("Date")
request.setHeaderValue("2015-06-06", forName: "birthdate")
Weitere angepasste Hauptteilparameter
- Mit
sendWithBody
können Sie im Hauptteil eine beliebige Zeichenfolge festlegen. - Mit
sendWithJSON
können Sie im Hauptteil ein beliebiges Verzeichnis festlegen. - Mit
sendWithData
können Sie im Hauptteil beliebigeNSData
festlegen.
Callback-Warteschlange für Completion-Handler und Delegaten
Wenn Sie verhindern möchten, dass die Benutzerschnittstelle während des Empfangs von Antworten blockiert wird,
können Sie eine private Callback-Warteschlange für den Completion-Handler-Block der sendWithCompletionHandler
- und sendWithDelegate
-APIs angeben.
Objective-C
// Callback-Warteschlange erstellen
dispatch_queue_t completionQueue = dispatch_queue_create("com.ibm.mfp.app.callbackQueue", DISPATCH_QUEUE_SERIAL);
// Anforderung mit Callback-Warteschlange senden
[request sendWithCompletionHandler:completionQueue completionHandler:^(WLResponse *response, NSError *error) {
if (error == nil){
NSLog(@"%@", response.responseText);
} else {
NSLog(@"%@", error.description);
}
}];
Swift
// Callback-Warteschlange erstellen
let completionQueue = DispatchQueue(label: "com.ibm.mfp.app.callbackQueue");
// Anforderung mit Callback-Warteschlange senden
request.send(withQueue: queue){ (response, error) in
if (error != nil){
print("Failure: " , error!);
}
else if (response != nil){
print("Success: " + response!.responseText);
}
}
Antwort
Das Objekt response
enthält die Antwortdaten. Über die Methoden und Eigenschaften dieses Objekts können Sie die erforderlichen Informationen abrufen. Gängige Eigenschaften sind
responseText
(String), responseJSON
(JSON Object) (wenn die Antwort im JSON-Format vorliegt)
und status
(Int) (HTTP-Status der Antwort).
Verwenden Sie die Objekte response
und error
, um die vom Adapter abgerufenen Daten zu erhalten.
Zugriff auf Mikroservices mit WLResourceRequest
Die API WLResourceRequest
kann verwendet werden, wenn mobile Apps Zugriff auf Mikroservices haben sollen, die außerhalb der Mobile Foundation bereitgestellt werden. Die Mobile Foundation erleichtert mithilfe des Mobile Foundation API Connector geschützte Aufrufe von Mikroservices oder Back-End-Unternehmensservices ohne den Einsatz von Adaptern. Wie ein Adapter ermöglicht der API Connector mit dem OAuth-2.0-Mechanismus der Mobile Foundation geschützte Aufrufe. Mit dem API Connector kann ein Mobile-Foundation-Administrator Einzelheiten von Mikroservices oder Back-End-Unternehmensservices in der Mobile Foundation konfigurieren und implementieren. Die implementierte Konfiguration wird in der Mobile-Foundation-Laufzeit verwendet, um von der mobilen App geschützt Mikroservices oder Back-End-Services anzufordern.
Informieren Sie sich über die Konfiguration des Mobile Foundation API Connector.
Der Zugriff auf eine Mikroservice-URL wie http://mybluemix.net/resorts/cities
und auf den Back-End-Service der Mobile-Foundation-Laufzeit wird wie folgt konfiguriert:
{
"service": "resorts",
"baseUrl":"http://mybluemix.net/resorts"
}
WLResourceRequest
kann wie folgt definiert werden:
Objective-C
WLResourceRequest *request = [WLResourceRequest requestWithURL:[NSURL URLWithString@"url"] method:WLHttpMethodGet backendServiceName timeout];
Swift
let request = WLResourceRequestSwift(
url: URL(),
method: WLResourceRequestSwift.WLHttpMethodGet,
backendServiceName: ,
timeout
)
- url: Relative URL des Mikroserviceendpunkts, z. B.
cities
- method: Zu verwendende HTTP-Methode, z. B.
WLResourceRequest.GET
- backendServiceName: Name des auf dem Server konfigurierten Back-End-Service, von dem Daten abgerufen werden sollen, z. B. resorts
- timeout: Zeitlimit in Millisekunden für diese Anforderung
Objective-C
WLResourceRequest* request = [WLResourceRequest requestWithURL:@"cities" method:WLHttpMethodGet backendServiceName:@"resorts" timeout:3000]
Swift
let request = WLResourceRequestSwift(
url: URL(string: "/cities"),
method: WLResourceRequestSwift.WLHttpMethodGet,
backendServiceName: "resorts" ,
timeout: 3000
)
Weitere Informationen
Weitere Hinweise zu WLResourceRequest finden Sie in den API-Referenzinformationen.
Beispielanwendung
Das Projekt ResourceRequestSwift enthält eine in Swift implementierte iOS-Anwendung, die mit einem Java-Adapter eine Ressourcenanforderung absetzt.
Das Adapter-Maven-Projekt enthält den beim Aufrufen der Ressourcenanforderung verwendeten Java-Adapter.
Klicken Sie hier, um das iOS-Projekt herunterzuladen.
Klicken Sie hier, um das Adapter-Maven-Projekt herunterzuladen.
Verwendung des Beispiels
Anweisungen finden Sie in der Datei README.md zum Beispiel.
Hinweis zu iOS 9:
Xcode 7 aktiviert standardmäßig Application Transport Security (ATS). Für das Lernprogramm müssen Sie ATS inaktivieren. (Lesen Sie hier mehr.)
▲
- Klicken Sie in Xcode mit der rechten Maustaste auf [Projekt]/info.plist → Open As → Source Code.
- Fügen Sie Folgendes ein:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
Inclusive terminology note: The Mobile First Platform team is making changes to support the IBM® initiative to replace racially biased and other discriminatory language in our code and content with more inclusive language. While IBM values the use of inclusive language, terms that are outside of IBM's direct influence are sometimes required for the sake of maintaining user understanding. As other industry leaders join IBM in embracing the use of inclusive language, IBM will continue to update the documentation to reflect those changes.