发出 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));
应该可以。
我最近重新开始使用 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));
应该可以。