Enviar solicitudes REST de Outlook por lotes (versión 2.0)

Se aplica a: Exchange Online | Office 365 | Hotmail.com | Live.com | MSN.com | Outlook.com | Passport.com

El procesamiento por lotes le permite colocar varias solicitudes REST de Outlook en una única solicitud por lote HTTP, lo que reduce el número de conexiones HTTP y la sobrecarga. Las solicitudes en un lote acceden a los datos del usuario que ha iniciado sesión, protegidos por Azure Active Directory en Office 365 o en una cuenta Microsoft (Hotmail.com, Live.com, MSN.com, Outlook.com o Passport.com).

Nota

Para simplificar la referencia, en el resto de este artículo se utiliza Outlook.com para englobar a estos dominios de cuentas Microsoft.

¿No está interesado en la versión 2.0 de la API? En el índice de la izquierda, vaya a la sección Referencia de la API de REST de Office 365 y seleccione la versión que desee.

Información general

Una solicitud REST requiere una conexión HTTP entre el cliente y el servidor, lo que implica una cierta sobrecarga. El procesamiento por lotes le permite reducir la sobrecarga de la conexión al combinar varias llamadas API REST para el mismo contexto en una sola solicitud HTTP POST al extremo $batch.

Por ejemplo, puede combinar llamadas API para el contexto me de la forma siguiente:

POST https://outlook.office.com/api/v2.0/me/$batch

Una solicitud por lote puede incluir hasta 20 llamadas API REST individuales, que pueden ser operaciones de consulta de datos (por ejemplo, GET) o de cambio (por ejemplo, POST). Puede especificar un encabezamiento Prefer para que el lote continúe incluso cuando una o más llamadas REST fallen.

El procesamiento por lotes es especialmente útil para sincronizar grandes cantidades de datos. Las llamadas API en el mismo lote pueden acceder a distintos recursos, como mensajes y eventos, que pertenecen al mismo buzón.

Si necesita hacer más de 20 llamadas, o si el orden de realización de las llamadas es importante, utilice varias solicitudes por lote.

Ejemplo

Un simple ejemplo ilustra mejor el procesamiento por lotes. La siguiente solicitud por lote pone 2 llamadas a API de REST de Outlook en un solo lote para el contexto me:

  1. GET de todos los eventos del usuario que ha iniciado sesión.
  2. POST y enviar un mensaje.

Solicitud de lote

POST https://outlook.office.com/api/v2.0/me/$batch HTTP/1.1

Authorization: Bearer aGFwcHlnQGRr==
Host: outlook.office.com
Content-Type: multipart/mixed; boundary=batch_myBatchId


--batch_myBatchId
Content-Type: application/http
Content-Transfer-Encoding: binary

GET /api/v2.0/me/events?$select=subject,organizer HTTP/1.1

--batch_myBatchId
Content-Type: application/http
Content-Transfer-Encoding: binary

POST /api/v2.0/me/sendmail HTTP/1.1
Content-Type: application/json

{
  "Message": {
    "Subject": "Meet for lunch?",
    "Body": {
      "ContentType": "Text",
      "Content": "The new cafeteria is open."
    },
    "ToRecipients": [
      {
        "EmailAddress": {
          "Address": "rufus@contoso.com"
        }
      }
    ]
  }
}
 
--batch_myBatchId--

Nota

En el ejemplo anterior que tiene una operación POST al final del lote, actualmente se requiere una nueva línea después del último delimitador de lote --batch_{batchId}--. Consulte más notas sobre formato para cuerpos de solicitud por lote.

Respuesta por lote

La respuesta por lote incluye códigos y cuerpos de respuesta separados, cuando corresponda, para la solicitud por lote y las llamadas individuales.

HTTP/1.1 200 OK
Content-Type: multipart/mixed; boundary=batchresponse_caad32b6-3fa6-4346-94d0-ee98e067318a
Content-Length: 786

--batchresponse_caad32b6-3fa6-4346-94d0-ee98e067318a
Content-Type: application/http
Content-Transfer-Encoding: binary

HTTP/1.1 200 OK
OData-Version: 4.0
Content-Type: application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8

