Valor API. ¿Qué es una API? API como forma de servir a los clientes

API de Windows: un conjunto de funciones del sistema operativo

La abreviatura API parece muy misteriosa e incluso aterradora para muchos programadores novatos. De hecho, una interfaz de programación de aplicaciones (API) es sólo un conjunto de funciones ya preparadas que los desarrolladores de aplicaciones pueden utilizar. En general, este concepto es equivalente a lo que antes se llamaba más a menudo biblioteca de subrutinas. Sin embargo, API suele referirse a una categoría especial de dichas bibliotecas.

Durante el desarrollo de casi cualquier aplicación bastante compleja (MyApplication) para el usuario final, se forma un conjunto de funciones internas específicas que se utilizan para implementar este programa en particular, que se denomina API MyApplication. Sin embargo, a menudo resulta que estas funciones pueden utilizarse eficazmente para crear otras aplicaciones, incluso por parte de otros programadores. En este caso, los autores, en función de la estrategia de promoción de su producto, deben decidir la pregunta: ¿abren el acceso a este conjunto a usuarios externos o no? Si la respuesta es sí, la frase "El paquete incluye un conjunto abierto de funciones API" aparece en la descripción del paquete de software como una característica positiva (pero a veces por dinero adicional).

Por lo tanto, la mayoría de las veces una API se refiere a un conjunto de funciones que forman parte de una aplicación, pero que también están disponibles para su uso en otros programas. Por ejemplo, Excel, además de su interfaz de usuario final, tiene un conjunto de funciones API de Excel que se pueden utilizar, en particular, al crear aplicaciones utilizando VB.

En consecuencia, la API de Windows es un conjunto de funciones que forma parte del propio sistema operativo y al mismo tiempo es accesible para cualquier otra aplicación, incluidas las escritas en VB. En este sentido, la analogía con el conjunto de interrupciones del sistema BIOS/DOS, que en realidad es una API de DOS, está bastante justificada.

La diferencia es que la gama de funciones API de Windows, por un lado, es mucho más amplia en comparación con DOS y, por otro lado, no incluye muchas de las herramientas para administrar directamente los recursos informáticos que estaban disponibles para los programadores en el pasado. SO. Además, las llamadas a la API de Windows se realizan mediante llamadas a procedimientos ordinarios y las llamadas a funciones de DOS se realizan mediante una instrucción especial del procesador llamada Interrupción.

¿Por qué necesitamos Win API para programadores de VB?

A pesar de que VB tiene una gran variedad de funciones, en el proceso de desarrollo más o menos serio se descubre que sus capacidades a menudo no son suficientes para resolver los problemas necesarios. Al mismo tiempo, los programadores novatos a menudo comienzan a quejarse de las deficiencias de VB y piensan en cambiar de herramienta, sin sospechar que su computadora tiene un gran conjunto de herramientas y solo necesitan saber cómo usarlas.

Cuando se familiariza con la API de Win, descubre que muchas funciones integradas de VB no son más que llamadas a los procedimientos del sistema correspondientes, pero solo se implementan en forma de sintaxis de un idioma determinado. Teniendo esto en cuenta, la necesidad de utilizar la API viene determinada por las siguientes opciones:

  1. Funciones API que están completamente implementadas como funciones VB integradas.
  2. Sin embargo, a veces en este caso es útil cambiar al uso de la API, ya que esto a veces puede mejorar significativamente el rendimiento (en particular, debido a la ausencia de transformaciones innecesarias de los parámetros pasados).
  3. Las funciones VB integradas implementan solo un caso especial de la función API correspondiente.

Esta es una opción bastante común. Por ejemplo, la función API CreateDirectory tiene más capacidades que el operador VB MkDir integrado.

El punto de vista personal del autor es el siguiente: en lugar de expandir las funciones integradas de VB de una versión a otra, se debe dar una buena descripción de las funciones API más populares. Al mismo tiempo, me gustaría aconsejar a los desarrolladores que no esperen a que aparezca una nueva versión de la herramienta con funciones ampliadas, sino que observen más de cerca la composición de la API Win existente; es probable que las capacidades que necesita podría haberse implementado ya en la versión VB 1.0, lanzada en 1991.

Cómo aprender a ganar API

Esta no es una pregunta tan simple, considerando que el número de funciones API de Win32 se estima en unas 10 mil (nadie conoce la cifra exacta, ni siquiera Microsoft).

VB (versiones 4-6) incluye un archivo que describe las declaraciones de Win API: WIN32API.TXT (le contaremos más sobre su uso más adelante). Pero, en primer lugar, con su ayuda puede obtener información sobre el propósito de una función en particular y sus parámetros solo mediante los nombres mnemónicos utilizados y, en segundo lugar, la lista de funciones en este archivo está lejos de ser completa. En un momento (hace siete años), VB 3.0 tenía archivos de ayuda especiales que describían las funciones de la API Win16. Sin embargo, ya en la versión 4.0 esta información útil con una interfaz conveniente desapareció.

Puede encontrar información completa sobre la API Win32 en la ayuda del kit de desarrollo de software de plataforma, que se incluye en los CD de la biblioteca MSDN incluidos con VB 5.0 y 6.0 Enterprise Edition y Office 2000 Developer Edition. Sin embargo, encontrar allí la información necesaria y comprenderla no es nada fácil. Sin mencionar que todas las descripciones allí se dan en relación con el lenguaje C.

Los libros del famoso experto estadounidense Daniel Appleman son generalmente reconocidos en el mundo por aprender a programar API en el entorno VB. Su Guía del programador Visual Basic de Dan Appleman para la serie API de Windows (para Win16, Win32 y varias versiones de VB) ha sido uno de los libros más vendidos para programadores de VB desde 1993. El libro Guía del programador VB 5.0 de Dan Appleman para la API Win32, publicado en 1997, fue traído al autor desde Estados Unidos por un amigo que lo encontró en la primera librería de una pequeña ciudad de provincias.

Este libro tiene más de 1500 páginas y cubre técnicas generales de programación API en VB, así como más de 900 funciones. El CD incluido contiene el texto completo del libro y todos los ejemplos de programas, así como varios capítulos adicionales no incluidos en la versión impresa. En 1999, Dan Appleman publicó un nuevo libro, Win32 API Puzzle Book and Tutorial for Visual Basic Programmers de Dan Appleman, que incluye información sobre otras 7.600 funciones (aunque no tan extensa).

Win API y biblioteca de vínculos dinámicos (DLL)

El conjunto de Win API se implementa en forma de DLL dinámicas. A continuación, hablaremos sobre la tecnología de uso de DLL en el entorno VB usando el ejemplo de las bibliotecas incluidas en Win API. Sin embargo, cuando se habla de DLL, hay algunos puntos importantes que destacar.

En este caso, por DLL nos referimos a la versión tradicional de las bibliotecas dinámicas binarias, que proporcionan a las aplicaciones acceso directo a los procedimientos necesarios: subrutinas o funciones (de forma muy similar a lo que sucede cuando se llaman procedimientos dentro de un proyecto VB). Estas bibliotecas se pueden crear utilizando diferentes herramientas: VC++, Delphi, Fortran, excepto VB (veamos qué aparece en la versión 7.0); este último sólo puede crear DLL ActiveX, a las que se accede a través de la interfaz de automatización OLE.

Normalmente, los archivos de biblioteca dinámica tienen la extensión .DLL, pero esto no es en absoluto necesario (para Win16 se usaba a menudo la extensión .EXE); Los controladores de dispositivos externos se designan mediante .DRV.

Como ya hemos señalado, es bastante difícil determinar el número exacto de funciones API de Windows y los archivos que las contienen, pero todas están ubicadas en el directorio del sistema. En este sentido, es mejor destacar la composición de las bibliotecas incluidas en el kernel del sistema operativo y las bibliotecas principales con funciones adicionales clave.

Y ahora algunos consejos.

Consejo 1. Asegúrese de que su anuncio de DL tenga el formato correcto Procedimientos L

La misma llamada a procedimientos DLL en un programa tiene exactamente el mismo aspecto que a los procedimientos "normales" de Visual Basic, por ejemplo:

Llamar a DllName([lista de argumentos])

Sin embargo, para utilizar funciones DLL externas (incluida la API de Win), deben declararse en el programa mediante la declaración Declare, que tiene este aspecto:

Declarar SubProcedimientoName Lib _ “LibraryName” _ [([ArgumentList])]

Declarar función Nombre de función _ Lib “Nombre de biblioteca” _ [([Lista de argumentos])]

Aquí, los elementos opcionales del operador se muestran entre corchetes, las expresiones variables están en cursiva y las palabras restantes son palabras clave. El sistema de ayuda ofrece una descripción bastante buena de la sintaxis del operador, por lo que por ahora sólo señalaremos algunos puntos.

Las declaraciones de funciones externas deben colocarse en la sección Declaraciones generales del módulo. Si lo coloca en un módulo de formulario, debe especificar la palabra clave Privada (esta declaración solo estará disponible dentro de este módulo); esta es una limitación para todos los procedimientos del módulo de formulario.

