¿Es posible publicar datos en JsonP? ¿O todos los datos deben pasarse en la cadena de consulta como una solicitud GET?
Tengo muchos datos que necesito enviar al servicio, entre dominios, y es demasiado grande para enviarlos a través de la cadena de consulta.
¿Cuáles son las opciones para evitar esto?
POST
solicitudes a otros dominios siempre que tanto ese dominio como su navegador sean compatiblesCORS
. Pero es totalmente cierto quePOST
yJSONP
no son compatibles.<script>
etiquetas que apuntan a otro dominio. La única forma de ejecutar solicitudes POST en un navegador es mediante formularios HTML o XMLHttpRequest.Si necesita enviar una gran cantidad de datos entre dominios. Normalmente creo un servicio al que puedes llamar en dos pasos:
Primero, el cliente envía un FORMULARIO (publicación permitida entre dominios). El servicio almacena la entrada en la sesión en el servidor (usando el GUID como clave). (el cliente crea un GUID y lo envía como parte de la entrada)
Luego, el cliente realiza una inyección de script normal (JSONP) como parámetro que usa el mismo GUID que usó en la publicación FORM. El servicio procesa la entrada de la sesión y devuelve los datos en la forma JSONP normal. Después de esto, la sesión se destruye.
Esto, por supuesto, depende de que usted escriba el servidor backend.
fuente
XMLHttpRequest
no debería estar involucrado en absoluto. La respuesta de Per utiliza un envío de formulario regular para realizar la solicitud POST, luego una inyección de elemento de script para realizar la solicitud GET.Sé que esto es una nigromancia grave, pero pensé en publicar mi implementación de JSONP POST usando jQuery, que estoy usando con éxito para mi widget JS (esto se usa para el registro e inicio de sesión del cliente):
Básicamente, estoy usando un enfoque IFrame, como se sugiere en la respuesta aceptada. Lo que estoy haciendo de manera diferente es después de enviar la solicitud, estoy observando, si se puede acceder al formulario en el iframe, usando un temporizador. Cuando no se puede acceder al formulario, significa que la solicitud ha regresado. Luego, estoy usando una solicitud JSONP normal para consultar el estado de la operación.
Espero que alguien lo encuentre útil. Probado en> = IE8, Chrome, FireFox y Safari.
fuente
Bueno, generalmente JSONP se implementa agregando una
<script>
etiqueta al documento de llamada, de modo que la URL del servicio JSONP sea "src". El navegador obtiene la fuente del script con una transacción HTTP GET.Ahora, si su servicio JSONP está en el mismo dominio que su página de llamadas, entonces probablemente podría improvisar algo con una simple
$.ajax()
llamada. Si no está en el mismo dominio, entonces no estoy seguro de cómo sería posible.fuente
CORS
, será posible siempre que el navegador también lo admita. En estos casos, utilizará plain enJSON
lugar deJSONP
.Puede utilizar un proxy CORS con este proyecto . Dirigiría todo el tráfico a un punto final en su dominio y transmitiría esa información a un dominio externo. Dado que el navegador registra todas las solicitudes para estar en el mismo dominio, podemos publicar JSON. NOTA: Esto también funciona con certificados SSL almacenados en el servidor.
fuente
Hay una solución (pirateada) que he hecho muchas veces, podrás publicar con JsonP. (Podrá publicar un formulario, más grande que 2000 caracteres de los que puede usar con GET)
Aplicación cliente Javascript
JAVA:
PHP:
Al hacer esto, está abriendo su servidor a cualquier solicitud de publicación, debe volver a asegurar esto proporcionando ident o algo más.
Con este método, también puede cambiar el tipo de solicitud de jsonp a json, ambos funcionan, simplemente configure el tipo de contenido de respuesta correcto
jsonp
json
Por favor, no es que su servidor ya no respetará el SOP (misma política de origen), pero ¿a quién le importa?
fuente
<script>
etiquetas en su DOM HTML (diablos, incluso puede usarlas en aplicaciones de escritorio, digamos que desea realizar múltiples solicitudes JSON al mismo servidor y desea usar el nombre de la función como un ID de seguimiento de solicitud, por ejemplo).Es posible, aquí está mi solución:
En su javascript:
En tu url.php:
fuente