{
    "@odata.context":"https://outlook.office.com/api/v2.0/$metadata#Me/Events(Subject,Organizer)",
    "value":[
        {
            "@odata.id":"https://outlook.office.com/api/v2.0/Users('cd209b0b-3f83-4c35-82d2-d88a61820480@8b5d41d8-b1af-495e-b871-8bbd867ba67a')/Events('AAMkAGI1AAAt9AHkAAA=')",
            "@odata.etag":"W/\"ZlnW4RIAV06KYYwlrfNZvQAALfZeSA==\"",
            "Id":"AAMkAGI1AAAt9AHkAAA=",
            "Subject":"Let's go for lunch",
            "Organizer":{
                "EmailAddress":{
                    "Name":"Dana Swope",
                    "Address":"danas@contoso.onmicrosoft.com"
                }
            }
        },
        {
            "@odata.id":"https://outlook.office.com/api/v2.0/Users('cd209b0b-3f83-4c35-82d2-d88a61820480@8b5d41d8-b1af-495e-b871-8bbd867ba67a')/Events('AAMkAGI1AAAtCq6LAAA=')",
            "@odata.etag":"W/\"ZlnW4RIAV06KYYwlrfNZvQAALQzodA==\"",
            "Id":"AAMkAGI1AAAtCq6LAAA=",
            "Subject":"Prep for customer visit",
            "Organizer":{
                "EmailAddress":{
                    "Name":"Dana Swope",
                    "Address":"danas@contoso.onmicrosoft.com"
                }
            }
        }
    ]
}
--batchresponse_caad32b6-3fa6-4346-94d0-ee98e067318a
Content-Type: application/http
Content-Transfer-Encoding: binary

HTTP/1.1 202 Accepted

--batchresponse_caad32b6-3fa6-4346-94d0-ee98e067318a--

URL de punto de conexión

Puede hacer POST en el extremo $batch para uno de estos 2 contextos:

  • Para un usuario que ha iniciado sesión me:

    POST https://outlook.office.com/api/v2.0/me/$batch HTTP/1.1
    
  • Para un usuario específico, donde user_id puede ser un Id. de usuario o una dirección de correo electrónico de usuario:

    POST https://outlook.office.com/api/v2.0/users('{user_id}')/$batch
    

Una vez que haya establecido el contexto en la solicitud POST al extremo $batch, todas las llamadas API REST incluidas en la misma solicitud por lote se deben aplicar al mismo contexto.

Importante

  • Si su solicitud por lote es para un usuario específico, asegúrese de hacer referencia al usuario de manera coherente en todo el conjunto de solicitudes por lote. Es decir, utilice solo .../users('{user_id}') o .../users/'{user_id}', pero no ambos.
  • Cuando se utiliza la URL raíz https://outlook.office.com, para un rendimiento óptimo, agregue un encabezado x-AnchorMailbox y establézcalo en la dirección de correo electrónico del usuario.
  • Además, contemple el caso en que el buzón de un usuario de Outlook.com aún no esté habilitado para la API de REST de Outlook. Verifique si están presentes los códigos de error MailboxNotEnabledForRESTAPI y MailboxNotSupportedForRESTAPI. Vea más información aquí.

Nota

Notas para desarrolladores en China

Versión de la API

El estado de esta API se ha promocionado de versión preliminar a disponibilidad general. Es compatible con las versiones 2.0 y beta de la API REST de Outlook.

Debe especificar el mismo host y la misma versión en la solicitud por lote que en las llamadas REST en el lote.

Usuario objetivo

Puede agrupar llamadas API REST de Outlook para el mismo buzón en un lote. El buzón puede estar en Office 365 o Outlook.com. Intentar acceder a más de un buzón en un conjunto de solicitudes por lote genera una excepción.

Autenticación

De la misma forma que con el envío de llamadas API REST de Outlook como solicitudes individuales, debe incluir un token de acceso válido en un encabezado Authorization de solicitud. Si especifica este encabezado para la solicitud por lote, el token de acceso debería proporcionar el permiso necesario para todas las llamadas en ese lote. Opcionalmente, puede especificar un token de acceso para una llamada específica en el lote si esa llamada requiere un token de acceso distinto.

Obtener un token de acceso requiere que haya registrado e identificado su aplicación y obtenido la autorización correspondiente. Obtenga más información sobre algunas opciones de registro y autorización optimizadas para usted. Tenga esto en cuenta a medida que obtenga más información sobre las solicitudes de procesamiento por lotes.

Encabezados de solicitud por lote

Incluya los siguientes encabezados para cada solicitud por lote:

Host: outlook.office.com
Content-Type: multipart/mixed; boundary=batch_<batchId> 

donde {batchId} identifica un lote y se utiliza para delimitar las solicitudes del lote. Puede ser un GUID o cualquier cadena distintiva.