El conjunto de API de Win32 se implementa solo en forma de funciones (la API de Win16 tenía muchas subrutinas). En su mayor parte, se trata de funciones de tipo Long, que suelen devolver el código de finalización de la operación.

El operador Declarar apareció en MS Basic en la época de DOS y también se usaba para declarar procedimientos internos de proyectos. En Visual Basic esto no es necesario, ya que la declaración de procedimientos internos es automáticamente su declaración Sub o Función. En comparación con Basic/DOS, la nueva descripción debe indicar el nombre del archivo de la biblioteca donde se encuentra el procedimiento requerido. Las bibliotecas de Wip API se encuentran en el directorio del sistema de Windows, por lo que basta con proporcionar solo el nombre del archivo. Si accede a una DLL que se encuentra en una ubicación aleatoria, debe escribir la ruta completa a este archivo.

La descripción de la declaración Declare suele ocupar bastante espacio y no cabe en una sola línea de la ventana de código. Por lo tanto, le recomendamos que siga un esquema de salto de línea específico al escribir aplicaciones, por ejemplo:

Declarar función GetTempPath _ Lib “kernel32” Alias ​​​​“GetTempPathA” _ (ByVal nBufferLength As Long, _ ByVal lpBuffer As String) As Long

En este caso, todos los elementos principales de la descripción están colocados en líneas diferentes y, por lo tanto, son fáciles de leer.

Consejo 2: tenga especial cuidado al trabajar con funciones DLL

El uso de Win API y varias funciones DLL amplía significativamente la funcionalidad de VB y, a menudo, mejora el rendimiento del programa. Sin embargo, el precio a pagar por esto es el riesgo de reducir la confiabilidad de la aplicación, especialmente durante su depuración.

Una de las ventajas más importantes del entorno VB es la confiabilidad del proceso de desarrollo del programa: al operar bajo el control de un intérprete, el código del programa teóricamente no puede interrumpir el funcionamiento de Windows y del propio VB. Es posible que el programador no tenga mucho cuidado con la exactitud de la transferencia de parámetros a las funciones llamadas; el propio intérprete detectará fácilmente dichos errores durante el proceso de traducción del código o durante su ejecución. En el caso más desagradable, el modo de procesamiento simplemente se interrumpirá, con una indicación de dónde y por qué ocurrió el error.

El uso de funciones API de Windows u otras DLL elimina directamente dicho control sobre la transferencia de datos y el proceso de ejecución de código fuera del entorno VB. Por lo tanto, un error al acceder a funciones externas puede provocar la inoperancia tanto de VB como del sistema operativo. Esto es especialmente cierto en la etapa de desarrollo del programa, cuando la presencia de errores es bastante natural. Así, al utilizar las capacidades más amplias de las funciones de la capa base del sistema, el programador asume la responsabilidad del uso correcto de las mismas.

El problema se agrava aún más por el hecho de que diferentes lenguajes de programación utilizan diferentes formas de pasar parámetros entre procedimientos. (Más precisamente, se utilizan diferentes métodos de paso de forma predeterminada, ya que muchos lenguajes pueden admitir múltiples métodos). Las API de Win se implementan en C/C++ y utilizan convenciones de paso de parámetros de C/C++ que difieren de la versión habitual de VB.

En este sentido, cabe señalar que la aparición de análogos de funciones API integradas en VB se justifica precisamente por la adaptación de estas últimas a la sintaxis de VB y la implementación de un mecanismo de control de intercambio de datos adecuado. Tengamos en cuenta también que en la etapa de depuración experimental de la aplicación al crear un módulo ejecutable, es mejor utilizar la opción de compilación de código P en lugar de código nativo (código de máquina). En el primer caso, el programa se ejecutará bajo el control de un intérprete: más lento en comparación con el código de máquina, pero más confiable desde el punto de vista del posible impacto erróneo en el sistema operativo y proporcionando un modo más conveniente para identificar posibles errores.

Consejo 3: Diez consejos de Dan Appleman para una programación API sólida en VB

El uso de la función API requiere una programación más cuidadosa utilizando algunas técnicas de llamada a procedimientos menos familiares (en comparación con VB). Continuaremos abordando estas cuestiones a continuación. Y ahora presentamos un resumen de los consejos formulados por Dan Appleman sobre este tema (su primera versión apareció en 1993) con algunas de nuestras adiciones y comentarios.

1. Recuerda ByVal. El error más común que se comete al acceder a las funciones API y DLL es el uso incorrecto de la palabra clave ByVal: o se olvidan de ponerla o, por el contrario, la ponen cuando no es necesaria.

Estos ejemplos muestran el impacto del operador ByVal en el paso de parámetros.

Tipo de parámetro Con ByVal Sin ByVal
Entero Se inserta un entero de 16 bits en la pila La dirección de 32 bits de un entero de 16 bits se inserta en la pila
Largo Se inserta un entero de 32 bits en la pila La dirección de 32 bits de un entero de 32 bits se inserta en la pila
Cadena La cadena se convierte al formato utilizado en C (datos y un byte nulo final). La dirección de 32 bits de la nueva línea se inserta en la pila El mango VB de la cuerda se empuja hacia la pila. (Estos identificadores nunca son utilizados por la API de Windows y solo se reconocen en archivos DLL implementados específicamente para VB).

Cabe recordar aquí que el paso de parámetros en cualquier sistema de programación, incluido VB, se realiza de dos formas principales: por referencia (ByRef) o por valor (ByVal). En el primer caso, se pasa la dirección de la variable (esta opción se usa de forma predeterminada en VB), en el segundo, su valor. La diferencia fundamental es que al utilizar una referencia, el valor modificado del parámetro pasado se devuelve al programa que realiza la llamada.

Para comprender esto, realice un experimento utilizando los siguientes programas:

Dim v As Integer v = 2 Llamar a MyProc(v) MsgBox “v = “ & v Sub MyProc (v As Integer) v = v + 1 End Sub

Cuando ejecute este ejemplo, recibirá un mensaje con el valor de la variable igual a 3. El hecho es que en este caso la dirección de la variable v, creada físicamente en el programa que llama, se pasa a la subrutina MyProc. Ahora cambie la descripción del procedimiento a

Sub MyProc (ByVal v Como entero)

Como resultado, al ejecutar la prueba, obtendrá v = 2, porque solo el valor inicial de la variable se pasa al procedimiento; el resultado de las operaciones realizadas en ella no se devuelve al programa que llama. El modo de transferencia por valor también se puede cambiar usando el operador de llamada de la siguiente manera:

Sub MyProc (v As Integer) ... Call MyProc((v)) ' (v) - los paréntesis indican el modo de transferencia por valor.

Sin embargo, al acceder a procedimientos internos de VB, se prohíbe el uso de la palabra clave ByVal en la declaración Call; en su lugar se utilizan paréntesis. Hay una explicación para esto.

En el caso clásico (C, Fortran, Pascal), la diferencia entre los modos ByRef y ByVal depende de qué se coloca exactamente en la pila de intercambio de datos: la dirección de la variable o su valor. Históricamente, Basic utiliza una variante de la emulación del software ByVal: siempre hay una dirección en la pila, pero solo cuando se pasa por valor se crea una variable temporal para esto. Para distinguir entre estas dos opciones (Clásica y Básica), se utilizan diferentes formas de describir el modo ByVal. Tenga en cuenta que emular el modo ByVal en VB proporciona una mayor confiabilidad del programa: al mezclar la forma de referencia, el programador solo corre el riesgo de que el valor corregido de la variable sea devuelto (o no devuelto) al programa que llama. En la versión "clásica", tal confusión puede conducir a un error fatal al ejecutar un procedimiento (por ejemplo, cuando se usa un valor de variable igual a, digamos, cero, en lugar de una dirección de memoria).

Las funciones DLL se implementan según principios "clásicos" y, por lo tanto, requieren una descripción obligatoria de cómo se intercambian los datos con cada uno de los argumentos. Las declaraciones de funciones a través de la descripción de Declaración (más precisamente, la lista de argumentos pasados) sirven para este propósito. La forma más común de pasar parámetros a una función API de Windows o DLL es utilizar la palabra clave ByVal. Además, se puede especificar tanto en el operador Declarar como directamente al llamar a la función.

Las consecuencias del paso incorrecto de parámetros son fáciles de predecir. Si recibe una dirección obviamente no válida, recibirá un mensaje GPF (Fallo de protección general). Si la función recibe un valor que coincide con una dirección válida, entonces la función API ingresará a un área extraña (por ejemplo, el kernel de Windows) con todas las consecuencias desastrosas resultantes.

2. Verifique el tipo de parámetros que se pasan. El número y tipo correcto de parámetros pasados ​​son igualmente importantes. Es necesario que los argumentos declarados en Declare coincidan con los parámetros esperados en la función API. El caso más común de error al pasar parámetros implica la diferencia entre NULL y una cadena de longitud cero; recuerde que no son lo mismo.

3. Verifique el tipo de devolución.

