Crear aplicaciones Java con Microsoft Graph
Este tutorial le enseña a crear una aplicación de consola Java que use la API de Microsoft Graph para recuperar la información de calendario de un usuario.
Sugerencia
Si prefiere descargar solo el tutorial completo, puede descargar o clonar el repositorio de GitHub.
Requisitos previos
Antes de iniciar este tutorial, debe tener instalado el Kit de desarrollo de Java se (JDK) y Gradle en el equipo de desarrollo. Si no tiene el JDK o Gradle, visite los vínculos anteriores para las opciones de descarga.
También debe tener una cuenta de Microsoft personal con un buzón de correo en Outlook.com o una cuenta profesional o educativa de Microsoft. Si no tiene una cuenta de Microsoft, hay un par de opciones para obtener una cuenta gratuita:
- Puede registrarse para obtener una nueva cuenta Microsoft personal.
- Puede registrarse para el programa de desarrolladores de office 365 para obtener una suscripción gratuita a Office 365.
Nota
Este tutorial se ha escrito con OpenJDK versión 14.0.0.36 y Gradle 6.7.1. Los pasos de esta guía pueden funcionar con otras versiones, pero no se han probado.
Comentarios
Envíe sus comentarios sobre este tutorial en el repositorio de github.
Crear una aplicación de consola de Java
En esta sección, crearás una aplicación básica Java consola.
Abra la interfaz de línea de comandos (CLI) en un directorio donde desee crear el proyecto. Ejecute el siguiente comando para crear un nuevo proyecto gradle.
gradle init --dsl groovy --test-framework junit --type java-application --project-name graphtutorial --package graphtutorialUna vez creado el proyecto, compruebe que funciona ejecutando el siguiente comando para ejecutar la aplicación en la CLI.
./gradlew --console plain runSi funciona, la aplicación debe generar
Hello World..
Instalar dependencias
Antes de seguir adelante, agrega algunas dependencias adicionales que usarás más adelante.
- Biblioteca de cliente de Azure Identity Java para autenticar al usuario y adquirir tokens de acceso.
- Sdk de Microsoft Graph para Java realizar llamadas a Microsoft Graph.
Abra ./build.gradle. Actualice la
dependenciessección para agregar esas dependencias.dependencies { // This dependency is used by the application. implementation 'com.google.guava:guava:28.2-jre' // Use JUnit test framework testImplementation 'junit:junit:4.12' implementation 'com.azure:azure-identity:1.2.5' implementation 'com.microsoft.graph:microsoft-graph:3.2.0' }Agregue lo siguiente al final de ./build.gradle.
run { standardInput = System.in }
La próxima vez que cree el proyecto, Gradle descargará esas dependencias.
Diseñar la aplicación
Abra el archivo ./src/main/java/graphtutorial/App.java y reemplace su contenido por lo siguiente.
package graphtutorial; import java.util.InputMismatchException; import java.util.Scanner; /** * Graph Tutorial * */ public class App { public static void main(String[] args) { System.out.println("Java Graph Tutorial"); System.out.println(); Scanner input = new Scanner(System.in); int choice = -1; while (choice != 0) { System.out.println("Please choose one of the following options:"); System.out.println("0. Exit"); System.out.println("1. Display access token"); System.out.println("2. View this week's calendar"); System.out.println("3. Add an event"); try { choice = input.nextInt(); } catch (InputMismatchException ex) { // Skip over non-integer input } input.nextLine(); // Process user choice switch(choice) { case 0: // Exit the program System.out.println("Goodbye..."); break; case 1: // Display access token break; case 2: // List the calendar break; case 3: // Create a new event break; default: System.out.println("Invalid choice"); } } input.close(); } }Esto implementa un menú básico y lee la elección del usuario desde la línea de comandos.
Registrar la aplicación en el portal
En este ejercicio, creará una nueva aplicación de Azure AD con el centro de administración de Azure Active Directory.
Abra un explorador y vaya al centro de administración de Azure Active Directory e inicie sesión con una cuenta personal (también conocida como: cuenta Microsoft) o una cuenta profesional o educativa.
Seleccione Azure Active Directory en el panel de navegación de la izquierda y, después, seleccione registros de aplicaciones en administrar.

Seleccione Nuevo registro. En la página Registrar una aplicación, establezca los valores siguientes.
- Establezca Nombre como
Java Graph Tutorial. - Establezca Tipos de cuenta admitidos en Cuentas en cualquier directorio de organización y cuentas personales de Microsoft.
- En URI de redireccionamiento, cambie la lista desplegable a cliente público (móvil & escritorio) y establezca
https://login.microsoftonline.com/common/oauth2/nativeclientel valor en.

- Establezca Nombre como
Elija Registrar. En la página tutorial de Java Graph , copie el valor del identificador de la aplicación (cliente) y guárdelo, lo necesitará en el paso siguiente.

Seleccione Autenticación en Administrar. Busque la sección Configuración avanzada y cambie el valor de la opción tratar la aplicación como un cliente público a síy, a continuación, elija Guardar.

Agregar autenticación de Azure AD
En este ejercicio, extenderá la aplicación desde el ejercicio anterior para admitir la autenticación con Azure AD. Esto es necesario para obtener el token de acceso OAuth necesario para llamar a Microsoft Graph. En este paso, integrará la Biblioteca de autenticación de Microsoft (MSAL) para Java en la aplicación.
Cree un nuevo directorio denominado graphtutorial en el directorio ./src/main/resources.
Cree un nuevo archivo en el directorio ./src/main/resources/graphtutorial denominado oAuth.properties y agregue el siguiente texto en ese archivo. Reemplace
YOUR_APP_ID_HEREpor el identificador de aplicación que creó en Azure Portal.app.id=YOUR_APP_ID_HERE app.scopes=User.Read,MailboxSettings.Read,Calendars.ReadWriteEl valor de
app.scopescontiene los ámbitos de permisos que requiere la aplicación.- User.Read permite que la aplicación acceda al perfil del usuario.
- MailboxSettings.Read permite que la aplicación obtenga acceso a la configuración desde el buzón del usuario, incluida la zona horaria configurada por el usuario.
- Calendars.ReadWrite permite a la aplicación enumerar el calendario del usuario y agregar nuevos eventos al calendario.
Importante
Si usas el control de código fuente como git, ahora sería un buen momento para excluir el archivo oAuth.properties del control de código fuente para evitar la pérdida involuntaria del identificador de la aplicación.
Abra App.java y agregue las
importsiguientes instrucciones.import java.io.IOException; import java.util.Properties;Agregue el siguiente código justo antes de la
Scanner input = new Scanner(System.in);línea para cargar el archivo oAuth.properties.// Load OAuth settings final Properties oAuthProperties = new Properties(); try { oAuthProperties.load(App.class.getResourceAsStream("oAuth.properties")); } catch (IOException e) { System.out.println("Unable to read OAuth configuration. Make sure you have a properly formatted oAuth.properties file. See README for details."); return; } final String appId = oAuthProperties.getProperty("app.id"); final List<String> appScopes = Arrays .asList(oAuthProperties.getProperty("app.scopes").split(","));
Implementar el inicio de sesión
Cree un nuevo archivo en el directorio ./graphtutorial/src/main/java/graphtutorial denominado Graph.java y agregue el código siguiente.
package graphtutorial; import java.net.URL; import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.LinkedList; import java.util.List; import java.util.Set; import okhttp3.Request; import com.azure.identity.DeviceCodeCredential; import com.azure.identity.DeviceCodeCredentialBuilder; import com.microsoft.graph.authentication.TokenCredentialAuthProvider; import com.microsoft.graph.logger.DefaultLogger; import com.microsoft.graph.logger.LoggerLevel; import com.microsoft.graph.models.Attendee; import com.microsoft.graph.models.DateTimeTimeZone; import com.microsoft.graph.models.EmailAddress; import com.microsoft.graph.models.Event; import com.microsoft.graph.models.ItemBody; import com.microsoft.graph.models.User; import com.microsoft.graph.models.AttendeeType; import com.microsoft.graph.models.BodyType; import com.microsoft.graph.options.HeaderOption; import com.microsoft.graph.options.Option; import com.microsoft.graph.options.QueryOption; import com.microsoft.graph.requests.GraphServiceClient; import com.microsoft.graph.requests.EventCollectionPage; import com.microsoft.graph.requests.EventCollectionRequestBuilder; public class Graph { private static GraphServiceClient<Request> graphClient = null; private static TokenCredentialAuthProvider authProvider = null; public static void initializeGraphAuth(String applicationId, List<String> scopes) { // Create the auth provider final DeviceCodeCredential credential = new DeviceCodeCredentialBuilder() .clientId(applicationId) .challengeConsumer(challenge -> System.out.println(challenge.getMessage())) .build(); authProvider = new TokenCredentialAuthProvider(scopes, credential); // Create default logger to only log errors DefaultLogger logger = new DefaultLogger(); logger.setLoggingLevel(LoggerLevel.ERROR); // Build a Graph client graphClient = GraphServiceClient.builder() .authenticationProvider(authProvider) .logger(logger) .buildClient(); } public static String getUserAccessToken() { try { URL meUrl = new URL("https://graph.microsoft.com/v1.0/me"); return authProvider.getAuthorizationTokenAsync(meUrl).get(); } catch(Exception ex) { return null; } } }En App.java, agregue el siguiente código justo antes de la
Scanner input = new Scanner(System.in);línea para obtener un token de acceso.// Initialize Graph with auth settings Graph.initializeGraphAuth(appId, appScopes); final String accessToken = Graph.getUserAccessToken();Agregue la siguiente línea después del
// Display access tokencomentario.System.out.println("Access token: " + accessToken);Ejecute la aplicación. La aplicación muestra una dirección URL y un código de dispositivo.
Java Graph Tutorial To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code F7CG945YZ to authenticate.Abra un explorador y vaya a la dirección URL mostrada. Escriba el código proporcionado e inicie sesión. Una vez completado, vuelva a la aplicación y elija el 1. Muestra la opción de token de acceso para mostrar el token de acceso.
Sugerencia
Los tokens de acceso para cuentas profesionales o educativas de Microsoft se pueden analizar para solucionar problemas en https://jwt.ms . Los tokens de acceso para cuentas personales de Microsoft usan un formato propietario y no se pueden analizar.
Obtener una vista de calendario
En este ejercicio, incorporará Microsoft Graph a la aplicación. Para esta aplicación, usará el SDK de Microsoft Graph Java para realizar llamadas a Microsoft Graph.
Obtener detalles del usuario
Cree un nuevo archivo en el directorio ./graphtutorial/src/main/java/graphtutorial denominado Graph.java y agregue el código siguiente.
public static User getUser() { if (graphClient == null) throw new NullPointerException( "Graph client has not been initialized. Call initializeGraphAuth before calling this method"); // GET /me to get authenticated user User me = graphClient .me() .buildRequest() .select("displayName,mailboxSettings") .get(); return me; }Agregue la siguiente
importinstrucción en la parte superior de App.java.import com.microsoft.graph.models.User;Agregue el siguiente código en App.java justo antes de la línea para obtener el usuario y generar el nombre para mostrar
Scanner input = new Scanner(System.in);del usuario.// Greet the user User user = Graph.getUser(); System.out.println("Welcome " + user.displayName); System.out.println("Time zone: " + user.mailboxSettings.timeZone); System.out.println();Ejecute la aplicación. Después de iniciar sesión en la aplicación le da la bienvenida por su nombre.
Obtener eventos del calendario desde Outlook
Agregue la siguiente función a la
Graphclase en Graph.java para obtener eventos del calendario del usuario.public static List<Event> getCalendarView( ZonedDateTime viewStart, ZonedDateTime viewEnd, String timeZone) { if (graphClient == null) throw new NullPointerException( "Graph client has not been initialized. Call initializeGraphAuth before calling this method"); List<Option> options = new LinkedList<Option>(); options.add(new QueryOption("startDateTime", viewStart.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME))); options.add(new QueryOption("endDateTime", viewEnd.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME))); // Sort results by start time options.add(new QueryOption("$orderby", "start/dateTime")); // Start and end times adjusted to user's time zone options.add(new HeaderOption("Prefer", "outlook.timezone=\"" + timeZone + "\"")); // GET /me/events EventCollectionPage eventPage = graphClient .me() .calendarView() .buildRequest(options) .select("subject,organizer,start,end") .top(25) .get(); List<Event> allEvents = new LinkedList<Event>(); // Create a separate list of options for the paging requests // paging request should not include the query parameters from the initial // request, but should include the headers. List<Option> pagingOptions = new LinkedList<Option>(); pagingOptions.add(new HeaderOption("Prefer", "outlook.timezone=\"" + timeZone + "\"")); while (eventPage != null) { allEvents.addAll(eventPage.getCurrentPage()); EventCollectionRequestBuilder nextPage = eventPage.getNextPage(); if (nextPage == null) { break; } else { eventPage = nextPage .buildRequest(pagingOptions) .get(); } } return allEvents; }
Tenga en cuenta lo que está haciendo este código.
- La dirección URL a la que se llamará es
/me/calendarview.QueryOptionobjetos se usan para agregar losstartDateTimeparámetrosendDateTimeand, estableciendo el inicio y el final de la vista de calendario.- Se
QueryOptionusa un objeto para agregar el$orderbyparámetro, ordenando los resultados por hora de inicio. - Un objeto se usa para agregar el encabezado, lo que hace que las horas de inicio y finalización se ajusten a la zona
HeaderOptionPrefer: outlook.timezonehoraria del usuario. - La
selectfunción limita los campos devueltos para cada evento a solo aquellos que la aplicación usará realmente. - La
topfunción limita el número de eventos en la respuesta a un máximo de 25.
- La función se usa para solicitar páginas adicionales de resultados si hay más de
getNextPage25 eventos en la semana actual.
Cree un nuevo archivo en el directorio ./graphtutorial/src/main/java/graphtutorial denominado GraphToIana.java y agregue el código siguiente.
package graphtutorial; import java.time.ZoneId; import java.util.Map; // Basic lookup for mapping Windows time zone identifiers to // IANA identifiers // Mappings taken from // https://github.com/unicode-org/cldr/blob/master/common/supplemental/windowsZones.xml public class GraphToIana { private static final Map<String, String> timeZoneIdMap = Map.ofEntries( Map.entry("Dateline Standard Time", "Etc/GMT+12"), Map.entry("UTC-11", "Etc/GMT+11"), Map.entry("Aleutian Standard Time", "America/Adak"), Map.entry("Hawaiian Standard Time", "Pacific/Honolulu"), Map.entry("Marquesas Standard Time", "Pacific/Marquesas"), Map.entry("Alaskan Standard Time", "America/Anchorage"), Map.entry("UTC-09", "Etc/GMT+9"), Map.entry("Pacific Standard Time (Mexico)", "America/Tijuana"), Map.entry("UTC-08", "Etc/GMT+8"), Map.entry("Pacific Standard Time", "America/Los_Angeles"), Map.entry("US Mountain Standard Time", "America/Phoenix"), Map.entry("Mountain Standard Time (Mexico)", "America/Chihuahua"), Map.entry("Mountain Standard Time", "America/Denver"), Map.entry("Central America Standard Time", "America/Guatemala"), Map.entry("Central Standard Time", "America/Chicago"), Map.entry("Easter Island Standard Time", "Pacific/Easter"), Map.entry("Central Standard Time (Mexico)", "America/Mexico_City"), Map.entry("Canada Central Standard Time", "America/Regina"), Map.entry("SA Pacific Standard Time", "America/Bogota"), Map.entry("Eastern Standard Time (Mexico)", "America/Cancun"), Map.entry("Eastern Standard Time", "America/New_York"), Map.entry("Haiti Standard Time", "America/Port-au-Prince"), Map.entry("Cuba Standard Time", "America/Havana"), Map.entry("US Eastern Standard Time", "America/Indianapolis"), Map.entry("Turks And Caicos Standard Time", "America/Grand_Turk"), Map.entry("Paraguay Standard Time", "America/Asuncion"), Map.entry("Atlantic Standard Time", "America/Halifax"), Map.entry("Venezuela Standard Time", "America/Caracas"), Map.entry("Central Brazilian Standard Time", "America/Cuiaba"), Map.entry("SA Western Standard Time", "America/La_Paz"), Map.entry("Pacific SA Standard Time", "America/Santiago"), Map.entry("Newfoundland Standard Time", "America/St_Johns"), Map.entry("Tocantins Standard Time", "America/Araguaina"), Map.entry("E. South America Standard Time", "America/Sao_Paulo"), Map.entry("SA Eastern Standard Time", "America/Cayenne"), Map.entry("Argentina Standard Time", "America/Buenos_Aires"), Map.entry("Greenland Standard Time", "America/Godthab"), Map.entry("Montevideo Standard Time", "America/Montevideo"), Map.entry("Magallanes Standard Time", "America/Punta_Arenas"), Map.entry("Saint Pierre Standard Time", "America/Miquelon"), Map.entry("Bahia Standard Time", "America/Bahia"), Map.entry("UTC-02", "Etc/GMT+2"), Map.entry("Azores Standard Time", "Atlantic/Azores"), Map.entry("Cape Verde Standard Time", "Atlantic/Cape_Verde"), Map.entry("UTC", "Etc/GMT"), Map.entry("GMT Standard Time", "Europe/London"), Map.entry("Greenwich Standard Time", "Atlantic/Reykjavik"), Map.entry("Sao Tome Standard Time", "Africa/Sao_Tome"), Map.entry("Morocco Standard Time", "Africa/Casablanca"), Map.entry("W. Europe Standard Time", "Europe/Berlin"), Map.entry("Central Europe Standard Time", "Europe/Budapest"), Map.entry("Romance Standard Time", "Europe/Paris"), Map.entry("Central European Standard Time", "Europe/Warsaw"), Map.entry("W. Central Africa Standard Time", "Africa/Lagos"), Map.entry("Jordan Standard Time", "Asia/Amman"), Map.entry("GTB Standard Time", "Europe/Bucharest"), Map.entry("Middle East Standard Time", "Asia/Beirut"), Map.entry("Egypt Standard Time", "Africa/Cairo"), Map.entry("E. Europe Standard Time", "Europe/Chisinau"), Map.entry("Syria Standard Time", "Asia/Damascus"), Map.entry("West Bank Standard Time", "Asia/Hebron"), Map.entry("South Africa Standard Time", "Africa/Johannesburg"), Map.entry("FLE Standard Time", "Europe/Kiev"), Map.entry("Israel Standard Time", "Asia/Jerusalem"), Map.entry("Kaliningrad Standard Time", "Europe/Kaliningrad"), Map.entry("Sudan Standard Time", "Africa/Khartoum"), Map.entry("Libya Standard Time", "Africa/Tripoli"), Map.entry("Namibia Standard Time", "Africa/Windhoek"), Map.entry("Arabic Standard Time", "Asia/Baghdad"), Map.entry("Turkey Standard Time", "Europe/Istanbul"), Map.entry("Arab Standard Time", "Asia/Riyadh"), Map.entry("Belarus Standard Time", "Europe/Minsk"), Map.entry("Russian Standard Time", "Europe/Moscow"), Map.entry("E. Africa Standard Time", "Africa/Nairobi"), Map.entry("Iran Standard Time", "Asia/Tehran"), Map.entry("Arabian Standard Time", "Asia/Dubai"), Map.entry("Astrakhan Standard Time", "Europe/Astrakhan"), Map.entry("Azerbaijan Standard Time", "Asia/Baku"), Map.entry("Russia Time Zone 3", "Europe/Samara"), Map.entry("Mauritius Standard Time", "Indian/Mauritius"), Map.entry("Saratov Standard Time", "Europe/Saratov"), Map.entry("Georgian Standard Time", "Asia/Tbilisi"), Map.entry("Volgograd Standard Time", "Europe/Volgograd"), Map.entry("Caucasus Standard Time", "Asia/Yerevan"), Map.entry("Afghanistan Standard Time", "Asia/Kabul"), Map.entry("West Asia Standard Time", "Asia/Tashkent"), Map.entry("Ekaterinburg Standard Time", "Asia/Yekaterinburg"), Map.entry("Pakistan Standard Time", "Asia/Karachi"), Map.entry("Qyzylorda Standard Time", "Asia/Qyzylorda"), Map.entry("India Standard Time", "Asia/Calcutta"), Map.entry("Sri Lanka Standard Time", "Asia/Colombo"), Map.entry("Nepal Standard Time", "Asia/Katmandu"), Map.entry("Central Asia Standard Time", "Asia/Almaty"), Map.entry("Bangladesh Standard Time", "Asia/Dhaka"), Map.entry("Omsk Standard Time", "Asia/Omsk"), Map.entry("Myanmar Standard Time", "Asia/Rangoon"), Map.entry("SE Asia Standard Time", "Asia/Bangkok"), Map.entry("Altai Standard Time", "Asia/Barnaul"), Map.entry("W. Mongolia Standard Time", "Asia/Hovd"), Map.entry("North Asia Standard Time", "Asia/Krasnoyarsk"), Map.entry("N. Central Asia Standard Time", "Asia/Novosibirsk"), Map.entry("Tomsk Standard Time", "Asia/Tomsk"), Map.entry("China Standard Time", "Asia/Shanghai"), Map.entry("North Asia East Standard Time", "Asia/Irkutsk"), Map.entry("Singapore Standard Time", "Asia/Singapore"), Map.entry("W. Australia Standard Time", "Australia/Perth"), Map.entry("Taipei Standard Time", "Asia/Taipei"), Map.entry("Ulaanbaatar Standard Time", "Asia/Ulaanbaatar"), Map.entry("Aus Central W. Standard Time", "Australia/Eucla"), Map.entry("Transbaikal Standard Time", "Asia/Chita"), Map.entry("Tokyo Standard Time", "Asia/Tokyo"), Map.entry("North Korea Standard Time", "Asia/Pyongyang"), Map.entry("Korea Standard Time", "Asia/Seoul"), Map.entry("Yakutsk Standard Time", "Asia/Yakutsk"), Map.entry("Cen. Australia Standard Time", "Australia/Adelaide"), Map.entry("AUS Central Standard Time", "Australia/Darwin"), Map.entry("E. Australia Standard Time", "Australia/Brisbane"), Map.entry("AUS Eastern Standard Time", "Australia/Sydney"), Map.entry("West Pacific Standard Time", "Pacific/Port_Moresby"), Map.entry("Tasmania Standard Time", "Australia/Hobart"), Map.entry("Vladivostok Standard Time", "Asia/Vladivostok"), Map.entry("Lord Howe Standard Time", "Australia/Lord_Howe"), Map.entry("Bougainville Standard Time", "Pacific/Bougainville"), Map.entry("Russia Time Zone 10", "Asia/Srednekolymsk"), Map.entry("Magadan Standard Time", "Asia/Magadan"), Map.entry("Norfolk Standard Time", "Pacific/Norfolk"), Map.entry("Sakhalin Standard Time", "Asia/Sakhalin"), Map.entry("Central Pacific Standard Time", "Pacific/Guadalcanal"), Map.entry("Russia Time Zone 11", "Asia/Kamchatka"), Map.entry("New Zealand Standard Time", "Pacific/Auckland"), Map.entry("UTC+12", "Etc/GMT-12"), Map.entry("Fiji Standard Time", "Pacific/Fiji"), Map.entry("Chatham Islands Standard Time", "Pacific/Chatham"), Map.entry("UTC+13", "Etc/GMT-13"), Map.entry("Tonga Standard Time", "Pacific/Tongatapu"), Map.entry("Samoa Standard Time", "Pacific/Apia"), Map.entry("Line Islands Standard Time", "Pacific/Kiritimati") ); public static String getIanaFromWindows(String windowsTimeZone) { String iana = timeZoneIdMap.get(windowsTimeZone); // If a mapping was not found, assume the value passed // was already an IANA identifier return (iana == null) ? windowsTimeZone : iana; } public static ZoneId getZoneIdFromWindows(String windowsTimeZone) { String timeZoneId = getIanaFromWindows(windowsTimeZone); return ZoneId.of(timeZoneId); } }Esta clase implementa una búsqueda sencilla para convertir nombres de zona horaria de Windows en identificadores de IANA y para generar un ZoneId basado en un nombre de zona horaria de Windows.
Mostrar los resultados
Agregue las siguientes
importinstrucciones en App.java.import java.time.DayOfWeek; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.time.format.FormatStyle; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; import java.util.HashSet; import java.util.List; import com.microsoft.graph.models.DateTimeTimeZone; import com.microsoft.graph.models.Event;Agregue la siguiente función a la clase para dar formato a las propiedades
AppdateTimeTimeZone de Microsoft Graph en un formato fácil de usar.private static String formatDateTimeTimeZone(DateTimeTimeZone date) { LocalDateTime dateTime = LocalDateTime.parse(date.dateTime); return dateTime.format( DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)) + " (" + date.timeZone + ")"; }Agregue la siguiente función a la clase para obtener los eventos del usuario y
Appgenerarlos en la consola.private static void listCalendarEvents(String timeZone) { ZoneId tzId = GraphToIana.getZoneIdFromWindows("Pacific Standard Time"); // Get midnight of the first day of the week (assumed Sunday) // in the user's timezone, then convert to UTC ZonedDateTime startOfWeek = ZonedDateTime.now(tzId) .with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY)) .truncatedTo(ChronoUnit.DAYS) .withZoneSameInstant(ZoneId.of("UTC")); // Add 7 days to get the end of the week ZonedDateTime endOfWeek = startOfWeek.plusDays(7); // Get the user's events List<Event> events = Graph.getCalendarView( startOfWeek, endOfWeek, timeZone); System.out.println("Events:"); for (Event event : events) { System.out.println("Subject: " + event.subject); System.out.println(" Organizer: " + event.organizer.emailAddress.name); System.out.println(" Start: " + formatDateTimeTimeZone(event.start)); System.out.println(" End: " + formatDateTimeTimeZone(event.end)); } System.out.println(); }Agregue lo siguiente justo después del
// List the calendarcomentario en lamainfunción.listCalendarEvents(user.mailboxSettings.timeZone);Guarda todos los cambios, crea la aplicación y, a continuación, ejecutala. Elija la opción Enumerar eventos de calendario para ver una lista de los eventos del usuario.
Welcome Adele Vance Please choose one of the following options: 0. Exit 1. Display access token 2. View this week's calendar 3. Add an event 2 Events: Subject: Weekly meeting Organizer: Lynne Robbins Start: 12/7/20, 2:00 PM (Pacific Standard Time) End: 12/7/20, 3:00 PM (Pacific Standard Time) Subject: Carpool Organizer: Lynne Robbins Start: 12/7/20, 4:00 PM (Pacific Standard Time) End: 12/7/20, 5:30 PM (Pacific Standard Time) Subject: Tailspin Toys Proposal Review + Lunch Organizer: Lidia Holloway Start: 12/8/20, 12:00 PM (Pacific Standard Time) End: 12/8/20, 1:00 PM (Pacific Standard Time) Subject: Project Tailspin Organizer: Lidia Holloway Start: 12/8/20, 3:00 PM (Pacific Standard Time) End: 12/8/20, 4:30 PM (Pacific Standard Time) Subject: Company Meeting Organizer: Christie Cline Start: 12/9/20, 8:30 AM (Pacific Standard Time) End: 12/9/20, 11:00 AM (Pacific Standard Time) Subject: Carpool Organizer: Lynne Robbins Start: 12/9/20, 4:00 PM (Pacific Standard Time) End: 12/9/20, 5:30 PM (Pacific Standard Time) Subject: Project Team Meeting Organizer: Lidia Holloway Start: 12/10/20, 8:00 AM (Pacific Standard Time) End: 12/10/20, 9:30 AM (Pacific Standard Time) Subject: Weekly Marketing Lunch Organizer: Adele Vance Start: 12/10/20, 12:00 PM (Pacific Standard Time) End: 12/10/20, 1:00 PM (Pacific Standard Time) Subject: Project Tailspin Organizer: Lidia Holloway Start: 12/10/20, 3:00 PM (Pacific Standard Time) End: 12/10/20, 4:30 PM (Pacific Standard Time) Subject: Lunch? Organizer: Lynne Robbins Start: 12/11/20, 12:00 PM (Pacific Standard Time) End: 12/11/20, 1:00 PM (Pacific Standard Time) Subject: Friday Unwinder Organizer: Megan Bowen Start: 12/11/20, 4:00 PM (Pacific Standard Time) End: 12/11/20, 5:00 PM (Pacific Standard Time)
Crear un nuevo evento
En esta sección, agregará la capacidad de crear eventos en el calendario del usuario.
Abra ./graphtutorial/src/main/java/graphtutorial/Graph.java y agregue la siguiente función a la clase Graph.
public static void createEvent( String timeZone, String subject, LocalDateTime start, LocalDateTime end, Set<String> attendees, String body) { if (graphClient == null) throw new NullPointerException( "Graph client has not been initialized. Call initializeGraphAuth before calling this method"); Event newEvent = new Event(); newEvent.subject = subject; newEvent.start = new DateTimeTimeZone(); newEvent.start.dateTime = start.toString(); newEvent.start.timeZone = timeZone; newEvent.end = new DateTimeTimeZone(); newEvent.end.dateTime = end.toString(); newEvent.end.timeZone = timeZone; if (attendees != null && !attendees.isEmpty()) { newEvent.attendees = new LinkedList<Attendee>(); attendees.forEach((email) -> { Attendee attendee = new Attendee(); // Set each attendee as required attendee.type = AttendeeType.REQUIRED; attendee.emailAddress = new EmailAddress(); attendee.emailAddress.address = email; newEvent.attendees.add(attendee); }); } if (body != null) { newEvent.body = new ItemBody(); newEvent.body.content = body; // Treat body as plain text newEvent.body.contentType = BodyType.TEXT; } // POST /me/events graphClient .me() .events() .buildRequest() .post(newEvent); }Abra ./graphtutorial/src/main/java/graphtutorial/App.java y agregue la siguiente función a la clase App.
private static void createEvent(String timeZone, Scanner input) { DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("M/d/yyyy h:mm a"); // Prompt for subject String subject = ""; while (subject.isBlank()) { System.out.print("Subject (required): "); subject = input.nextLine(); } // Prompt for start date/time LocalDateTime start = null; while (start == null) { System.out.print("Start (mm/dd/yyyy hh:mm AM/PM): "); String date = input.nextLine(); try { start = LocalDateTime.parse(date, inputFormat); } catch (DateTimeParseException dtp) { System.out.println("Invalid input, try again."); } } // Prompt for end date/time LocalDateTime end = null; while (end == null) { System.out.print("End (mm/dd/yyyy hh:mm AM/PM): "); String date = input.nextLine(); try { end = LocalDateTime.parse(date, inputFormat); } catch (DateTimeParseException dtp) { System.out.println("Invalid input, try again."); } if (end.isBefore(start)) { System.out.println("End time must be after start time."); end = null; } } // Prompt for attendees HashSet<String> attendees = new HashSet<String>(); System.out.print("Would you like to add attendees? (y/n): "); if (input.nextLine().trim().toLowerCase().startsWith("y")) { String attendee = ""; do { System.out.print("Enter an email address (leave blank to finalize the list): "); attendee = input.nextLine(); if (!attendee.isBlank()) { attendees.add(attendee); } } while (!attendee.isBlank()); } // Prompt for body String body = null; System.out.print("Would you like to add a body? (y/n): "); if (input.nextLine().trim().toLowerCase().startsWith("y")) { System.out.print("Enter a body: "); body = input.nextLine(); } // Confirm input System.out.println(); System.out.println("New event:"); System.out.println("Subject: " + subject); System.out.println("Start: " + start.format(inputFormat)); System.out.println("End: " + end.format(inputFormat)); System.out.println("Attendees: " + (attendees.size() > 0 ? attendees.toString() : "NONE")); System.out.println("Body: " + (body == null ? "NONE" : body)); System.out.print("Is this correct? (y/n): "); if (input.nextLine().trim().toLowerCase().startsWith("y")) { Graph.createEvent(timeZone, subject, start, end, attendees, body); System.out.println("Event created."); } else { System.out.println("Canceling."); } System.out.println(); }Esta función solicita al usuario asunto, asistentes, inicio, fin y cuerpo y, a continuación, usa esos valores para llamar a
Graph.createEvent.Agregue lo siguiente justo después del
// Create a new eventcomentario en laMainfunción.createEvent(user.mailboxSettings.timeZone, input);Guarda todos los cambios y ejecuta la aplicación. Elija la opción Agregar un evento. Responda a los mensajes para crear un nuevo evento en el calendario del usuario.
¡Enhorabuena!
Ha completado el tutorial de Java de Microsoft Graph. Ahora que tiene una aplicación de trabajo que llama a Microsoft Graph, puede experimentar y agregar nuevas características. Visite la información general de Microsoft Graph para ver todos los datos a los que puede tener acceso con Microsoft Graph.
Comentarios
Envíe sus comentarios sobre este tutorial en el repositorio de github.
¿Tiene algún problema con esta sección? Si es así, envíenos sus comentarios para que podamos mejorarla.