SendService tiene dos métodos. Send recibe un mensaje y da una respuesta, y refleja
POST /secure/send campo por campo. SendStream lleva muchos mensajes en un
solo stream bidireccional, para un volumen sostenido.
Ambos necesitan el token de sesión de Login en el metadato
authorization.
Send: un mensaje
Campos
Todos los campos salvoto son optional: un campo que no establece se comporta exactamente como
una clave JSON que omite en una petición REST, y toma el mismo valor por defecto. Se aplican las
mismas aprobaciones, productos, gramática de TLV y límites, porque ambos llegan a las mismas
comprobaciones.
Los campos
dlr_method y tags de REST no se transportan; sus números de campo están reservados para
que nunca puedan reutilizarse para otra cosa.
Valores de custom_tlvs
Cada valor es un TlvValue que contiene exactamente uno de:
La clave decide la codificación en el cable, exactamente como en REST.
"0x1401:Int8" con
int_value: 42 es el entero de 8 bytes 42, como lo es "0x1401:Int8": 42 en REST.
grpcurl) un entero de 64 bits se escribe como cadena. Los clientes
generados reciben un entero nativo.
Acuses: dlr y dlr_url
El webhook siempre gana: un mensaje con
dlr_url nunca aparece en el feed.
Si su proveedor ha desactivado el feed de acuses,
dlr: true sin dlr_url se rechaza con
INVALID_ARGUMENT indicando dlr_url (el mismo rechazo que da REST), porque los acuses no tendrían
adónde ir.La respuesta
price es una cadena a propósito: así un importe decimal sobrevive sin cambios en cualquier lenguaje,
cosa que un número de coma flotante no haría.
Reintentar con seguridad con client_ref
Establezca client_ref en cada envío que pueda reintentar. Una repetición dentro de 24 horas desde
la misma cuenta (por gRPC o por REST, sea cual sea el login que lo envió) se responde con el
message_id del primer envío y duplicate: true, y no se vuelve a enviar ni a cobrar nada.
Un envío que fue rechazado libera su referencia, así que la petición corregida puede reutilizarla.
Las reglas son las de REST, descritas por completo en
Reintentar con seguridad con client_ref,
incluido el único hueco estrecho en un clúster de pasarelas.
Esto importa sobre todo para una respuesta en particular: UNKNOWN con OUTCOME_UNKNOWN, donde el
mensaje puede estar en camino. Reinténtela solo con el mismo client_ref. Consulte
Errores y códigos de estado.
SendStream: muchos mensajes en un solo stream
Para un volumen alto y sostenido. Usted escribe SendStreamRequest y lee SendStreamResult en un solo
stream bidireccional.
Cada petición es un correlation_id elegido por usted y un SendRequest: exactamente el mensaje
que pasaría a Send.
Cada resultado es:
correlation_id debe tener de 1 a 64 caracteres. Uno vacío o más largo se responde (solo para esa
petición) con INVALID_ARGUMENT y field: correlation_id. Use algo único por petición en el stream;
su client_ref suele ser la opción natural.
Un resultado por petición, en cualquier orden
Las peticiones se procesan concurrentemente, así que una rápida adelanta a una lenta. Empareje porcorrelation_id, nunca por posición.
Un rechazo es un resultado, no un error del stream
Un saldo vacío, el límite de tasa o un campo incorrecto responden a esa única petición, y el stream continúa. El stream en sí solo termina cuando usted cierra su lado (entonces conOK, después
del último resultado) o cuando la pasarela se detiene.
Lea de forma continua, o el stream se atasca
La pasarela retiene como mucho 256 de sus peticiones a la vez en un stream, ya sea procesándose o respondidas y esperando a que usted lea el resultado. Por encima de eso deja de leer del stream hasta que se haya leído un resultado, y el control de flujo normal de HTTP/2 frena sus escrituras. Por tanto: escriba tan rápido como su biblioteca le permita y lea los resultados de forma continua en otro hilo o tarea. Un cliente que primero lo escribe todo y lee después se detiene tras 256. Para más concurrencia, abra más streams: cada uno tiene sus propios 256. Todos comparten el límite de mensajes por segundo de su cuenta, así que más streams dan concurrencia, no velocidad.Cuando la pasarela se detiene
Una pasarela que se reinicia termina sus streams de forma ordenada:- Las peticiones que ya se estaban procesando terminan, y se envían sus resultados.
- Las peticiones recibidas pero aún no iniciadas se responden con
UNAVAILABLE/SHUTTING_DOWNsin procesarse. - El stream termina con
UNAVAILABLE(SHUTTING_DOWN).
client_ref, para que nada se envíe dos veces.
Una conexión que se corta sin ese final ordenado le deja con peticiones sin resultado. Reenvíelas
también, con el mismo client_ref: las que se aceptaron vuelven con duplicate: true.
Relacionado
Ejemplos
Send y SendStream en Python, Java y Go.
POST /secure/send
El gemelo REST de cada campo anterior.