2016-04-21 65 views
1

我最近又回到了使用GameMaker:Studio,並且自從我上次使用它之後,hoo男孩已經有了一些大規模更新!事實上,我最後一次使用它,他們只有Windows和HTML5作爲導出選項...GameMaker轉輪在發出HTTP請求時崩潰

無論如何,急於嘗試一些新的東西,我決定嘗試在本機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()嘗試。

任何想法可能導致這次崩潰?

回答

1

這種崩潰的原因是因爲您將Content-Length標頭作爲實際而不是字符串發送。如果您將您的線路更改爲

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

它應該工作。

+0

...... ... ... - 長時間停頓 - *真的* GM:S?不能只說「無效類型」?必須去徹底崩潰? Grr ...噢,至少現在工作了,我知道今後要留意這一點... –