Solicitud de recursos de aplicaciones iOS

improve this page | report issue

Visió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:

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}. La ví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 un NSData 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.

Imagen de la aplicación de ejemplo

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).

  1. En Xcode, pulse con el botón derecho del ratón sobre archivo [proyecto]/info.plist → Abrir como → Código fuente
  2. 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.
Last modified on June 29, 2020