Мне нужно отправить HTTP-запросы со всеми стандартными методами RESTful и получить доступ к телу запроса, чтобы отправить/получить JSON с ним. Я просмотрел,
WebRequest.HttpWebRequest
Это работает почти отлично, но бывают случаи, когда, например, если сервер отключен, функция GetResponse может занять несколько секунд, поскольку это синхронный метод - замораживание приложения для этого периода. Асинхронная версия этого метода BeginGetResponse не работает асинхронно (в Unity в любом случае), поскольку она по-прежнему замораживает приложение для этого периода.
UnityEngine.WWW #
По какой-то причине поддерживает только запросы POST и GET, но мне также нужны PUT и DELETE (стандартные методы RESTful), поэтому я не стал больше смотреть на них.
System.Threading
Чтобы запустить WebRequest.HttpWebRequest.GetResponse без замораживания приложения, я рассмотрел использование потоков. Потоки, кажется, работают в редакторе (но кажутся крайне неустойчивыми - если вы не останавливаете поток, когда приложение выходит из него, он продолжает работать в редакторе навсегда, даже когда вы его останавливаете), а когда он построен на устройстве iOS, он сразу же разбивается как я пытаюсь начать поток (я забыл записать ошибку, и у меня нет доступа к нему прямо сейчас).
Запуск потоков в приложении iOS для родного приложения с мостом в приложение Unity
Смешно, даже не пытаясь это сделать.
UniWeb
Это. Я хотел бы знать, как им это удалось.
Вот пример метода WebRequest.BeginGetResponse, который я пытаюсь,
// 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);
}
}
... на основе этого: http://msdn.microsoft.com/en-us/library/86wf6409(v=vs.71).aspx