VB es bastante tolerante con las discrepancias en los tipos de retorno de funciones, ya que los valores numéricos generalmente se devuelven a través de registros en lugar de la pila.

  • Las siguientes reglas ayudarán a determinar el valor correcto devuelto por una función API:
  • Una función DLL que no devuelve un valor (análoga a anular en 'C') debe declararse como VB Sub.
  • Una función API que devuelve un valor entero (Entero o Largo) se puede definir como Sub o Función que devuelve un valor del tipo apropiado.

Ninguna de las funciones API devuelve números de punto flotante, pero algunas DLL pueden devolver este tipo de datos. 4. Utilice la construcción “Como Cualquiera” con mucho cuidado.

Muchas funciones API de Windows tienen la capacidad de aceptar parámetros de diferentes tipos y utilizan la construcción Como cualquier para hacerlo (la interpretación de tipos se realiza según el valor de otros parámetros pasados).

Una buena solución en este caso puede ser utilizar varios alias (Alias) de una función creando dos o más declaraciones para la misma función, especificando cada declaración parámetros de un tipo específico. 5. No olvides inicializar las cadenas.

Hay muchas funciones en Win API que devuelven información cargando datos en búferes de cadena pasados ​​como parámetro. En su programa, aparentemente puede hacer todo correctamente: no se olvide de ByVal, pase los parámetros a la función correctamente. Pero Windows no puede comprobar qué tan grande es el tamaño de la memoria asignada para una fila. El tamaño de la fila debe ser lo suficientemente grande para acomodar todos los datos que se pueden colocar en ella. La responsabilidad de reservar un buffer del tamaño requerido recae en el programador de VB.

Cabe señalar que en Windows de 32 bits, cuando se utilizan cadenas, la conversión se realiza de Unicode (codificación de doble byte) a ANSI (codificación de un solo byte) y viceversa, teniendo en cuenta la configuración nacional del sistema. Por lo tanto, para reservar buffers, a veces es más conveniente usar matrices de bytes en lugar de variables de cadena. (Más sobre esto a continuación).

6. Asegúrese de utilizar la opción explícita.

7. Verifique cuidadosamente los valores de los parámetros y los valores de retorno. VB tiene buenas capacidades de verificación de tipos. Esto significa que cuando intenta pasar un parámetro no válido a una función de VB, lo peor que puede pasar es que reciba un mensaje de error de VB. Pero este mecanismo, lamentablemente, no funciona al acceder a las funciones API de Windows.

Windows 9x ha mejorado la verificación de parámetros para la mayoría de las funciones API. Por tanto, la presencia de un error en los datos no suele provocar un error fatal, pero determinar qué lo provocó no es tan fácil.

Aquí podemos recomendar el uso de varias formas de depurar este tipo de error:

  • Utilice el modo de depuración paso a paso o el comando Debug.Print para comprobar cada llamada a función API sospechosa. Verifique los resultados de estas llamadas para asegurarse de que todo sea normal y que la función se haya completado correctamente;
  • utilice un depurador de Windows como CodeView y una versión de depuración de Windows (disponible en el SDK de Windows). Estas herramientas pueden detectar un error de parámetro y al menos determinar qué función API está causando el error;
  • Utilice herramientas adicionales de terceros para comprobar los tipos de parámetros y la validez de sus valores. Estas herramientas no sólo pueden encontrar errores de parámetros, sino que incluso pueden señalar la línea de código VB donde ocurrió el error.

Además, es necesario verificar el resultado de ejecutar la función API.

8. Recuerde que los números enteros en VB y en Windows no son lo mismo. En primer lugar, debes tener en cuenta que el término "Entero" en VB significa un número de 16 bits, mientras que en la documentación de Win 32 significa un número de 32 bits. En segundo lugar, los números enteros (Entero y Largo) en VB son cantidades con signo (es decir, un dígito se usa como signo y el resto como mantisa del número), en Windows solo se usan números no negativos. Esta circunstancia debe tenerse en cuenta al formar un parámetro pasado mediante operaciones aritméticas (por ejemplo, calcular una dirección sumando alguna base y desplazamiento).

Las funciones aritméticas estándar de VB no son adecuadas para esto. Discutiremos qué hacer en este caso por separado. A diferencia de Win16, los nombres de todas las funciones de la API de Win32 son sensibles al uso exacto de letras minúsculas y mayúsculas (este no era el caso en Win16). Si en algún lugar utiliza una letra minúscula en lugar de una mayúscula o viceversa, no se encontrará la función deseada. También tenga cuidado de utilizar correctamente el sufijo A o W en funciones que utilizan parámetros de cadena. (Para obtener más información sobre esto, consulte a continuación).

10. Guarde su trabajo con frecuencia. Los errores asociados con el uso incorrecto de DLL y Win API pueden provocar una terminación de emergencia del entorno VB y posiblemente de todo el sistema operativo. Debe asegurarse de que el código que escriba se guarde antes de la ejecución de la prueba. Lo más sencillo es configurar el modo para la grabación automática de los módulos del proyecto antes de iniciar el proyecto en el entorno VB.

Después de leer los consejos anteriores, puede pensar que utilizar las funciones de Win API es arriesgado. Hasta cierto punto esto es cierto, pero sólo en comparación con la programación segura que ofrece el propio VB. Pero con su hábil uso y conocimiento de los posibles peligros, este riesgo es mínimo. Además, a menudo es simplemente imposible abandonar por completo el uso de Win API; seguirán siendo necesarios para cualquier desarrollo serio.

Además, anteriormente mencionamos los peligros de una amplia clase de archivos DLL. En el caso de Win API todo es mucho más sencillo, ya que la forma de acceso a estas funciones está claramente unificada. Deben tenerse en cuenta los siguientes puntos principales:

  1. Las funciones de la API de Win32 son solo eso: funciones, es decir, procedimientos del tipo Función (había muchas Subrutinas en la API de Win16). Todas estas son funciones de tipo Long, por lo que sus descripciones están escritas de la siguiente forma: Declarar nombre de función... Como Long 'tipo de función _ se define explícitamente

    Declarar nombre de función y 'tipo de función _ se determina mediante el sufijo

    La llamada a la función API se ve así:

Resultado& = NombreApi& ([ Lista de argumentos]
  1. Muy a menudo, el valor de retorno de una función es el código de finalización de la operación.

    Además, un valor distinto de cero en este caso significa finalización normal, cero significa error. Generalmente (pero no siempre) puede aclarar la naturaleza del error llamando a la función GetLastError. La descripción de esta función se ve así: Declarar función GetLastError& Lib “kernel32” () Cuando se trabaja en VB, es mejor usar la propiedad LastDLLError del objeto Err para obtener el valor del código de error calificado, ya que VB a veces restablece la función GetLastError entre llamar a la API y continuar ejecutando el programa.

    Puede interpretar el código devuelto por GelLastError utilizando constantes escritas en el archivo API32.TXT, con nombres que comienzan con el sufijo ERROR_.

    Los errores más típicos tienen los siguientes códigos:

    • ERROR_INVALID_HANDLE = 6& - identificador no válido
    • ERROR_CALL_NOT_IMPLEMENTED = 120& - llamar a una función en Windows 9x que sólo está disponible para Windows NT
    • ERROR_INVALID_PARAMETER = 87& - valor de parámetro incorrecto

    Sin embargo, muchas funciones devuelven el valor de algún parámetro solicitado (por ejemplo, OpenFile devuelve el valor del identificador del archivo). En tales casos, el error está determinado por algún otro valor especial de Return&, normalmente 0 o –1.

  2. Las API de Win32 utilizan métodos estrictamente fijos para transferir los tipos de datos más simples.

    a) ByVal...Siempre y cuando Al menos el 80% del paso de argumentos se realiza mediante variables largas. Tenga en cuenta que el argumento

    Siempre

    va acompañado de la palabra clave ByVal, y esto, entre otras cosas, significa que se realiza una transferencia de datos unidireccional: desde el programa VB a la función API. Al menos el 80% del paso de argumentos se realiza mediante variables largas. B) ByVal...Como cadena

    Este tipo de transferencia de datos también ocurre con bastante frecuencia, y con el argumento también

    Se aplica ByVal. Cuando se llama a una función API, la dirección de la cadena se escribe en la pila, por lo que en este caso es posible el intercambio de datos bidireccional.

    El segundo problema es que cuando se llama a una función API, la cadena fuente se convierte en alguna representación interna y, al salir de la función, viceversa. Si en la época de Win16 esta operación consistía únicamente en agregar un byte cero al final de la línea, con la llegada de Win32 esto se agregó a la transformación de la codificación Unicode de doble byte a ANSI y viceversa. (Esto se discutió en detalle en el artículo "Características de trabajar con variables de cadena en VB", ComputerPress 10'99 y 01'2000). Por ahora, solo tenga en cuenta que al usar la construcción ByVal... As String, puede intercambiar cadenas solo con datos de caracteres.

    B) ...Como Cualquiera

    Esto significa que alguna dirección del búfer de memoria se enviará a la pila, cuyo contenido será interpretado por la función API, por ejemplo, dependiendo del valor de otros argumentos. Sin embargo, As Any solo se puede usar en la declaración Declare: cuando se llama a una función específica, se debe definir una variable específica como argumento.

    D) ... Como tipo definido por el usuario

    Este diseño también se suele utilizar cuando es necesario intercambiar datos (en general, en ambas direcciones) utilizando alguna estructura. De hecho, esta construcción es una especie de implementación concreta de la forma de transmisión As Any, solo que en este caso la función está configurada en una estructura fija.

    La forma de la estructura de datos está determinada por la función API específica, y es responsabilidad del programador describirla y reservarla correctamente en el programa que la llama. este diseño Al menos el 80% del paso de argumentos se realiza mediante variables largas. usado sin palabras ByVal, es decir, en este caso, se realiza la transferencia por referencia: la dirección de la variable se escribe en la pila.

