发出 HTTP 请求时 GameMaker 运行程序崩溃

GameMaker runner crashes when making HTTP requests

我最近重新开始使用 GameMaker:Studio,天哪,自从我上次使用它以来有一些重大更新!事实上,我上次使用它时,他们只有 Windows 和 HTML5 作为导出选项...

无论如何,由于急于尝试一些新东西,我决定尝试一下原生 HTTP 函数,因为它们看起来很有前途。

我使用 http_post_string() 进行了一次测试,效果很好,向我的服务器发送了一个 JSON 字符串并返回了一个 JSON 字符串。返回的字符串实际上表示一个带有单个 属性、"echo" 的对象,其中包含已发出的 HTTP 请求,只是为了查看 GM:S 发送的内容。

我不喜欢它发送 Content-Type: application/x-www-form-urlencoded 时它很清楚 JSON,我希望能够设置我自己的用户代理字符串,以便服务器可以知道哪个游戏是无需传递额外参数即可与之对话。

所以我使用较低级别的 http_request() 函数重新创建了相同的请求。一切看起来都很好,所以我测试了它。

它崩溃了。就像,没有错误消息或任何东西,只是完全崩溃,Windows 不得不强制关闭它。

所以我这里的代码应该可以正常工作,但在 运行...

时崩溃
///send_request(file,ds_map_data,callback_event_id)
var request = ds_map_create();
request[? "instance"] = id;
request[? "event"] = argument2;

if( !instance_exists(obj_ajax_callback)) {
    instance_create(0,0,obj_ajax_callback);
}

var payload = json_encode(argument1);
var headers = ds_map_create();
headers[? "Content-Length"] = string_length(payload);
headers[? "Content-Type"] = "application/json";
headers[? "User-Agent"] = obj_ajax_callback.uastring;

var xhr = http_request("https://example.com/"+argument0,"POST",headers,payload);

with(obj_ajax_callback) {
    active_callbacks[? xhr] = request;
}

ds_map_destroy(headers);

obj_ajax_callback 是一个维护 ds_map 活动请求的对象,在其 HTTP 事件中,它监听这些请求的回调并按照 with(request[? "instance"]) event_user(request[? "event"]) 的方式做出反应,以便调用对象可以处理响应。这与完全工作的 http_post_string() 尝试没有改变。

知道是什么导致了这次崩溃吗?

崩溃的原因是您将 Content-Length header 作为真实的而不是字符串发送。如果您将行更改为

headers[? "Content-Length"] = string(string_length(payload));

应该可以。