如何从Haxe/Neko发送HTTP PUT请求?

6
我有一个运行在 NekoVM 下的服务器,提供 RESTLike 服务。我正在尝试使用以下 Haxe 代码向该服务器发送 PUT/DELETE 请求:
static public function main()
{
    var req : Http = new Http("http://localhost:2000/add/2/3");
    var bytesOutput = new haxe.io.BytesOutput();

    req.onData = function (data)
    {
        trace(data);
        trace("onData");
    }

    req.onError = function (err)
    {
        trace(err);
        trace("onError");
    }

    req.onStatus = function(status)
    {
        trace(status);
        trace("onStatus");
        trace (bytesOutput);
    }

    //req.request(true); // For GET and POST method

    req.customRequest( true, bytesOutput , "PUT" );

}

问题在于只有 onStatus 事件显示了一些东西:
Main.hx:32: 200
Main.hx:33: onStatus
Main.hx:34: { b => { b => #abstract } }

可以有人向我解释一下,我在使用customRequest时做错了什么吗?

customRequest 可能是异步的,所以在退出 main() 函数之前可能需要等待一段时间以获取回调。 - Martin Delille
我尝试在customRequest后添加了Sys.Sleep(seconds)。但是没有更多的效果。值得注意的是,request(true)是从Haxe源代码中调用customRequest的。而且它可以在没有暂停的情况下正常工作。 - Maxime Mangel
根据框架的不同,程序休眠可能会阻塞回调。你有onData的工作示例吗? - Martin Delille
如果我注释掉customRequest并取消注释request(true),那么onData就能正常工作了。 - Maxime Mangel
也许您的自定义请求无效?您可以尝试使用另一个工具发送请求,例如http://curl.haxx.se/。 - Martin Delille
2个回答

3

customRequest 不会调用 onData

customRequest 调用完成后,要么会被调用 onError,要么会先调用第一个 onStatus,然后响应将被写入指定的输出。


1

对于那些找到这些答案的人(@stroncium's 是正确的),并想知道最终代码可能是什么样子的:

static public function request(url:String, data:Any) {
    var req:Http = new haxe.Http(url);
    var responseBytes = new haxe.io.BytesOutput();

    // Serialize your data with your prefered method
    req.setPostData(haxe.Json.stringify(data)); 
    req.addHeader("Content-type", "application/json");

    req.onError = function(error:String) {
        throw error;
    };

    // Http#onData() is not called with custom requests like PUT

    req.onStatus = function(status:Int) {
        // For development, you may not need to set Http#onStatus unless you are watching for specific status codes
        trace(status);
    };

    // Http#request is only for POST and GET
    // req.request(true);

    req.customRequest( true, responseBytes, "PUT" );

    // 'responseBytes.getBytes()' must be outside the onStatus function and can only be called once
    var response = responseBytes.getBytes();

    // Deserialize in kind
    return haxe.Json.parse(response.toString());
}

我制作了一个gist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接