Ejemplo de llamada a una función API

Ilustremos lo anterior usando el ejemplo del uso de dos funciones útiles para trabajar con archivos: lopen y lread, que se describen a continuación:

Declarar función lopen Lib “kernel32” _ Alias ​​​​“_lopen” (_ ByVal lpFileName As String, _ ByVal wReadWrite As Long) Como largo Declarar función lread Lib “kernel32” _ Alias ​​​​“_lread” (_ ByVal hFile As Long, lpBuffer Como Cualquiera, _ ByVal wBytes Mientras) Mientras tanto

En VB, sus análogos, en este caso exactos, son los operadores Abrir y Obtener (para modo binario). Prestemos atención de inmediato al uso de la palabra clave Alias ​​en una declaración de función; este es exactamente el caso en el que no puede prescindir de ella. Los nombres de funciones reales en la biblioteca comienzan con un guión bajo (estilo típico del lenguaje C), que no está permitido en VB.

La operación de apertura del archivo podría verse así:

Const INVALID_HANDLE_VALUE = -1 ' valor incorrecto del controlador lpFileName$ = “D:\calc.bas” ' nombre de archivo wReadWrite& = 2 ' modo lectura-escritura hFile& = lopen(lpFileName$, wReadWrite&) _ ' define el identificador del archivo Si hFile& = INVALID_HANDLE_VALUE Entonces _ ' error al abrir el archivo ' especifica el código de error CodeError& = Err.LastDllError 'CodeError& = GetLastError _ ' esta construcción no funciona End If

Aquí debes prestar atención a dos puntos:

  • como valor de la función obtenemos el valor del descriptor del archivo. El error corresponde a un valor de –1;
  • Es precisamente en este caso que llamar a la función GetLastError no funciona: para obtener un valor de error refinado, recurrimos al objeto Err (hablamos sobre la posibilidad de tal situación anteriormente).

Luego se puede leer el contenido del archivo, pero esto supone que el programador debe tener algún conocimiento de su estructura (como es el caso cuando se trabaja con archivos binarios arbitrarios). En este caso, llamar a la función lread podría verse así:

