Solicitud de recursos de aplicaciones iOS
improve this page | report issueVisión general
Las aplicaciones MobileFirst pueden acceder a los recursos utilizando la API REST WLResourceRequest
.
La API REST funciona con todos los adaptadores y recursos externos.
Requisitos previos:
- Asegúrese de que añadió Mobile Foundation SDK a su proyecto iOS nativo.
- Aprenda a crear adaptadores.
WLResourceRequest
La clase WLResourceRequest
maneja solicitudes de recursos para recursos externos o adaptadores.
Cree un objeto WLResourceRequest
y especifique la vía de acceso al recurso y el método HTTP.
Los métodos disponibles son: WLHttpMethodGet
, WLHttpMethodPost
, WLHttpMethodPut
y 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
)
- Para adaptadores JavaScript, utilice
/adapters/{AdapterName}/{procedureName}
- Para adaptadores Java, utilice
/adapters/{AdapterName}/{path}
. Lavía de acceso
depende de la forma en que haya definido sus anotaciones@Path
en su código Java. También debería incluir todos los@PathParam
que utilice. - Para acceder a recursos fuera del proyecto, utilice el URL completo según los requisitos del servidor externo.
- timeout: Opcional, tiempo de espera de la solicitud en milisegundos.
Envío de la solicitud
Solicite el recurso mediante el método sendWithCompletionHandler
.
Proporcione un manejador de finalización para manejar los datos recuperados:
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);
}
}
Otra posibilidad es utilizar sendWithDelegate
y proporcionar un delegado que se adhiera a los dos protocolos NSURLConnectionDataDelegate
y NSURLConnectionDelegate
. Esto permitirá manejar las respuestas con una mayor granularidad, por ejemplo, al manejar respuestas binarias.
Parámetros
Antes de enviar su solicitud, podría desea añadir parámetros según sea necesario.
Parámetros de vía de acceso
Tal como se ha explicado anteriormente, los parámetros de vía de acceso (/path/value1/value2
) se establecen durante la creación del objeto WLResourceRequest
.
Parámetros de consulta
Para enviar parámetros de consulta (/path?param1=value1...
) utilice el método setQueryParameter
para cada parámetro:
Objective-C
[request setQueryParameterValue:@"value1" forName:@"param1"];
[request setQueryParameterValue:@"value2" forName:@"param2"];
Swift
request.setQueryParameterValue("value1", forName: "param1")
request.setQueryParameterValue("value2", forName: "param2")
Adaptadores JavaScript
Los adaptadores JavaScript utilizan parámetros sin nombre ordenados. Para pasar parámetros a un adaptador JavaScript, establezca una matriz de parámetros con el nombre params
:
Objective-C
[request setQueryParameterValue:@"['value1', 'value2']" forName:@"params"];
Swift
request.setQueryParameterValue("['value1', 'value2']", forName: "params")
Este debe utilizarse con WLHttpMethodGet
.
Parámetros de formulario
Para enviar parámetros del formulario en el cuerpo, utilice sendWithFormParameters
en lugar de sendWithCompletionHandler
:
Objective-C
//@FormParam("height")
NSDictionary *formParams = @{@"height":@"175"};
//Sending the request with Form parameters
[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"]
//Sending the request with Form parameters
request.send(withFormParameters: formParams) {(response, error) in
if (error != nil){
print("Failure: " , error!);
}
else if (response != nil){
print("Success: " + response!.responseText);
}
}
Adaptadores JavaScript
Los adaptadores JavaScript utilizan parámetros sin nombre ordenados.
Para pasar parámetros a un adaptador JavaScript, establezca una matriz de parámetros con el nombre params
:
Objective-C
NSDictionary *formParams = @{@"params":@"['value1', 'value2']"};
Swift
let formParams = ["params":"['value1', 'value2']"]
Este debe utilizarse con WLHttpMethodPost
.
Parámetros de cabecera
Para enviar un parámetro como una cabecera HTTP utilice la API setHeaderValue
:
Objective-C
//@HeaderParam("Date")
[request setHeaderValue:@"2015-06-06" forName:@"birthdate"];
Swift
//@HeaderParam("Date")
request.setHeaderValue("2015-06-06", forName: "birthdate")
Otros parámetros de cuerpo personalizados
sendWithBody
permite establecer una serie arbitraria en el cuerpo.sendWithJSON
permite establecer un diccionario arbitrario en el cuerpo.sendWithData
permite establecer unNSData
arbitrario en el cuerpo.
Cola de devolución de llamada para completionHandler y delegado
Con el propósito de evitar el bloqueo de la interfaz de usuario mientras se reciben respuestas, se puede especificar una cola de devoluciones de llamada privadas para ejecutar el bloque completionHandler o un delegado para el conjunto de API sendWithCompletionHandler
y sendWithDelegate
.
Objective-C
//creating callback queue
dispatch_queue_t completionQueue = dispatch_queue_create("com.ibm.mfp.app.callbackQueue", DISPATCH_QUEUE_SERIAL);
//Sending the request with callback queue
[request sendWithCompletionHandler:completionQueue completionHandler:^(WLResponse *response, NSError *error) {
if (error == nil){
NSLog(@"%@", response.responseText);
} else {
NSLog(@"%@", error.description);
}
}];
Swift
//creating callback queue
let completionQueue = DispatchQueue(label: "com.ibm.mfp.app.callbackQueue");
//Sending the request with callback queue
request.send(withQueue: queue){ (response, error) in
if (error != nil){
print("Failure: " , error!);
}
else if (response != nil){
print("Success: " + response!.responseText);
}
}
La respuesta
El objeto response
contiene los datos de respuesta. Utilice todos sus métodos y propiedades para recuperar la información necesaria. Las propiedades utilizadas habitualmente son responseText
(String), responseJSON
(objeto Dictionary) (si la respuesta está en JSON) y status
(Int) (en el estado HTTP de la respuesta).
Utilice los objetos response
y error
para obtener datos recuperados por el adaptador.
Utilización de WLResourceRequest para acceder a microservicios externos
La API WLResourceRequest
se puede utilizar para que las aplicaciones móviles accedan a los microservicios alojados fuera de Mobile Foundation. Mobile Foundation facilita las llamadas seguras al microservicio o el servicio de fondo de la empresa sin requerir adaptadores mediante API Connector de Mobile Foundation. Del mismo modo que un adaptador, API Connector garantiza invocaciones seguras basadas en el mecanismo OAuth 2.0 de Mobile Foundation. Con API Connector, el administrador de Mobile Foundation puede configurar y desplegar los detalles del microservicio o del servicio de fondo de la empresa en Mobile Foundation.
El tiempo de ejecución de Mobile Foundation utiliza la configuración desplegada para invocar de forma segura las solicitudes de microservicio o del servicio de fondo desde la aplicación móvil.
Aprenda a configurar API Connector de Mobile Foundation.
Para acceder a un URL de microservicio, tal como http://mybluemix.net/resorts/cities
, y al servicio de fondo del tiempo de ejecución de Mobile Foundation, la configuración es la siguiente
{
"service": "resorts",
"baseUrl":"http://mybluemix.net/resorts"
}
WLResourceRequest
se puede definir como
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: URL relativo del punto final de microservicio. Por ejemplo:
cities
- method: El método HTTP que se ha de utilizar. Por ejemplo:
WLResourceRequest.GET
- backendServiceName: El nombre del servicio de fondo configurado en el servidor desde el que se capturan los datos. Por ejemplo, resorts.
- timeout: El tiempo de espera en milisegundos para esta solicitud.
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
)
Para obtener más información
Para obtener más información sobre WLResourceRequest, consulte la Referencia de API.
Aplicación de ejemplo
El proyecto ResourceRequestSwift contiene una aplicación iOS, implementada en Swift, que realiza una solicitud se recurso mediante un adaptador de Java.
El proyecto Maven de adaptador contiene el adaptador Java utilizado durante la llamada de solicitud de recurso.
Pulse para descargar el proyecto iOS.
Pulse para descargar el proyecto Maven del adaptador.
Uso de ejemplo
Siga el archivo README.md de ejemplo para obtener instrucciones.
Nota sobre iOS 9:
▲Xcode 7 habilita ATS (Application Transport Security) de forma predeterminada. Para completar la guía de aprendizaje inhabilite ATS (pulse aquí para obtener más información).
- En Xcode, pulse con el botón derecho del ratón sobre archivo [proyecto]/info.plist → Abrir como → Código fuente
- Pegue lo siguiente:
<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.