Http Get

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hallo ;)

    folgendes problem:

    durch ein http get bekomme ich folgendes json:
    [{"name":"bla","g_ID":"cgdkf75jkfkdlgsu84","score":"23"},{"name":"Leonardo006","g_ID":"c7863170ed82e16d22cdc521374642550f83f97c","score":"24"},{"name":"Papa","g_ID":"c7863170ed82e16d22cdc521374642550f83f97s","score":"103"}]

    die map wird geladen, doch die einzelnen argumente(name, schore id) werden nochmals unter "default" geladen, das heißt, die map hat einen namen "default"... nun möchte ich aber wie bei einem highscore den namen und den dazugehörigen highscore anzeigen lassen... wie mach ich das bitte?


    achso noch eine frage, wenn ich mehrere http_gets habe, wie sortiere ich die? kann ich die einer variabel zuweisen zb global.test = http_get(bla.de) ???

    danke ;)
  • Ja, du kannst die Requests sortieren z.B. so:

    GML-Quellcode

    1. //CREATE
    2. request_1= http_get(...)
    3. //ASYNC
    4. if ds_map_find_value(async_load, "id") == request_1{}



    Als erstes lädst du den String (Result) aus der async-map mit "default", dieser String konvertierst du mit json_decode, danach hast du eine ds_list, in der alle deine Objekte sind. In deinem Beispiel hast du 3 Einträge. Diese speicherst du jeweils in einer Variable, die wieder eine ds_map mit deinen Argumenten ist, also name, g_id und score.

    Die Struktur ist also so aufgebaut:
    MAP -> LIST -> MAP

    GML-Quellcode

    1. res = ds_map_find_value(async_load,"result")
    2. json = json_decode(res)
    3. ds_list_objects = ds_map_find_value(json,"default")
    4. obj[0] = ds_list_find_value(ds_list_objects,0)
    5. obj[1] = ds_list_find_value(ds_list_objects,1)
    6. obj[2] = ds_list_find_value(ds_list_objects,2)
    7. show_message(ds_map_find_value(obj[i],"name"))
    8. show_message(ds_map_find_value(obj[i],"g_ID"))
    9. show_message(ds_map_find_value(obj[i],"score"))
    Alles anzeigen
    Husi012 hat mich nicht mehr in seiner Signatur, ich bin trotzdem noch fame.
  • ok hab erstmal geschafft.....

    aber er spuck ab und zu einen fehler aus:
    FATAL ERROR in
    action number 1
    of Async Event: HTTP
    for object object2:

    json_decode argument 1 incorrect type (undefined) expecting a Number (YYGR)
    at gml_Object_object2_WebAsyncEvent_1 (line 2) - global.json = json_decode(global.res)
    ##########################################################





    habe folgendes gemacht:
    im create:

    request_1 = http_get("http://www.todadev.de/Server_highscore_beta/Blocky_Colors/test_2.php")

    global.gefunden = false

    global.name = ds_list_create();
    global.scores = ds_list_create();
    global.ids = ds_list_create();


    im HTTP:


    global.res = ds_map_find_value(async_load,"result")
    global.json = json_decode(global.res)


    global.ds_list_objects = ds_map_find_value(global.json,"default")

    global.obj[0] = ds_list_find_value(global.ds_list_objects,0)
    global.obj[1] = ds_list_find_value(global.ds_list_objects,1)
    global.obj[2] = ds_list_find_value(global.ds_list_objects,2)

    for (i=0; i<ds_list_size(global.ds_list_objects); i+=1)
    {
    global.gefunden = true
    //global.test = ds_map_find_value(global.obj[0],"name");

    ds_list_add(global.name,ds_map_find_value(global.obj[i],"name"));
    ds_list_add(global.scores,ds_map_find_value(global.obj[i],"score"));
    ds_list_add(global.ids,ds_map_find_value(global.obj[i],"g_ID"));

    };





    im Draw_GUI:



    if global.gefunden = true
    {
    for (k=0; k<ds_list_size(global.ds_list_objects); k+=1)
    {
    draw_text(100, 150 + 20 * k,ds_list_find_value(global.name, k));
    draw_text(220, 150 + 20 * k,ds_list_find_value(global.scores, k));
    }
    }
  • Bei dynamischen Daten, wie hier, ist es immer zwingend notwendig, Fehlerabfragen zu verwenden. Also bei json_decode z.B.
    Returns: ds_map id or -1 if it fails

    GML-Quellcode

    1. if json_decode(global.res) != -1
    2. {
    3. }
    4. else
    5. {
    6. show_message("Highscore konnte nicht geladen werden")
    7. }


    Prüfe auch die Werte "status" und "http_status" der Map ab, die die http_get() Funktion bereit stellt.
    status sollte immer 0 geben und http_status gibt z.B. den Code 404 aus, wenn die Datei nicht gefunden wurde. Alle Codes findest du hier

    Verwende auch die Befehle ds_exists und is_undefinded
    NOTE: If no such key exists then the function will return <undefined>. You should always check this using the is_undefined() function.


    EDIT:
    Testweise kannst du auch immer den http_status anzeigen lassen und so den Grund des Fehlers finden.
    Husi012 hat mich nicht mehr in seiner Signatur, ich bin trotzdem noch fame.