Dim MyVar As Single wBytes = lread (hFile&, MyVar, Len(MyVar) ' leyendo un número real, 4 bytes ' wBytes es el número de datos realmente leídos, ' -1 es un error... Escriba MyStruct x As Single i As Tipo de extremo entero Dim MyVar As MyStruct wBytes = lread (hFile&, MyVar, Len(MyVar)) ' leer estructura de datos, 6 bytes

Tenga en cuenta nuevamente: el segundo argumento de la función se pasa por referencia, el resto se pasa por valor.

Dim MyVar As String MyVar = Space$(10) 'reservar una variable para 10 caracteres wBytes = lread (hFile&, ByVal MyVar, Len(MyVar)) 'leer una cadena de caracteres, 10 caracteres

Aquí puede ver una diferencia importante con respecto al ejemplo anterior: la variable de cadena va necesariamente acompañada de la palabra clave ByVal.

La lectura del contenido de un archivo en una matriz (para simplificar, usaremos una matriz de bytes unidimensional) se realiza de la siguiente manera:

Dim MyArray(1 To 10) As Byte wBytes = lread (hFile&, MyArray(1), _ Len(MyArray(1))* 10) 'lee 10 elementos de la matriz

Al especificar el primer elemento de la matriz como argumento, estamos pasando la dirección del comienzo del área de memoria reservada para la matriz. Obviamente, puedes llenar cualquier fragmento de una matriz de esta manera:

WBytes = lread (hFile&, MyArray(4), _ Len(MyArray(1))* 5) 'leer los elementos de la matriz 4 a 8

Consejo 5: utilice alias para Gears y parámetros como cualquier

Aquí, basándonos en el ejemplo anterior, revelaremos la esencia del cuarto consejo de Dan Appleman.

Cuando trabaje con la función lread, debe recordar que al acceder a ella usando una variable de cadena, debe usar la palabra clave ByVal (de lo contrario, recibirá mensajes sobre una operación ilegal). Para protegerse, puede hacer una descripción especial adicional de la misma función para que funcione solo con variables de cadena:

Declarar función lreadString Lib “kernel32” _ Alias ​​​​“_lread” (_ ByVal hFile As Long, ByVal lpBuffer As String, _ ByVal wBytes As Long) As Long

Al trabajar con esta descripción, ya no es necesario especificar ByVal al contactar:

WBytes = lreadString(hFile&, MyVarString, _ Len(MyVarString)) '

Parecería que la sintaxis del operador Declare le permite hacer una descripción especial similar para una matriz:

Declarar función lreadString Lib “kernel32” Alias ​​​​“_lread” (_ ByVal hFile As Long, lpBuffer() As Byte, _ ByVal wBytes As Long) As Long

Sin embargo, el recurso

WBytes = lreadArray(hFile&, MyArray(), 10)

conduce inevitablemente a un error fatal del programa.

Esta es una continuación de la conversación sobre las peculiaridades del procesamiento de variables de cadena en Visual Basic: VB usa codificación Unicode de doble byte, Win API usa ANSI de un solo byte (y con el formato adoptado en C, con un byte cero al final) . En consecuencia, cuando se utilizan variables de cadena como argumento, la conversión de Unicode a ANSI siempre se realiza automáticamente al llamar a una función API (más precisamente, una función DLL) y la conversión inversa al regresar.

La conclusión de esto es simple: las variables de cadena se pueden usar para intercambiar datos de caracteres, pero no se pueden usar para intercambiar información binaria arbitraria (como era el caso con las versiones de VB de 16 bits). En el último caso, es mejor utilizar una matriz de bytes unidimensional.

Como sabes, el tipo String se puede utilizar para describir una estructura personalizada. En este sentido, es necesario recordar lo siguiente:

  • Está estrictamente prohibido utilizar la siguiente construcción para acceder a Win API: Escriba MyStruct x As Single s As String 'cadena de longitud variable Tipo final

    En el caso de una cadena de longitud variable, se pasa un descriptor de cadena como parte de la estructura con todas las consecuencias consiguientes en forma de error de ejecución del programa.

  • Puede utilizar una cadena de longitud fija como elemento de estructura: Escriba MyStruct x As Single s As String*8 ‘cadena de longitud fija Tipo final

En este caso, se realiza la conversión de codificación correspondiente.

Y una última nota: bajo ninguna circunstancia debe utilizar una matriz de variables de cadena (tanto de longitud fija como variable) al acceder a una función API.

De lo contrario, se garantizará el surgimiento de una “operación ilegal”.

Es probable que se encuentre en una situación en la que necesite escribir sus propias funciones DLL. La necesidad de esto surgirá inevitablemente si utiliza tecnología de programación mixta, utilizando dos o más lenguajes de programación para implementar una aplicación.

En este sentido, observamos que la programación mixta es bastante común para implementar una aplicación bastante compleja. De hecho, cada lenguaje (más precisamente, un sistema de programación basado en un lenguaje) tiene sus propias fortalezas y debilidades, por lo que es bastante lógico aprovechar diferentes herramientas para resolver diferentes problemas. Por ejemplo, VB - para crear una interfaz de usuario, C - para un acceso eficiente a los recursos del sistema, Fortran - para implementar algoritmos numéricos.

La opinión del autor es la siguiente: cualquier programación seria requiere que el desarrollador domine al menos dos herramientas. Por supuesto, en las condiciones modernas de una clara división del trabajo es muy difícil ser un excelente experto incluso en dos sistemas, por lo que el esquema de "idiomas principales y auxiliares" es más lógico. La idea aquí es que incluso un conocimiento superficial del lenguaje “auxiliar” (escribir procedimientos bastante simples) puede mejorar en gran medida la eficiencia del uso del lenguaje “principal”. Tenga en cuenta que el conocimiento de VB, al menos como auxiliar, es hoy en día casi un requisito obligatorio para un programador profesional. Por cierto, en la época de DOS, el conocimiento de los conceptos básicos de Assembler era extremadamente deseable para cualquier programador, incluido el Basic.

De una forma u otra, incluso en el trabajo en grupo, cuando cada programador realiza su tarea específica, todos los participantes del proyecto deben tener una idea de las características de la interfaz de procedimiento en diferentes idiomas. Y sepa que muchos sistemas de programación (incluido VB), además de la interfaz predeterminada, permiten utilizar otros métodos avanzados de acceso a procedimientos que permiten adaptar la interfaz a otro idioma.

  • Diferentes idiomas pueden utilizar diferentes convenciones para escribir identificadores. Por ejemplo, es común utilizar un guión bajo al principio del nombre de un procedimiento, lo cual no está permitido en VB. Este problema se resuelve fácilmente utilizando la palabra clave Alias ​​en la declaración Declare (consulte el consejo de ejemplo 2.3).
  • Se puede utilizar una secuencia diferente de escritura de argumentos pasados ​​en la pila. Por ejemplo, en la época de DOS (lo admito sinceramente, no sé cómo se ve ahora en el entorno Windows), C escribía argumentos desde el final de la lista, otros lenguajes (Fortran, Pascal, Basic) - desde el principio.
  • De forma predeterminada, se utilizan diferentes principios para pasar parámetros: por referencia o por valor.
  • Varios principios para almacenar variables de cadena. Por ejemplo, en C (así como en Fortran y Pascal), la longitud de una cadena está determinada por el byte nulo al final de la misma, pero en Basic la longitud está escrita explícitamente en el descriptor de cadena. Por supuesto, hay que tener en cuenta la posibilidad de utilizar diferentes codificaciones de caracteres.
  • Al transferir matrices multidimensionales, debe recordarse que son posibles varias opciones para convertir estructuras multidimensionales en unidimensionales (a partir del primer índice o del último, en relación con matrices bidimensionales: "por filas" o "por columnas" ).

Teniendo todo esto en cuenta, se pueden formular las siguientes recomendaciones:

  • Utilice los métodos más simples y probados para pasar argumentos a funciones DLL.
  • Los estándares adoptados para Win API son bastante adecuados como modelo.
  • Nunca pase matrices de variables de cadena.
  • Tenga mucho cuidado al pasar variables de cadena simples y matrices multidimensionales.

Pero, ¿qué pasa si la función DLL ya está escrita, por ejemplo, en Fortran, pero su interfaz de entrada no se ajusta muy bien a los estándares VB anteriores? Aquí hay dos consejos. Primero: escriba una función DLL de prueba y úsela para intentar encontrar la llamada deseada del programa VB mediante prueba y error. Segundo: escribir un procedimiento de adaptador en el mismo Fortran que proporcione una interfaz simple entre VB y una función DLL con la conversión de estructuras de datos simples en estructuras complejas (por ejemplo, convertir una matriz de bytes multidimensional en una matriz de cadenas).

Entonces: use funciones DLL. Pero mantente alerta...

ComputadoraPrensa 9"2000

Trabajar con API puede resultar a la vez gratificante y frustrante. Por un lado, al interactuar con otras aplicaciones, puede aumentar considerablemente el alcance de la audiencia y el efecto "sorpresa" de su aplicación. Por otro lado, esto implica leer toneladas de documentación, estudiar estrategias de autenticación y analizar mensajes de error no informativos (o incluso faltantes).

En primer lugar, si aún no comprendes completamente qué es una API (Interfaz de programación de aplicaciones), lee la explicación de Skillcrush y luego la primera parte de este artículo para ponerte al día.

"API" es un concepto increíblemente amplio: cada vez que su aplicación "habla" con otra aplicación, lo hace a través de algún tipo de API. Los componentes dentro de su propia aplicación, al igual que diferentes partes de Rails, también se comunican entre sí a través de API. Son subaplicaciones más o menos independientes que proporcionan los datos que cada una de ellas necesita para realizar sus propias tareas específicas. ¡En el mundo de las aplicaciones, todo es una API!

Cuando crea aplicaciones con una funcionalidad de front-end más dinámica (tanto aplicaciones Javascript de una sola página como aplicaciones simples con llamadas AJAX individuales), se comunicarán con el backend de Rails a través de su propia API, que en realidad es solo una o dos líneas adicionales de código. , indicando a sus controladores cómo servir JSON o XML en lugar de HTML.

En este tutorial aprenderá cómo crear su propia API. En lecciones posteriores cubriremos cómo interactuar con las API de otras aplicaciones. Las lecciones deberían ser un buen trampolín para aprender sobre este tema, pero es poco probable que cubran completamente todos los casos. Una gran parte de trabajar con API es saber leer su documentación y descubrir qué quieren de usted.

Puntos a considerar

Revise las preguntas y vea si conoce las respuestas. Ponte a prueba nuevamente después de completar la tarea.

  • Cómo entiende Rails qué tipo de archivo espera como respuesta cuando envía una solicitud HTTP.
  • ¿Cuál es el propósito del método #respond_to?
  • ¿Cómo se devuelve un objeto Usuario mientras se especifican los atributos que no desea incluir en ese objeto (es decir, no puede simplemente devolver Usuario.primero)?
  • Nombra los 2 pasos detrás de escena del método #to_json.
  • ¿Cómo se le dice a una acción del controlador que solo muestre un mensaje de error?
  • ¿Cómo crear tu propio mensaje de error?
  • ¿Por qué no puede utilizar métodos de autenticación de controlador basados ​​en sesiones si desea permitir conexiones programáticas a su API?
  • ¿Qué es la "Arquitectura Orientada a Servicios"?

Conceptos básicos de API

Su aplicación Rails en realidad ya es una API, aunque es posible que no la considere una API. El navegador web que inician sus usuarios también es un programa, por lo que en realidad realiza una solicitud API a su aplicación Rails cuando el usuario abre una nueva página. Tendemos a pensar de esta manera porque representar plantillas HTML es una tarea tan común que simplemente incorporamos esta funcionalidad en nuestros programas de servidor como un tipo de respuesta estándar y consideramos todo lo demás como algo inusual.

Sin embargo, a menudo querrás realizar una solicitud que no requiera pasar por todos los dolores de cabeza que supone utilizar un navegador. Puede que no te importe la estructura de la página (HTML), pero a cambio quieres datos limpios. Supongamos que desea obtener una lista de todos los usuarios. Puede solicitar algo como http://yourapplication.com/users, que seguramente activará la acción #index y mostrará una lista de todos los usuarios de la aplicación.

Pero ¿por qué molestarse con toda esta información adicional si lo único que desea es una lista de usuarios? La opción más sencilla sería enviar una solicitud a la misma URL y esperar a cambio una respuesta JSON o XML. Si configura su controlador Rails correctamente, obtendrá un objeto de matriz JSON simple que contiene todos los usuarios. ¡Maravilloso!

El mismo principio se aplica cuando te comunicas con una API externa. Supongamos que desea obtener los tweets recientes de un usuario de Twitter. Todo lo que necesita hacer es decirle a su aplicación Rails cómo interactuar con la API de Twitter (es decir, autenticarse), enviar la solicitud y procesar el conjunto de "tweets" que se devolverán.

Creando una API

Es posible que desee hacer que su aplicación Rails sea una API de backend pura para páginas web de frontend, o simplemente desee aprender cómo enviar JSON cuando el frontend lo solicite. Esta sección no cubrirá cómo crear API RESTful completas con funciones de autenticación. Esta es una introducción sencilla al tratamiento de su aplicación como una API.

Lo esencial

Si desea que su aplicación Rails devuelva JSON en lugar de HTML, deberá indicarle a su controlador que lo haga. Lo bueno es que la misma acción del controlador puede devolver diferentes tipos dependiendo de si su usuario realiza una solicitud regular desde el navegador o accede a la API a través de la línea de comando. Esto determina qué tipo de solicitud se realizó según la extensión del archivo solicitado, como ejemplo.xml o ejemplo.json.

Puedes comprobar lo que Rails piensa sobre el tipo de archivo que esperas consultando el registro del servidor:

Comenzó GET "/posts/new" para 127.0.0.1 el 2013-12-02 15:21:08 -0800 Procesamiento por PostsController#new como HTML

La primera línea le indica qué URL se solicitó y la segunda le indica dónde se envió y cómo Rails la procesa. Si usaras la extensión .json, se vería así:

Se inició GET "/posts.json" para 127.0.0.1 el 4 de diciembre de 2013 a las 12:02:01 -0800 Procesamiento por PostsController#index como JSON

Si tiene una aplicación de prueba en ejecución, intente solicitar URL diferentes. Si su controlador no puede manejarlos, es posible que obtenga un error, pero aún así debería poder ver qué entiende Rails que son sus solicitudes.

Representar JSON o XML

Una vez que decida que desea responder a las solicitudes utilizando JSON o XML, deberá indicarle a su controlador que represente JSON o XML en lugar de HTML. Una forma de hacerlo es utilizar el método #respond_to:

Usuarios de claseControlador< ApplicationController def index @users = User.all respond_to do |format| format.html # index.html.erb format.xml { render xml: @users } format.json { render json: @users } end end end

En este caso, #respond_to pasa un objeto de formato al bloque, al que puedes adjuntar la llamada de renderización correspondiente. Si no hace nada, el html se representará utilizando la plantilla Rails estándar (en este ejemplo app/views/index.html.erb).

La función #render es lo suficientemente inteligente como para entender cómo renderizar una amplia gama de formatos. Cuando le pasas la clave:json, llamará a #to_json en el valor, en este ejemplo @users. Esto convertirá sus objetos Ruby en cadenas JSON que se pasarán a la aplicación solicitante.

De esta manera obtienes tu API. Por supuesto, crear una API puede ser un poco más complejo si quieres hacer algunas cosas sofisticadas, pero todo se ciñe a lo básico.

Especificación de atributos devueltos

Supongamos que desea asegurarse de no devolver la dirección de correo electrónico del usuario junto con el objeto Usuario. En este caso, querrás cambiar los atributos que se devolverán, modificando lo que hace el método #to_json.

Anteriormente, simplemente habría anulado el método #to_json con su versión, pero ahora no será necesario; de hecho, anulará el método #as_json. El método #as_json se utiliza en el método #to_json, por lo que su modificación cambia implícitamente el resultado de #to_json, pero de una forma bastante específica.

#to_json hace 2 cosas: ejecuta #as_json y obtiene un hash de los atributos que se representarán en JSON. Luego se procesa en JSON usando ActiveSupport::json.encode. Entonces, al modificar #as_json, estás siendo más específico sobre la parte del método #to_json que realmente deseas cambiar.

En nuestro caso, hacemos esto modificando #as_json en nuestro modelo para devolver solo los atributos que necesitamos:

# app/models/user.rb clase Usuario< ActiveRecord::Base # Вариант 1: Полное переопределение метода #as_json def as_json(options={}) { :name =>self.name ) # NO incluya el campo de correo electrónico end # Opción 2: use el método estándar #as_json def as_json(options=()) super(only: [:name]) end end

Luego, nuestro controlador solo necesitará representar el JSON como de costumbre (en el siguiente ejemplo, siempre se devolverá JSON, independientemente de si se envió una solicitud HTML o no):

# app/controllers/users_controller.rb clase UsersController< ApplicationController def index render json: User.all end end

Tenga en cuenta que no necesita llamar a #to_json usted mismo cuando usa #render; lo hará por usted.

A veces, Heroku puede requerir pasos adicionales para mostrar correctamente las páginas de error. Échale un vistazo. Es posible que primero deba eliminar las páginas estáticas del directorio aplicación/público.

Garantizar la seguridad desde el exterior

Supongamos que desea permitir el acceso a la API solo si el usuario ha iniciado sesión. Su autenticación existente en el controlador ya hace este trabajo; solo asegúrese de tener configurado el #before_action correcto (por ejemplo, before_action:require_login). Es posible que necesite una funcionalidad en la que tanto los usuarios que han iniciado sesión como los que no han iniciado sesión puedan ver la página, pero cada uno debería ver datos diferentes. No desea que los usuarios no autenticados puedan realizar llamadas API para obtener datos confidenciales. Del mismo modo, no desea permitir que usuarios no autorizados visiten determinadas páginas HTML.

Si desea procesar solicitudes de una aplicación que no es un navegador (por ejemplo, desde la línea de comandos), no puede confiar en las "cookies" del navegador para la autenticación. Es por eso que la mayoría de las API utilizan tokens nativos como parte del proceso de autenticación. Hablaremos un poco más sobre tokens en la próxima lección.

Próximos pasos

Ahora tiene las habilidades para usar su aplicación Rails para representar no solo HTML, sino también cualquier otro formato. Si desea ir más allá y permitir que otros desarrolladores creen cosas usando su plataforma (por ejemplo, para que puedan realizar solicitudes programáticas en lugar de autenticarse como usuario), necesitará hacer que su sistema API sea mucho más sólido. No lo cubriremos todo aquí, pero consulte lo siguiente:

  • El artículo Construyendo API de Awesome Rails describe muchos de los mejores enfoques para pasar de una aplicación de juguete a estándares API industriales.

Arquitectura orientada a servicios

Es hora de introducir un enfoque arquitectónico llamado Arquitectura Orientada a Servicios (SOA). La idea básica es que su aplicación conste de muchos servicios, como un sistema de pago, registro de usuario, módulo de recomendación, etc. En lugar de construirlo todo dentro de una aplicación principal, se dividen los subsistemas en partes completamente independientes que se comunican entre sí mediante API internas.

Esto es bueno por muchas razones. Debido a que a cada parte de su aplicación no le importa cómo funcionan otras partes y solo sabe cómo solicitar datos a través de su API, puede realizar cambios significativos en el código de servicio y el resto de la aplicación funcionará como antes. Puede reemplazar completamente un servicio por otro y, siempre que se comunique utilizando los mismos métodos API, funcionará sin problemas. Puede utilizar API externas como parte de su aplicación (por ejemplo, sistemas de pago) en lugar de escribir las suyas propias. Puede crear una aplicación PHP que se comunique con una aplicación Python que se comunique con una aplicación Rails, y todo funcionará porque se comunican entre sí mediante una API.

Generalmente es una buena idea intentar que cada parte de su aplicación sea lo más independiente posible. El concepto de SOA le obliga a pensar en términos de qué métodos desea exponer a otras partes de su aplicación y también mejorará su código. Además, al asumir que cada componente principal de su aplicación es independiente, también podrá aislar los problemas mucho más fácilmente y manejar los errores de una manera más significativa.

Usar una arquitectura orientada a servicios para una aplicación completa es como dividir un script Ruby gigante y complejo en clases y métodos ordenados, solo que a mayor escala.

Uno de los casos más famosos de transición a una arquitectura orientada a servicios es Amazon.com. Un día de 2002, Jeff Bezos afirmó sin rodeos que todos los grupos de trabajo deben pasar a SOA o ser despedidos. Notorio publicación de blog Un empleado de Google, destinado a fines internos pero que se hizo público accidentalmente, habló sobre el poder de Amazon usando SOA. Es una lectura excelente, así que asegúrese de leerla, pero los puntos principales de la carta de Bezos se resumen en las siguientes citas de la publicación:

1) Todos los equipos ahora proporcionan sus datos y funcionalidades a través de interfaces de servicio.

2) Los equipos deben comunicarse entre sí a través de estas interfaces.

3) Se prohíben otras formas de comunicación entre procesos: ni enlaces directos, ni lectura directa de los datos de otro comando, ni modelos de memoria compartida, ni puertas traseras, etc. La única forma permitida de interacción es acceder a la interfaz del servicio a través de la red.

4) No importa qué tecnología utilicen. HTTP, Corba, Pubsub, protocolos propietarios: no hay diferencia. A Bezos no le importa.

5) Todas las interfaces de servicio, sin excepción, deben diseñarse inicialmente con la capacidad de ser controladas externamente. Es decir, el equipo debe planificar y diseñar para poder brindar la interfaz a desarrolladores externos a la empresa. Sin excepciones.

6) Quien ignore estos requisitos será despedido.

SOA es un asunto serio. Claro, surgen muchos problemas al usarlo (consulte esta publicación sobre las "lecciones aprendidas" de Amazon), pero tiene una cantidad increíble de beneficios.

Probablemente no se preocupe demasiado por SOA mientras crea aplicaciones de juguete para usted mismo, pero definitivamente es un problema que surgirá cuando comience a trabajar para una empresa de TI, por lo que familiarizarse con él es una buena práctica.

tu objetivo

  1. Lea la Sección 7 de la Guía de controladores Rails para aprender a renderizar JSON y XML.
  2. No es necesario verlos (porque van un poco más allá de lo que estamos preparados actualmente), pero si está interesado, eche un vistazo a Railscasts en la sección Recursos adicionales al final de la lección para obtener más información sobre Beneficios de la API.

Conclusión

Trabajaremos más de cerca con su aplicación como API durante el curso de Javascript. En este curso, creará varias aplicaciones de pila completa que utilizan llamadas AJAX para una mejor experiencia de usuario, lo que esencialmente implica representar datos XML o JSON en lugar de una página HTML completa. Luego, creará varias aplicaciones Javascript de una sola página que se basan en la API proporcionada por su aplicación Rails para recuperar todos los datos necesarios de la base de datos, pero que, por lo demás, se ejecutan en el lado del cliente (en el navegador).

La mejor manera de entender una API es crearla e interactuar con ella, que es en lo que nos centraremos en nuestros proyectos.

Es hora de hablar de un concepto como Funciones API en lenguaje Visual Basic. ¿Por qué son importantes estas funciones en Visual Basic? Averigüemos, en primer lugar, cuando comience a programar en Visual Basic, comprenderá inmediatamente que con estas funciones puede escribir programas muy serios y, en segundo lugar, sin usar las funciones API, simplemente no puede hacer mucho, por ejemplo, casi todo lo relacionado con el uso. el sistema operativo Windows ( por ejemplo: averigüe el nombre de usuario, el espacio en el disco duro, etc.).

Pero para poder empezar a poner en práctica estas funciones es necesario saber cuáles son, hablemos de eso primero.

Teoría sobre las funciones API de Visual Basic

API es una abreviatura de Interfaz de programación de aplicaciones ( interfaz de programación de aplicaciones). En otras palabras, una API es un conjunto de funciones que el propio sistema operativo proporciona al programador para que las utilice en sus programas. Con la API, los programadores pueden poner en práctica fácilmente sus ideas.

Se pueden llamar funciones API desde Visual Basic para realizar tareas para las cuales el código estándar de Visual Basic no es suficiente. Por ejemplo, las herramientas estándar de Visual Basic no le permiten apagar su computadora ni reiniciarla. Sin embargo, todo esto se puede hacer fácilmente llamando a la función API adecuada.

Casi todas las funciones que se encuentran en Windows se encuentran dentro de archivos DLL ( Biblioteca de enlaces dinámicos). Todos los archivos dll se encuentran en la carpeta del sistema de Windows. Hay más de 1000 funciones API, que se dividen en cuatro categorías principales.

  • Trabajar con aplicaciones: iniciar y cerrar aplicaciones, procesar comandos de menú, mover y cambiar el tamaño de ventanas;
  • Gráficos: creación de imágenes;
  • Información del sistema: identificación del disco actual, tamaño de la memoria, nombre de usuario actual, etc.;
  • Trabajar con el registro: manipulación del registro de Windows.

Uso de funciones API en la práctica

Pasemos ahora al uso de estas funciones en la práctica. Las funciones API llamadas en Visual Basic primero deben declararse. La declaración especifica el nombre de la DLL y la función, así como información sobre el número y tipo de argumentos.

Los procedimientos DLL se declaran con el comando Declarar en la sección Declaraciones generales de un módulo de formulario o un módulo estándar:

Declarar nombre de función Lib "biblioteca" [([ _ variable [,ByVal,] variable ]...])] como tipo

Los procedimientos DLL que se encuentran en los módulos estándar son públicos de forma predeterminada y se pueden llamar desde cualquier lugar de la aplicación. Los procedimientos declarados en un módulo de formulario son privados y deben ir precedidos por la palabra clave Privado.

La sección Lib le indica dónde buscar el archivo DLL que contiene la función. Cuando se hace referencia a las bibliotecas principales de Windows (user32.dll, kernel32.dll, gdi.dll), no es necesario incluir la extensión.

Si no se especifica la ruta del archivo, la exploración del directorio comienza en la siguiente secuencia

  1. El directorio que contiene el archivo EXE del programa;
  2. Directorio actual;
  3. Directorio del sistema de Windows;
  4. Directorio de Windows;
  5. Variable de entorno de ruta.

Aquí hay una pequeña lista de archivos DLL estándar de Windows:

  • advapi.dll: protección NT, registro y otros servicios avanzados;
  • comdlg.dll: cuadros de diálogo estándar;
  • gdi.dll: interfaz del dispositivo gráfico;
  • kernel32.dll: memoria, discos, procesos, recursos;
  • mpr.dll - redes;
  • netapi32.dll - biblioteca API de red;
  • shell32.dll: shell de Windows, arrastrar y soltar, selección de iconos;
  • user32.dll - interfaz de usuario - ventanas, menús, líneas, mensajes;
  • version.dll - control de versiones;
  • winmm.dll: multimedia, sonido, joysticks, temporizadores;
  • winspoll.dll: administrador de impresión.

La mayoría de los procedimientos de DLL están documentados utilizando la notación del lenguaje de programación C y C++. Para convertir con éxito una función API en un comando Declarar, debe comprender el mecanismo de paso de argumentos. Normalmente los argumentos se pasan por valor. En este caso, la palabra clave ByVal se coloca antes del nombre del argumento. Si el argumento se pasa por referencia, se establece ByRef.

Aquí está la lista más pequeña de funciones que se utilizan en Visual Basic:

  • BitBlt: copia una imagen de un HDC a otro;
  • FindWindow: busca el identificador de una ventana con el título especificado;
  • GetCursorPos: devuelve la posición actual del cursor del mouse (globalmente);
  • GetDriveType: devuelve el tipo de unidad;
  • GetForegroundWindow: devuelve el identificador de la ventana activa;
  • SetCursorPos: establece una nueva posición del cursor del mouse;
  • SetVolumeLabel: cambia la etiqueta del disco;
  • SetWindowPos: establece la posición de una ventana con un determinado identificador (también puede usar esta función para colocar la ventana ARRIBA de todas las demás);
  • ShellExecute: inicia la aplicación asociada con la extensión que tiene el archivo especificado (también puede simplemente iniciar la aplicación especificada);
  • ShowCursor: oculta o muestra el cursor del mouse en la pantalla.

Ejemplos de trabajo con el registro.

Además, al programar en Visual Basic y en otros lenguajes, surge el problema cuando necesitas usar el registro de Windows, pero usando funciones de API esto es fácil de hacer, por ejemplo:

Para leer un parámetro de cadena use la función GetRegString

Ejemplo:

Prueba tenue Como prueba de cadena = GetRegString(HKEY_LOCAL_MACHINE, _ "Software\Microsoft\DirectX", "Versión") Form1.Caption = prueba

Para leer un parámetro DWORD GetRegDWord

Ejemplo:

Prueba tenue Como prueba larga = GetRegDWord(HKEY_LOCAL_MACHINE, _ "Software\Microsoft\Internet Explorer\AboutURLs", "Home") Form1.Caption = prueba

Para escribir un parámetro de cadena, use SetRegString

Ejemplo:

SetRegString HKEY_LOCAL_MACHINE, _ "Software\prueba", "MiPrograma", "Opciones"

Si la clave o parámetro no ha sido creado, entonces se creará; si la clave o parámetro ya existe, entonces los nuevos valores se escribirán sobre los antiguos.

Para escribir un parámetro de tipo DWORD, utilice SetRegDWord

Ejemplo:

SetRegDWord HKEY_LOCAL_MACHINE, _ "Software\prueba", "MiPrograma", "555"

Para eliminar una clave del registro, utilice la función DeleteRegKey

Ejemplo:

DeleteRegKey HKEY_LOCAL_MACHINE, "Software", "prueba", Verdadero

Segundo parámetro: clave principal
El tercer parámetro es Verdadero (si se requiere confirmación para la eliminación) o Falso (si no se requiere confirmación).

Para eliminar un valor del registro, utilice la función DeleteRegValue

Ejemplo:

DeleteRegValue HKEY_LOCAL_MACHINE,_ "Software\Microsoft\Internet Explorer\AboutURLs", "mozilla", Falso

De hecho, las posibilidades de las funciones API en el sistema operativo Windows son casi ilimitadas. Terminemos de ver esta característica de Visual Basic y finalmente escribamos un pequeño programa usando funciones API.

Este programa simplemente muestra un mensaje en pantalla, pega el siguiente código:

Función de declaración privada BeginPath Lib "gdi32" (ByVal hdc mientras) Función de declaración privada EndPath Lib "gdi32" (ByVal hdc mientras) Función de declaración privada PathToRegion Lib "gdi32" (ByVal hdc mientras) Mientras declara privada Función SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Private Sub Form_Load() Const TEXT = "Usaste la API" Dim hRgn As Long Font.Name = "Times New Roman " Font.Bold = True Font.Size = 60 Ancho = TextWidth(TEXTO) Alto = TextHeight(TEXTO) BeginPath hdc Imprimir TEXTO EndPath hdc hRgn = PathToRegion(hdc) SetWindowRgn hWnd, hRgn, False Move (Pantalla.Ancho - Ancho) / 2, (Altura.Pantalla - Altura) / 2 Sub final

Aquí utilizamos 4 funciones (BeginPath, EndPath, PathToRegion, SetWindowRgn), que se encuentran en dos bibliotecas dll (gdi32, user32).

¡Eso es todo por ahora!

Qué semejante API?

API es la abreviatura de Interfaz de programación de aplicaciones. En general, cada programa, sistema operativo, etc. tiene su propia API. La API de Windows consta de una serie de funciones que le permiten utilizar construcciones del sistema Windows. Todas las funciones API de Windows se escribieron en C++, pero sus programas pueden usarlas fácilmente desde Visual Basic. Las funciones API deben declararse. La declaración de funciones API tiene la siguiente sintaxis:

Declarar nombre de función Lib "libname" [()]

La palabra clave Lib especifica en qué biblioteca Visual Basic puede encontrar la función requerida. Esto se refiere a bibliotecas de vínculos dinámicos (*.dll). Pero no es necesario especificar la extensión en aliasname. Alias ​​especifica bajo qué nombre el programa debe buscar una función determinada en la biblioteca. Arglist son los parámetros pasados. La API de Windows permite dos cosas: realizar determinadas tareas y acceder a los recursos del sistema. Puede ver una lista de varias funciones API y sus declaraciones utilizando el programa API Viewer estándar.

Nota: Si una función API espera una variable de usted, debe declararla y llenarla con espacios. Aquellos. la variable debe ser definida por el usuario. Estas son características del lenguaje C++, en el que se escribió la API de Windows.

Veamos un par de ejemplos:

Digamos que su aplicación necesita determinar el directorio donde está instalado el sistema operativo Windows 95/98/NT. La forma más sencilla de hacerlo es utilizar la función API GetWindowsDirectory.

1. En el módulo declaramos la función API GetWindowsDirectory:

Declarar función GetWindowsDirectory Lib "kernel32" Alias ​​​​_

"GetWindowsDirectoryA" (ByVal lpBuffer como cadena, ByVal_

nTamaño Mientras) Mientras Largo

2. En el módulo declaramos una variable, por ejemplo, WinDir, a la que se le debe asignar el nombre del directorio.

WinDir público como cadena

3. Ingrese a la subrutina:

Ya hemos declarado la variable que se debe pasar a la API y ahora la llenamos de espacios.

Debe haber aproximadamente tantos espacios como caracteres debería tener la variable.

En este caso, 20 serán suficientes, porque... Windows normalmente se instala en C:\Windows o C:\Win95, etc. Aquellos. lo más probable es que la suma de caracteres no supere los 20

WinDir = Espacio(20)

Depurar.Imprimir izquierda (WinDir, GetWindowsDirectory (WinDir, 20))

Porque Una API es una función, por lo que debe devolver algún valor. En este caso, la función GetWindowsDirectory devuelve la longitud del valor buscado. Aquellos. si, por ejemplo, el valor deseado es C:\WINDOWS, entonces la función devolverá el valor 10.

"La variable tiene una longitud de 20. Estos 10 caracteres se escriben primero y luego hay 10 espacios. ¿Por qué necesitamos 10 caracteres adicionales? Después de todo, esto es usar memoria innecesaria...

Por lo tanto, con la instrucción Left extraemos de la variable WinDir exactamente tantos primeros caracteres como generalmente se necesitan...

Segundo ejemplo:

Por ejemplo, su programa debe determinar cuál de sus medios es CD-ROM o remoto, etc. El kit de herramientas "nativo" de Visual Basica no le permite hacer esto; debe recurrir al uso de una función API.

1. En el módulo declaramos la función API GetDriveType:

Declarar función GetDriveType Lib "kernel32" Alias ​​​​_

"GetDriveTypeA" (ByVal nDrive como cadena) siempre y cuando

El parámetro nDrive significa una letra del alfabeto latino más dos puntos, es decir nombre de unidad potencial, como C:

2. Ingrese a la subrutina:

Aquí el bucle For...Next “desliza” en la función GetDriveType todas las letras del alfabeto latino por turno. La función Chr convierte los valores de la tabla ASCII (0 a 255) en letras. Entonces 65 es la letra A y 90 es Z.

Atenuar myDrive como entero

Para myDrive = 65 a 90

Debug.Print Chr(myDrive) & ":" & " - " & GetDriveType(Chr(myDrive) & ":")

Esto es lo que nos devolverá la función GetDriveType, por ejemplo, para mí:

Todas las demás letras están marcadas con el número 1. Sí, para comprender estas designaciones es necesario conocer la siguiente tabla:

Nombre constante: Valor:

DRIVE_UNKNOWN 0
DRIVE_NO_ROOT_DIR 1
DRIVE_REMOVEABLE 2
DRIVE_FIXED 3
DRIVE_REMOTE 4
UNIDAD_CDROM 5
DRIVE_RAMDISK 6

La subrutina principal del módulo es como Form_Load en el formulario, es decir se considera el principal y se carga por defecto.

El propósito de muchas funciones API se puede adivinar fácilmente por sus nombres. Por ejemplo, GetWindowsDirectory (obtiene el directorio de Windows) o GetDriveType (obtiene el tipo de medio).

Hemos publicado un nuevo libro, Marketing de contenidos en redes sociales: cómo entrar en la cabeza de sus seguidores y hacer que se enamoren de su marca.

Suscribir

Una API es una interfaz externa para programar una aplicación, acceder a sitios utilizando un protocolo específico para obtener información y desarrollar de forma simplificada programas asociados a servicios internos.

¿Qué significa API?

La analogía más sencilla para utilizar una API sería utilizar una calculadora para realizar cálculos complejos. Digamos que tienes una tarea, puedes comprender su esencia, construir ecuaciones y gráficas, pero no sabes realizar operaciones aritméticas con números. Hay una calculadora a tu lado que puede realizar estas operaciones con facilidad. No sabes lo que sucede dentro de la computadora y no necesitas saberlo. Usted proporciona información de una forma y la recibe de otra, necesaria para sus propósitos.

Cualquier API funciona según este principio. No le importa cómo obtiene el programa la respuesta, qué camino toma la solicitud dentro de él, cómo se realizan los cálculos. De una sola cosa está seguro: en respuesta, se le dará información estandarizada sobre el éxito de la operación o su error.

La interfaz API le permite no perder tiempo, dinero y esfuerzo comprando una "bicicleta nueva". Obtiene un puerto de información funcional que recibe y envía las cantidades necesarias de datos para los fines de su desarrollo.

Ventajas:

  • Ahorro en el desarrollo de su propia interfaz.
  • No es necesario comprender los matices del problema.
  • Las API son desarrolladas por profesionales y tienen en cuenta todos los factores de los procesos internos que quizás no conozca al crear su solución.
  • Le permite comunicarse con servicios que están cerrados a través de otros protocolos.

Contras:

  • Si el servicio de destino se actualiza, la API no siempre recibe inmediatamente la funcionalidad completa.
  • No puedes detectar errores y no sabes cómo funciona el proceso en el código de otra persona.
  • La API no siempre da el resultado más optimizado en términos de tiempo, ya que está diseñada para manejar casos generales, no específicos.

Ejemplos de API

La integración API es el proceso de conectar una aplicación a una interfaz de datos externa. Trabajar con la API comienza con el estudio de la documentación y los protocolos utilizados y luego integrando directamente su programa en la interfaz. Veamos los servicios más populares que tienen su propia API.

VKAPI

Interfaz externa para la interacción de la popular red social VKontakte con clientes, así como con aplicaciones de navegador y servidor. Le permite administrar mensajes de la comunidad, portadas de grupos, páginas de usuario si tiene las claves de acceso adecuadas.

Todas las solicitudes se realizan a la dirección. https://api.vk.com/method/

Después de la barra diagonal viene el nombre del método API utilizado y se transmiten los parámetros GET de la solicitud. La respuesta también llega vía HTTPS en formato JSON.

API DE BOT DE TELEGRAM

Una de las API más populares. Se utiliza para controlar bots en Telegram Messenger. Después de crear un bot a través de @botfather y obtener las claves de acceso necesarias, puede comenzar a interactuar con el backend.

Las solicitudes se pueden realizar a: https://api.telegram.org/bot0000000:token/

Donde en lugar de bot0000000 se coloca el identificador único de su bot y token expresa la clave secreta.

Las solicitudes se envían a través de conexiones HTTPS, el nombre del método se indica con una barra diagonal a la dirección principal. La respuesta viene en formato JSON.

API DE MAPA DEL TIEMPO ABIERTO

A menudo es necesario obtener información meteorológica sin utilizar widgets de terceros ni aplicaciones de pago. El servicio OpenWeatherMap viene al rescate con una API abierta y gratuita. Después de registrarse y recibir datos de identificación, puede enviar solicitudes meteorológicas desde scripts de servidores de todo el mundo. En respuesta al ID de la ciudad, el recurso devuelve la información más detallada sobre el clima actual y ofrece un pronóstico para el futuro cercano.

Formato: Transmisión HTTP vía api.openweathermap.org/data/2.5/weather?id= indicando el número de identificación de la ciudad deseada. Respuesta del servidor: JSON.

API DE MAPAS DE GOOGLE

¿Qué podría ser mejor que un mapa mundial interactivo en un sitio web? Especialmente si no se trata de una plantilla de Google Maps, sino de su edición personal de un mapa popular con grupos de marcadores personales. El mapa interactuará con otros scripts del sitio, enviando información sobre clics y coordenadas.

La API JavaScript de Google Maps ofrece capacidades similares. El módulo está completamente programado y funciona en el lado del navegador, por lo que no necesitamos solicitudes HTTP de PHP ni la formación de encabezados en el lado del servidor, como era el caso de otras API.

Por ejemplo, colocar un marcador en un mapa se verá así:

marca var = nuevo google.maps.Marker((
posición: miPOS,
mapa: mapa,
título: "¡Hola!"
});

¿Cuál es la necesidad y los beneficios de utilizar la API?

Hay bastantes funciones útiles.

Primer aspecto

Puede establecer una interacción interactiva del usuario con redes sociales y mensajería instantánea, utilizar las capacidades de sistemas informáticos de terceros para mostrar tipos de cambio, clima y otra información importante.

Con la API, puede conectar instantáneamente otros recursos y soluciones de software a los servidores, lo que normalmente llevaría semanas de desarrollo. La API simplifica la vida cuando no se necesita una implementación única y la confiabilidad y la seguridad son una prioridad.

Segundo aspecto

Si usted es propietario de una potencia informática compleja, un servicio popular o un almacenamiento de datos para acceso público o semiprivado, entonces una buena medida sería crear su propia API. ¿Qué dará?

  • Gran flujo de clientes.
  • Acceso simplificado a sus servicios para socios.
  • Conveniencia del análisis estadístico del uso del servicio.

Tercer aspecto

Casi igual que el segundo. Pero sin necesidad de implementar una API de acceso abierto. Si tiene un portal y desea crear una aplicación móvil para él en Android/IOS, la mejor solución es reescribir el sistema bajo una única API. Toda la estructura de datos está sistematizada. El sitio y la aplicación funcionarán a través de canales de datos únicos.




Arriba