c# - tag - Unity GET/POST Wrapper
unity inspector separator (3)
¿A qué se refiere ese script GET? La clase WWW le permite recuperar datos GET muy bien, la información que necesita se encuentra en la propiedad de texto del objeto WWW instanciado. Aquí está la documentación:
http://unity3d.com/support/documentation/ScriptReference/WWW-text.html http://unity3d.com/support/documentation/ScriptReference/WWW.html
Todo lo que necesita hacer es ceder el objeto WWW, como está haciendo ahora, y luego leer cualquiera de las propiedades que le interesan, simple y llanamente, sin necesidad de clases adicionales.
En cuanto a enviar un objeto POST, para eso es para la clase WWWForm:
http://unity3d.com/support/documentation/ScriptReference/WWWForm.html
En resumen, usted acaba de crear un objeto WWWForm, agregarle campos a través de AddField (), y luego simplemente construir un nuevo objeto WWW con la URL POST y el objeto anterior, eso es todo. Ceda el objeto WWW y una vez que regrese, sus datos han sido enviados. Las respuestas son, nuevamente, en la propiedad del texto y los errores en el campo correspondiente. Sencillo, limpio y simple.
HTH!
Esta es una pregunta de Unity3d en C #. El objetivo es crear un objeto tal que pueda pasar una URL y recibir datos a través de GET
, un objeto que yo crearía sería un contenedor para la lógica WWW. También me gustaría un objeto ''POST'' también, donde podría proporcionar una url y un ''Diccionario'' de pares clave-valor como las argumentaciones posteriores. Entonces ... finalmente nos gustaría algo como esto:
get_data = GET.request("http://www.someurl.com/somefile.php?somevariable=somevalue");
Y
post_data = POST.request("http://www.someurl.com/somefile.php", post)
// Where post is a Dictionary of key-value pairs of my post arguments.
Para tratar de lograr esto, uso el objeto WWW
. Ahora, para dar tiempo al objeto WWW
para que se descargue, necesitamos que esto ocurra dentro de un objeto MonoBehaviour
y yield
los resultados. Así que obtuve esto, que funciona:
public class main : MonoBehavior
{
IEnumerator Start()
{
WWW www = new WWW("http://www.someurl.com/blah.php?action=awesome_stuff");
yield return www;
Debug.Log(www.text);
}
}
Lo que realmente quiero es esto:
public class main : MonoBehavior
{
IEnumerator Start()
{
GET request = new GET("http://www.someurl.com/blah.php?action=awesome_stuff");
Debug.Log(request.get_data()); // Where get_data() returns the data (which will be text) from the request.
}
}
Ahora tengo el script principal adjunto al único GameObject
en la jerarquía (llamado raíz). ¿Necesito tener también el script GET
adjunto al GameObject
raíz? ¿Puedo hacer eso dinámicamente desde main
?
En definitiva, necesito una solución que me permita enviar fácilmente solicitudes GET
y POST
.
¡Aclamaciones!
Ah, lo tengo!
Mi problema fue un malentendido sobre cómo funcionaron MonoBehaviour y Coroutines. La solución es muy simple.
En el editor, crea un GameObject vacío. Lo llamé DB. A continuación, adjunte el siguiente script:
using System;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
class DB : MonoBehaviour
{
void Start() { }
public WWW GET(string url)
{
WWW www = new WWW(url);
StartCoroutine(WaitForRequest(www));
return www;
}
public WWW POST(string url, Dictionary<string, string> post)
{
WWWForm form = new WWWForm();
foreach (KeyValuePair<String, String> post_arg in post)
{
form.AddField(post_arg.Key, post_arg.Value);
}
WWW www = new WWW(url, form);
StartCoroutine(WaitForRequest(www));
return www;
}
private IEnumerator WaitForRequest(WWW www)
{
yield return www;
// check for errors
if (www.error == null)
{
Debug.Log("WWW Ok!: " + www.text);
}
else
{
Debug.Log("WWW Error: " + www.error);
}
}
}
Entonces, en la función de inicio de su script principal, ¡puede hacer esto!
private DB db;
void Start()
{
db = GameObject.Find("DB").GetComponentInChildren<DB>();
results = db.GET("http://www.somesite.com/someAPI.php?someaction=AWESOME");
Debug.Log(results.text);
}
¡No he probado las solicitudes POST, pero ahora toda la lógica está completa! Envíe solicitudes HTTP a su deseo de corazones, ¡aplausos!
Aquí está el código de @ pandemoniumsyndicate modificado para agregar una devolución de llamada. El código original no es completamente correcto, ya que las funciones GET
y POST
se cerrarán inmediatamente después de llamar a la corutina. En ese momento, es probable que la solicitud de WWW
aún no se haya completado y el acceso a cualquier campo excepto ( www.isDone
) no tiene sentido.
El siguiente código define un delegado, WWWRequestFinished
, que se WWWRequestFinished
cuando la solicitud finalice con el resultado de la solicitud y los datos recibidos, si los hay.
using System;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class WWWRequestor : MonoBehaviour
{
Dictionary<WWW, object> mRequestData = new Dictionary<WWW, object>();
public delegate void WWWRequestFinished(string pSuccess, string pData);
void Start() { }
public WWW GET(string url, WWWRequestFinished pDelegate)
{
WWW aWww = new WWW(url);
mRequestData[aWww] = pDelegate;
StartCoroutine(WaitForRequest(aWww));
return aWww;
}
public WWW POST(string url, Dictionary<string, string> post, WWWRequestFinished pDelegate)
{
WWWForm aForm = new WWWForm();
foreach (KeyValuePair<String, String> post_arg in post)
{
aForm.AddField(post_arg.Key, post_arg.Value);
}
WWW aWww = new WWW(url, aForm);
mRequestData[aWww] = pDelegate;
StartCoroutine(WaitForRequest(aWww));
return aWww;
}
private IEnumerator WaitForRequest(WWW pWww)
{
yield return pWww;
// check for errors
string aSuccess = "success";
if (pWww.error != null)
{
aSuccess = pWww.error;
}
WWWRequestFinished aDelegate = (WWWRequestFinished) mRequestData[pWww];
aDelegate(aSuccess, pWww.text);
mRequestData.Remove(pWww);
}
}