Puede incluir otros encabezados cuando corresponda. A excepción de los encabezados relacionados con el contenido, como Content-Type, los encabezados en la solicitud por lote generalmente se aplican a todas las operaciones en el lote. Si especifica un encabezado tanto en la solicitud por lote como en una operación específica en el lote, este último tiene prioridad y se aplica a esa operación.

Cuerpo de la solicitud por lote

Comience cada operación de un lote con las siguientes líneas de encabezado:

--batch_{batchId} 
Content-Type: application/http 
Content-Transfer-Encoding: binary 

Termine la última operación del lote de la forma siguiente:

--batch_{batchId}--
 

Formato de un cuerpo de solicitud por lote

Tenga en cuenta los siguientes requisitos de formato; de lo contrario, su solicitud por lote puede fallar o es posible que no devuelva las respuestas que espera:

  • Asegúrese de tener una nueva línea adicional antes de un delimitador de límites de lote, tal como se muestra en el siguiente cuerpo de solicitud que tiene 2 operaciones GET por lotes.
  • En concreto, si tiene una solicitud POST al final de un lote similar a la primera solicitud por lote de ejemplo, asegúrese de que haya una nueva línea después del último delimitador de lote --batch_{batchId}--.

Puede ver más ejemplos de cuerpos de solicitud por lote en Procesamiento por lotes (versión 3.0 de OData).


--batch_{batchId} 
Content-Type: application/http 
Content-Transfer-Encoding: binary 

GET  /api/v2.0/me/messages    HTTP/1.1

--batch_{batchId} 
Content-Type: application/http 
Content-Transfer-Encoding: binary 

GET  /api/v2.0/me/events    HTTP/1.1

--batch_{batchId}--
 

Operaciones en un lote

Puede especificar hasta 20 operaciones en una solicitud por lote.

Una operación en un lote puede ser una consulta de datos, una modificación, una acción o una solicitud de invocación de función. Si bien no es necesario que repita las URL completas y establezca todos los encabezados para cada operación en el lote, asegúrese de incluir encabezados y cuerpo de solicitud específicos si son necesarios para una operación.

Formatos admitidos de solicitudes en un lote

Como se ha mencionado anteriormente, el host, la versión y el contexto deben ser coherentes en todo un conjunto de solicitudes por lote. Las solicitudes incluidas en el mismo lote pueden ser una combinación de cualquiera de los siguientes 3 formatos. Para los ejemplos siguientes, suponga que la solicitud POST al extremo $batch tiene este aspecto:

POST https://outlook.office.com/api/v2.0/me/$batch HTTP/1.1

URL absoluta

Incluya el host, la versión y el contexto en la URL. Por ejemplo:

GET https://outlook.office.com/api/v2.0/me/messages?$select=subject,sender HTTP/1.1 

URL relativa al host

Incluya una URL relativa al host especificado en la solicitud por lote. Si bien no repite el host en cada solicitud por lote, sí incluye la versión y el contexto. Por ejemplo:

GET /api/v2.0/me/messages?$select=subject,sender HTTP/1.1

Por ejemplo:

En este formato, no repite el host, la versión y el contexto en la solicitud por lote. Por ejemplo:

GET messages?$select=subject,sender HTTP/1.1

Por ejemplo:

Una solicitud por lote se procesa por sí sola como una solicitud y devuelve su propio código de respuesta. Una solicitud por lote bien formada con encabezados correctos devuelve HTTP 200 - Correcto. Sin embargo, esto no significa que todas las solicitudes en el lote hayan tenido éxito.

Cada solicitud en el cuerpo de solicitud por lote se procesa a su vez por separado y devuelve su propio código de respuesta, así como cualquier cuerpo de respuesta y mensaje de error.

El servidor puede realizar operaciones de un lote en cualquier orden. Si se deben realizar operaciones en un orden específico, no debe ponerlas en la misma solicitud por lote. En su lugar, envíe una operación individual, y espere la respuesta antes de enviar la siguiente.

De forma predeterminada, el procesamiento se detiene en la primera operación que devuelve un error. Puede especificar el siguiente encabezado para que el procesamiento ignore el error y continúe con la siguiente operación en el lote:

Prefer: odata.continue-on-error

Pasos siguientes

Tanto si está listo para empezar a compilar una aplicación como si simplemente desea obtener más información, tenemos todo lo que necesita.

O bien, obtenga más información sobre el uso de la plataforma de Office 365: