Cómo PhalApi solicita servicios de interfaz

Cómo solicitar
el método de solicitud bajo el protocolo de interfaz Protocolo HTTP
Para PhalApi, el valor predeterminado es comunicarse a través del protocolo HTTP. De acuerdo con la implementación específica del servicio de interfaz, puede usar GET o POST para solicitar.

Acceso al portal
Como se mencionó anteriormente, PhalApi recomienda configurar el directorio raíz accesible para el sistema en / path / to / phalapi / public. El archivo de entrada de acceso unificado de PhalApi es el archivo /path/to/phalapi/public/index.php.

Cuando el nombre de dominio configurado es: dev.phalapi.net, y el directorio raíz se ha establecido en público, la URL a la que se accede en este momento es:

http://dev.phalapi.net

Cuando ni el nombre de dominio ni el directorio raíz están configurados, la URL a la que se accede en este momento es (obviamente más larga y menos elegante):

http: //localhost/phalapi/public/index.php Si

no está instalado, lea la descarga e instalación.

¿Cómo especificar el servicio de interfaz que se solicitará?
De manera predeterminada, puede especificar el servicio de interfaz que se solicitará a través del parámetro s. Cuando no se transmite s, el servicio de interfaz predeterminado se usa de manera predeterminada, a saber: App.Site.Index. Los siguientes tres métodos son equivalentes, todos solicitan el servicio de interfaz predeterminado.

El parámetro s no se pasa
? S = Site.Index, y se omite el espacio de nombres. La aplicación se usa por defecto. App
? S = App.Site.Index, con un prefijo de espacio de nombres
. Puedes elegir uno de dos:

? s = Class.Action
o :? s = Namespace.Class.Action,
donde Namespace representa el prefijo del espacio de nombres, Class es el nombre de la clase de servicio de interfaz y Action es el nombre del método de servicio de interfaz. Estos tres suelen estar en mayúsculas y usan puntos en inglés Número dividido El método de clase final ejecutado es: Espacio de nombres / Api / Clase :: Acción (). Cabe señalar que:

Sugerencias: El parámetro s es la abreviatura del parámetro de servicio, es decir, usar? S = Class.Action es equivalente a? Service = Class.Action, y el parámetro de servicio se usa preferentemente cuando ambos existen.

Acerca del espacio de nombres El espacio de
nombres se refiere a la primera mitad de / Api / en el espacio de nombres. Y debe registrar la carga automática en el archivo composer.json en el directorio raíz, para que el archivo de clase se pueda cargar automáticamente normalmente. Por ejemplo, el espacio de nombres de la aplicación registrado de manera predeterminada:

{
    "autoload": {
        "psr-4": {
            "App \\": "src / app"
        }
    }
}

Cuando hay un subespacio de nombres en el espacio de nombres, utilice la división de subrayado cuando lo solicite. Por el contrario, cuando no hay un espacio de nombres multinivel, el espacio de nombres no debe contener guiones bajos.

Acerca del nombre de clase del servicio de interfaz de clase El nombre de
clase del servicio de interfaz de clase se refiere a la segunda mitad de / Api / en el espacio de nombres y debe ser una subclase de PhalApi / Api. Cuando hay subespacios de nombres en el espacio de nombres, se utilizan guiones bajos cuando se solicita. Del mismo modo, cuando no hay un espacio de nombres de varios niveles, el espacio de nombres no debe contener guiones bajos.

Acerca del nombre del método de servicio de la interfaz de Action La
acción a solicitar debe ser un método de clase de nivel de acceso público y no puede ser un método existente de PhalApi / Api.

Algunos ejemplos Los
siguientes son algunos ejemplos completos.

PhalApi 2.x Parámetro solicitado s Archivo correspondiente Método de clase ejecutado
Ninguno ./src/app/Api/Site.php App \ Api \ Site :: Index ()
? S = Site.Index ./src/app/Api /Site.php App \ Api \ Site :: index ()
? S = Weibo.Login ./src/app/Api/Weibo.php App \ Api \ Weibo :: login ()
? S = User.Weibo.Login. /src/user/Api/Weibo.php User \ Api \ Weibo :: login ()
? s = Company_User.Third_Weibo.Login ./src/company_user/Api/Third/Weibo.php Company \ User \ Api \ Third \ Weibo :: login ()
asume en el ejemplo anterior que se ha configurado en composer.json:

{
    "autoload": {
        "psr-4": {
            "App \\": "src / app",
            "User \\": "src / user",
            "Company \\ User \\": "src / company_user "
        }
    }
}

Activar el enrutamiento URI
¡Nota! Esta función requiere PhalApi 2.7.0 y superior para ser compatible.

En cualquier caso, PhalApi utilizará primero el parámetro de servicio, seguido del parámetro s (es decir, el parámetro corto del servicio) para localizar qué servicio de interfaz está solicitando el cliente actual.

Cuando el cliente no proporciona el parámetro de servicio o el parámetro s, puede intentar la coincidencia de enrutamiento URI abriendo sys.enable_uri_match.

Primero, a través de algunos ejemplos para comprender el efecto de acceso después de activar la coincidencia de enrutamiento URI, los siguientes efectos son equivalentes.

# Especifique
http://dev.phalapi.net/?service=App.Usre.Login a través del servicio

# Después de habilitar la coincidencia de enrutamiento URI
http://dev.phalapi.net/App/User/Login

# Omita el espacio de nombres predeterminado de la aplicación
http://dev.phalapi.net?s=App.Usre.Login

# Después de habilitar la coincidencia de enrutamiento URI
http://dev.phalapi.net/User/Login


El principio es muy simple: cuando el parámetro de servicio y el parámetro s no se proporcionan, y sys.enable_uri_match está habilitado, el cliente puede acceder al servicio de interfaz a través de un URI como / Namespace / Class / Action.

Además de modificar la configuración enable_uri_match a verdadera en ./config/sys.php, también debe sincronizar la configuración de la regla Rewrite para permitir que su servicio reenvíe la solicitud a index.php para procesarla cuando no se encuentre ningún archivo. Consulte la siguiente configuración de Nginx:

servidor {
    escuchar 80;
    nombre_servidor dev.phalapi.net;
    raíz / ruta / a / phalapi / public;
    juego de caracteres utf-8;

    # Active la
    ubicación de coincidencia de enrutamiento URI / {
        try_files $ uri $ uri / $ uri / index.php;
    }
    if (! -E $ request_filename) {
        rewrite ^ / (. *) $ /Index.php last;
    }

    ubicación ~ \ .php $ {
        fastcgi_split_path_info ^ (. + \. php) (/.+) $;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        incluir fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name;
    }

    registros de acceso_log / dev.phalapi.net.access.log;
    error_log logs / dev.phalapi.net.error.log;
}


¿Cómo coinciden las rutas?
Después de habilitar la coincidencia de enrutamiento y configurar correctamente las reglas Nginx o Apache Rewrite, el cliente puede acceder al servicio de interfaz de las siguientes maneras:

Ruta común: / Espacio de nombres / Clase / Ruta
común de acción , con parámetros GET: / Espacio de nombres / Clase / Acción? Xx = 123
ruta común, y el frente contiene el archivo index.php: /index.php/Namespace/Class / Acción
común, y contiene el archivo index.php y el parámetro GET: /public/index.php/Namespace/Class/Action?xx=123
Del mismo modo, si el espacio de nombres es App, puede ignorarlo y escribirlo, es decir:

Aplicación predeterminada, ruta común: / Class / Action
Aplicación predeterminada, ruta común y con parámetros GET: / Class / Action? Xx = 123
Aplicación predeterminada, ruta común y el archivo index.php se incluye al frente: / index. La
aplicación predeterminada php / Class / Action , ruta común, y contiene tanto el archivo index.php como los parámetros GET: /public/index.php/Class/Action?xx=123
El siguiente es un ejemplo para la interfaz de inicio de sesión:

// Ruta común
http://dev.phalapi.net/App/User/Login

// Ruta común con parámetros GET
http://dev.phalapi.net/App/User/Login?username=dogstar&password=123456

// La ruta común y el archivo index.php se incluyen en el frente
http://dev.phalapi.net/index.php/App/User/Login

// La ruta común, y contiene el archivo index.php y el parámetro GET (el archivo de entrada debe ser index.php, la ruta del directorio anterior se puede personalizar)
http://dev.phalapi.net/public/index.php/App/ Usuario / Inicio de sesión? Nombre de usuario = dogstar & contraseña = 123456 Extensión

: ¿Cómo personalizar el método de entrega del servicio de interfaz?
Aunque acordamos utilizar el formato de? S = Namespace.Class.Action para pasar el nombre del servicio de interfaz, si el proyecto lo necesita, también se puede pasar de otras maneras. Por ejemplo, un formato de solicitud similar al marco Yii :? R = Espacio de nombres / Clase / Acción.

Si necesita personalizar la forma de pasar el nombre del servicio de interfaz, puede anular el método PhalApi \ Request :: getService (). El siguiente es un fragmento de código de implementación para cambiar a división de barras y usar nombres de parámetros r.

// file./src/app/Common/Request.php

<? php
namespace App \ Common;

La solicitud de clase se extiende \ PhalApi \ Request {

    función pública getService () {
        // Dar prioridad al nombre del servicio de interfaz de formato personalizado
        $ service = $ this-> get ('r');
        if (! empty ($ service)) {
            $ namespace = count (explde ('/ ', $ service)) == 2?' App. ':' ';
            return $ namespace. str_replace (' / ','. ', $ service);
        }

        return parent :: getService ();
    }
} Después de

implementar la clase de solicitud personalizada, debe registrarla en el archivo de configuración DI del proyecto./config/di.php. Agregue una línea al final:

$ di-> request = new App \ Common \ Request ();

en este momento, la solicitud del servicio de interfaz se puede realizar de una nueva manera. Eso es:

La forma original La forma actual
? S = Site.Index? R = Site / Index
? S = App.Site.Index? R = App / Site / Index
? S = Hello.World? R = Hello / World
? S = App .Hello.World? R = App / Hello / World
Aquí hay algunas notas:

1. El método reescrito debe convertirse al formato de servicio de interfaz original, a saber: Namespace.Class.Action. Tenga cuidado de no omitir el espacio de nombres.
2. Para mantener la compatibilidad, se debe devolver parent :: getService () cuando no se pueda obtener el parámetro de nombre de servicio de interfaz personalizado.
Si desea embellecer el enrutamiento de URL, puede usarlo junto con la configuración de redireccionamiento.

Por ejemplo, la configuración de referencia de Nginx:

if (! -e $ request_filename) {
    rewrite ^ / (. *) $ /index.php?r=$1 last;
}

Por ejemplo, la configuración de referencia de Apache:

<IfModule mod_rewrite.c>
RewriteEngine en
RewriteCond% {REQUEST_FILENAME}!
-D RewriteCond% {REQUEST_FILENAME}!
-F RewriteRule ^ (. *) $ Index.php /? R = $ 1 [QSA, PT, L]
Autorización SetEnvIf "(( . *) "HTTP_AUTHORIZATION = $ 1
</IfModule>

又如 IIS 参考 配置 :

<? xml version = "1.0" encoding = "utf-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name = "Imported Rule 1" stopProcessing = "true">
                    <match url = "^ (. *) $" ignoreCase = "false" />
                    <condiciones>
                        <add input = "{REQUEST_FILENAME}" matchType = "IsDirectory" ignoreCase = "false" negate = "true" />
                        <add input = "{ REQUEST_FILENAME} "matchType =" IsFile "ignoreCase =" false "negate =" true "/>
                    </ condiciones>
                    <action type = "Rewrite" url = "index.php /? r = {R: 1}" appendQueryString = "true" />
                </rule>
            </ rules>
        </ rewrite>
    </system.webServer>
</ configuration> El

efecto final será similar, cuando visite: http://api.phalapi.net/user/login, se convertirá en: http: // api .phalapi.net /? r = user / login, y luego activa la regla de extensión, que es equivalente a: http://api.phalapi.net/?s=user.login
 

Publicado 210 artículos originales · elogiado 37 · 170,000 vistas

Supongo que te gusta

Origin blog.csdn.net/u012757419/article/details/103978173
Recomendado
Clasificación