Une méthode pour effectuer les requêtes HTTP sur l'Unité iOS?
J'ai besoin d'envoyer des requêtes HTTP avec toutes les méthodes RESTful et l'accès au corps de la requête pour envoyer/recevoir JSON avec elle. J'ai regardé dans,
WebRequest.HttpWebRequest
Cela fonctionne presque parfaitement, mais il y a des cas où, par exemple, si le serveur est en bas de la fonction GetResponse peut prendre de quelques secondes à revenir, puisque c'est une méthode synchrone - le gel de l'application de cette période. La version asynchrone de cette méthode, BeginGetResponse, ne semble pas fonctionner de manière asynchrone (dans l'Unité de toute façon) car il gèle encore la demande pour cette période.
UnityEngine.WWW#
Prend uniquement en charge POST et GET demandes pour une raison quelconque - mais j'ai aussi besoin de PUT et DELETE (standard Reposant méthodes) donc je n'ai pas pris la peine de les examiner plus avant.
Système.Filetage
Pour exécuter WebRequest.HttpWebRequest.GetResponse sans geler l'application j'ai regardé dans l'aide de threads. Fils semblent travailler dans l'éditeur (mais semble extrêmement volatiles, si vous ne cessez pas d'un fil lorsque l'application se ferme qu'il continue de fonctionner dans l'éditeur pour toujours, même quand vous l'arrêter), et lors de la construction d'un appareil iOS crash dès que je tente de démarrer un thread (j'ai oublié d'écrire l'erreur et je n'ai pas accès pour l'instant).
Exécuter les threads dans un natif de l'application pour iOS avec un pont à l'Unité d'application
Ridicule, même pas d'aller à cette tentative.
UniWeb
Cette. Je voudrais savoir comment ils ont géré la.
Voici un exemple de la WebRequest.BeginGetResponse méthode que je suis en train d'essayer,
//The RequestState class passes data across async calls.
public class RequestState
{
const int BufferSize = 1024;
public StringBuilder RequestData;
public byte[] BufferRead;
public WebRequest Request;
public Stream ResponseStream;
//Create Decoder for appropriate enconding type.
public Decoder StreamDecode = Encoding.UTF8.GetDecoder();
public RequestState()
{
BufferRead = new byte[BufferSize];
RequestData = new StringBuilder(String.Empty);
Request = null;
ResponseStream = null;
}
}
public class WebRequester
{
private void ExecuteRequest()
{
RequestState requestState = new RequestState();
WebRequest request = WebRequest.Create("mysite");
request.BeginGetResponse(new AsyncCallback(Callback), requestState);
}
private void Callback(IAsyncResult ar)
{
//Get the RequestState object from the async result.
RequestState rs = (RequestState) ar.AsyncState;
//Get the WebRequest from RequestState.
WebRequest req = rs.Request;
//Call EndGetResponse, which produces the WebResponse object
// that came from the request issued above.
WebResponse resp = req.EndGetResponse(ar);
}
}
... sur cette base: http://msdn.microsoft.com/en-us/library/86wf6409(v=vs. 71).aspx
- S'il vous plaît montrer un exemple de la façon dont vous utilisez BeginGetResponse... peut être un problème avec votre code de trop (administration de commentaires, vous ne savez pas si l'Unité a un comportement spécial pour cet appel).
- Exemple ajouté. L'unité utilise une version personnalisée de Mono 2.6 je crois.
- Hé, monsieur, votre question est clairement assez confus et ne fait que répondre par vous-même, mais je me pose exactement la même question avec l'unité et de requêtes http. Au lieu de threads, je suis en train
coroutines
. Je ne pense pas que le thread est le meilleur chemin, mais je ne pouvais toujours pas tout à fait avec les coroutines. Avez-vous des mises à jour sur ce point? Avez-vous essayé de faire de mon chemin? Pouvez-vous partager votre solution? - Lorsqu'utilisé dans une coroutine la délinquance méthode encore gèle l'application jusqu'à ce qu'il retourne - ma théorie est que la méthode bloque le thread qu'il est appelé. Je ne pense pas que coroutines impliquent de thread pour rien appelé en eux est exécuté sur le thread principal de toute façon, le gel de l'application comme si vous l'avez appelé n'importe où ailleurs. L'appel de la méthode dans un thread a bien fonctionné, juste être très prudent pour fermer manuellement votre fils comme unité/mono ne semble pas le faire automatiquement.
- Vous avez répondu assez vite @Ford, mais pour une raison que je n'ai pas reçu la notification. J'ai eu beaucoup de succès à l'aide de coroutines pour les processus en parallèle avec
WWW
etLoadLevelAsync
, j'ai donc pensé qu'il pourrait être possible là aussi. Mais maintenant, j'ai confiance, comme vous l'avez dit, il ne fait pas de créer son propre thread en effet, il s'agit en fait simplement faire des appels asynchrones dans le même thread... de toute façon, si vous avez obtenu ce compris, pourriez-vous partager votre solution avec nous? Ou est-il plus de 3 pages de large, comme votre msdn lien? - Coroutines fonctionnent toujours sur le même thread que celui qui les a appelés. Donc, si le code de votre coroutine est le blocage, il permet de bloquer votre application. LoadLevelAsync travaux, par exemple, parce que c'est une méthode asynchrone. Coroutines travail de sauvegarder leur pile d'appel au moment où vous le rendement d'eux. Lorsque vous revenez dans votre coroutine méthode, il reprend l'exécution à l'endroit exact où vous l'avez laissé, le maintien de tous les locaux de la pile de l'état qu'il avait lorsqu'il a donné. Mais il est toujours sur le même thread. C'est comme contrôlée par l'utilisateur de la planification des threads. C'est très différent de réel système de threads.
- Ne les blâme pas .Net threads pour votre incapacité à lire le manuel... Threads ont un
IsBackground
de la propriété que vous pouvez définir avant de les commencer. Si elle est définie sur True, le thread va mourir lors de l'application. La valeur par défaut est False.
Vous devez vous connecter pour publier un commentaire.
Ok, j'ai enfin réussi à écrire ma propre solution. Nous avons essentiellement besoin d'un RequestState, un Méthode de Rappel et un Thread de Délai d'attente. Ici, je vais juste copier ce a fait dans UnifyCommunity (maintenant appelé unity3d wiki). Cette approche est dépassée code, mais plus petit que ce qui est là, donc plus pratique pour montrer quelque chose ici. Maintenant, je l'ai enlevé (dans le unit3d wiki)
System.Action
etstatic
pour la performance et la simplicité:Utilisation
WebAsync.cs
API Compatibility Level
de.NET 2.0
etStripping Level
deDisabled
pour être sûr que cela va fonctionner.J'ai eu threads de travail sur iOS - je crois qu'il a été s'écraser en raison de fantôme de threads ou de quelque chose. Le redémarrage de l'appareil semble avoir fixé le crash, donc je vais juste utiliser WebRequest.HttpWebRequest avec les threads.
Il y a un moyen de le faire de manière asynchrone, sans l'aide de IEnumerator et le taux de retour des choses. Découvrez la eDriven cadre.
HttpConnector classe: https://github.com/dkozar/eDriven/blob/master/eDriven.Networking/Rpc/Core/HttpConnector.cs
J'ai été en utilisant JsonFX avec HttpConnector tout le temps, par exemple en ce WebPlayer démo: http://edrivenunity.com/load-images
De ne pas avoir PUT et DELETE n'est pas un gros problème, depuis le tout pourrait être fait à l'aide de GET et POST. Par exemple, je suis communique correctement avec Drupal CMS à l'aide de son service REST.
ou vous pouvez l'envoyer via une fonction AJAX prédéfinis, en-têtes personnalisés pour des raisons de sécurité
avec cela, vous aurait besoin de signer des en-têtes et signée, une demande de retour à partir du serveur
Je préfère les signatures md5 relativement elles ne sont pas si grand