Страница 1 из 1

RequestManager

СообщениеДобавлено: 17 июл 2018, 13:20
FordeD
Добрый день, хочу сделать универсальный класс для работы с запросами GET и POST. На этапе передачи параметров по принципу ключ-значение я остановился на Hashtable и не могу решить ошибку.

Assets/Scripts/RequestManager.cs(7,23): error CS1624: The body of `RequestManager.apiGET(string, System.Collections.Hashtable)' cannot be an iterator block because `string' is not an iterator interface type

Сам код класса:
Скрытый текст:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RequestManager : MonoBehaviour {

public static string apiGET(string path, Hashtable parameters) {
string result = null;
if (parameters != null) {
foreach (DictionaryEntry param in parameters) {
result = string.Concat(string.Concat("&", param.Key), param.Value.ToString());
}
result = result.Substring(1);
}
string url = GlobalsParams.API_URL+""+path;
if(result != null) {
url = url + "?" + result;
}
WWW req = new WWW(url);

float elapsedTime = 0.0f;

while (!req.isDone)
{
elapsedTime += Time.deltaTime;
if (elapsedTime >= 10.0f) break;
yield return null;
}

if (!req.isDone || !string.IsNullOrEmpty(req.error))
{
Debug.Log("Load Failed");
result(null); // Pass null result.
yield break;
} else {
Debug.Log(req.text);
}

return req.text;
}
}

Re: RequestManager

СообщениеДобавлено: 17 июл 2018, 13:50
Anonymyx
Если yield то возвращаем IEnumerable<string>, а не просто string.

Re: RequestManager

СообщениеДобавлено: 17 июл 2018, 15:43
FordeD
Попробовал переделать на Dictionary

Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RequestManager : MonoBehaviour {

        public static string apiGET(string path, Dictionary<string,string> parameters) {
                string result = "";
                if (parameters.Count > 0) {
                        foreach (string key in parameters.Keys) {
        result = string.Concat(string.Concat("&", key), parameters[key].ToString());
                        }
                        result = result.Substring(1);
                }
                string url = GlobalsParams.API_URL+""+path;
                if(result != "") {
                        url = url + "?" + result;
                }
                WWW req = new WWW(url);

                float elapsedTime = 0.0f;
 
                while (!req.isDone)
                {
                                elapsedTime += Time.deltaTime;
                                if (elapsedTime >= 10.0f) break;
                }

                if (!req.isDone || !string.IsNullOrEmpty(req.error)) {
                        Debug.Log("Load Failed");
                        return "Load Failed";
                } else {
                        Debug.Log(req.text);
                        return req.text;
                }

        }
}
 


Теперь выдает ошибочный запрос. Не ожидая выполнения идет дальше

Re: RequestManager

СообщениеДобавлено: 17 июл 2018, 15:53
1max1
Ну и откуда нам знать что там у тебя за запросы и что ты пытаешься нахимичить?
Эх щас бы в 2к18 телепатами быть...

Re: RequestManager

СообщениеДобавлено: 17 июл 2018, 18:20
FordeD
Сказали в телеграме, что можно использовать UniRx и в итоге получилось вот что:

Синтаксис:
Используется csharp
Debug.Log("OnStart: "+url);
                returnedValue = "";
                var observer = Observer.Create<string>(
                        x => {
                                RequestManager.returnedValue = x;
                                Debug.Log("OnNext: " + x + " || " + RequestManager.returnedValue);
                        },
                        ex => Debug.Log("OnError: " + ex.Message),
                        () => Debug.Log("OnCompleted")
                );

                ObservableWWW.Get(url).Subscribe(observer);
 


Но все равно при обращении к методу не идет ожидание ответа. Каким образом его можно сделать с UniRx или же без него (желательно)