Есть ли способ потреблять API, выполняя запрос get несколько раз с различным URL-адресом foreach? - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь использовать TomTomApi, получая значение currrentSpeed ​​для местоположения (широта, долгота). Для каждого местоположения мне нужно сгенерировать URL, чтобы сделать запрос на получение. Но не могу найти хороший способ сделать это. Итак, в конце я хотел бы сгенерировать 5 URL и получить 5 разных данных (поэтому моя функция должна возвращать 5 текущих скоростей по одному для каждого местоположения)!

public class TomTomApiTrafficFlow: MonoBehaviour{

// parameter to set lat & lon + type of response (json) or the key providing by the api
[SerializeField]
const string lat = "50.843829";
[SerializeField]
const string lon = "4.369384";
[SerializeField]
const string typeFile = "json";// xml ou json
[SerializeField]
const string API_KEY = "API_KEY";
// Where to send our request
const string DEFAULT_URL = "https://api.tomtom.com/traffic/services/4/flowSegmentData/relative-delay/10/json/";
string targetUrl = DEFAULT_URL + "?key=" + API_KEY + "&point=" + lat + "," + lon;

// Keep track of what we got back
string recentData = "";

void Awake()
{
    this.StartCoroutine(this.RequestRoutine(this.targetUrl,this.ResponseCallback ));
}

// Web requests are typically done asynchronously, so Unity's web request system
// returns a yield instruction while it waits for the response.
//
private IEnumerator RequestRoutine(string url, Action<string> callback = null)
{
    //const string URL = "https://api.tomtom.com/traffic/services/4/flowSegmentData/relative-delay/10/json/" + "?key=" + API_KEY + "&point=" + lat + "," + lon;
    // Using the static constructor
    var request = UnityWebRequest.Get(url);
    // Wait for the response and then get our data
    yield return request.SendWebRequest();
    var data = request.downloadHandler.text;
    // This isn't required, but I prefer to pass in a callback so that I can
    // act on the response data outside of this function
    if (callback == null)
        Debug.Log(callback);
    callback(data);
}

// Callback to act on our response data
private void ResponseCallback(string data)
{
    //List<string> LcurSpeed = new List<string>();
    Debug.Log(data);
    recentData = data;
    JObject o = JObject.Parse(recentData.ToString());
    JToken token = o.SelectToken("flowSegmentData.currentSpeed");
    recentData = token.ToString();
}
// Old fashioned GUI system to show the example
void OnGUI()
{
    this.targetUrl = GUI.TextArea(new Rect(0, 0, 500, 50), this.targetUrl);
    GUI.TextArea(new Rect(0, 60, 50, 50), recentData);
}}

1 Ответ

0 голосов
/ 25 марта 2019

Я нашел способ сделать это, добавив данные в список и возвращая каждый элемент в пользовательском интерфейсе! открытый класс TomTomApiTrafficFlow: MonoBehaviour {

// parameter to get list of currentSpeed
// Keep track of what we got back
string recentData = "";
List<string> LrecentData = new List<string>();



string GenerateUrls(string typeFile,float lat,float lon)
{
    const string API_KEY= "?key=hcbqhqcbcqkbclcblcbcbqjq";

    const string DEFAULT_URL = "https://api.tomtom.com/traffic/services/4/flowSegmentData/relative-delay/10/";
    typeFile = typeFile + "/";// xml or json
    string geoloc= "&point=" + lat.ToString() + "," + lon.ToString();
    string targetUrl = DEFAULT_URL + typeFile + API_KEY + geoloc;

    return targetUrl.ToString();
}

// Web requests are typically done asynchronously, so Unity's web request system
// returns a yield instruction while it waits for the response.
//
private IEnumerator RequestRoutine(Action<string> callback = null){
    //List<string> Lurl = new List<string>();
    string url0, url1, url2, url3, url4;

    url0 = GenerateUrls("json", 50.843829f, 4.369384f);
    url1 = GenerateUrls("json", 50.844773f, 4.356664f);
    url2 = GenerateUrls("json", 50.846885f, 4.362358f);
    url3 = GenerateUrls("json", 50.852922f, 4.360137f);
    url4 = GenerateUrls("json", 50.852440f, 4.367985f);
    var Lurl = new List<string>() { url0, url1, url2, url3, url4 };
    var Ldata = new List<string>();

    foreach (string x in Lurl)
    {
        var request = UnityWebRequest.Get(x);
        yield return request.SendWebRequest();
        var data = request.downloadHandler.text;
        Ldata.Add(data);
        if (callback != null)
            Debug.Log(callback);
        callback(data);}}

// Callback to act on our response data
private void ResponseCallback(string data)
{  
    Debug.Log(data);
    recentData = data;
    JObject o = JObject.Parse(recentData.ToString());
    JToken token = o.SelectToken("flowSegmentData.currentSpeed");
    recentData = token.ToString();
    LrecentData.Add(recentData);
}
// Old fashioned GUI system to show the example
void OnGUI()
{

    GUI.TextArea(new Rect(0, 0, 500, 50), LrecentData[0].ToString());
    GUI.TextArea(new Rect(0, 60, 500, 50), LrecentData[1].ToString());
    GUI.TextArea(new Rect(0, 120, 500, 50), LrecentData[2].ToString());
    GUI.TextArea(new Rect(0, 180, 500, 50), LrecentData[3].ToString());
    GUI.TextArea(new Rect(0, 240, 500, 50), LrecentData[4].ToString()); }}
...