Graphileon 代理功能用于文件上传

Graphileon Proxy Feature For file uploads

我们有一个自定义 API,它在 Kubernetes 服务器上的一个 pod 中 运行,Graphileon 也在同一服务器上的一个 pod 中 运行。

自定义 API 将电子表格作为表单数据,将其上传并处理到 Neo4j 数据库(也在同一服务器上的 pod 中 运行)。

我们所有的 3 pods(自定义 API、Graphileon 和 Neo4j)都 运行 在同一个命名空间中。

我们的要求是我们想在 Graphileon 上创建一个“HTMLView”,它可以打开一个小对话框,我们可以在其中上传电子表格并在后端点击我们的 API。

Graphileon 团队建议我们使用代理功能,但在这种情况下似乎不起作用。这是我们所做的:

本地测试

我们在本地启动了 neo4j、graphileon 和自定义 API。我们创建了 HTML 视图并使用 ajax 调用来调用我们的 API:

function createSchema(schemaType,formData)
{
        var schemaUrl = "http://localhost:8080/create-schema/"+schemaType;
        $.ajax({
          url: schemaUrl,  
          type: "POST",
          data: formData,
          mimetype: "multipart/form-data",
          cache: false,
          processData: false,
          success: function(data,status,xhr){ 
            $("#result").html("");
            $("#reset").show();
            $("#schemaFileUpload").hide();
$("#result").append("<h4>Create "+ schemaType +" Schema Success <span style=\'color:green\' >"+xhr.responseText + " with Status code "+xhr.status+"<span></h4> </br>" );
            $("#verticalSchemaFile").attr("disabled","disabled");
            $("#customerSchemaFile").attr("disabled","disabled");
          }, 
          error: function(xhr,status,error){ 
            $("#result").html("");

            $("#reset").show();
            $("#schemaFileUpload").hide();
            $("#result").append( schemaType +" create Schema Failed. <span style=\'color:red\' >"+xhr.responseText + " with Status code "+xhr.status+"<span> </br>" );
            $("#verticalSchemaFile").attr("disabled","disabled");
            $("#customerSchemaFile").attr("disabled","disabled");
          }
        });
} 

这有效!

服务器测试

当我将相同的代码放在服务器上时,它给出错误 - 无法到达 URL。所以我做了代理设置并尝试了代理方式:

function createSchema(schemaType,formData)
{
        var schemaUrl = "http://customapi:8080/create-schema/"+schemaType;
        $.ajax({
          url: "/proxy",  
          type: "POST",
          data: "{\"url\": \"" + schemaUrl + "\", \"method\": \"POST\", \"data\": \"" + formData + "\"}",
          mimetype: "multipart/form-data",
          cache: false,
          processData: false,
          success: function(data,status,xhr){ 
            $("#result").html("");
            $("#reset").show();
            $("#schemaFileUpload").hide();
$("#result").append("<h4>Create "+ schemaType +" Schema Success <span style=\'color:green\' >"+xhr.responseText + " with Status code "+xhr.status+"<span></h4> </br>" );
            $("#verticalSchemaFile").attr("disabled","disabled");
            $("#customerSchemaFile").attr("disabled","disabled");
          }, 
          error: function(xhr,status,error){ 
            $("#result").html("");

            $("#reset").show();
            $("#schemaFileUpload").hide();
            $("#result").append( schemaType +" create Schema Failed. <span style=\'color:red\' >"+xhr.responseText + " with Status code "+xhr.status+"<span> </br>" );
            $("#verticalSchemaFile").attr("disabled","disabled");
            $("#customerSchemaFile").attr("disabled","disabled");
          }
        });
} 

这给出错误提示“未指定 JSON 请求参数”

在此感谢您的帮助。谢谢

免责声明:我是 Graphileon 的首席开发人员。

Graphileon 的 /proxy 端点更像是一个远程过程调用。它使用在请求正文(GET 或 POST 数据)中作为 JSON 收到的参数调用 request(...)。 它不是为处理文件上传而设计的。

在目标API中模拟文件上传的唯一方法是在formData参数中发送文件数据。 问题是 JSON 只能发送文本文件。 所以不能发送二进制数据。

$.ajax({
    url: "/proxy",  
    type: "POST",
    data: JSON.stringify({
        url: schemaUrl,
        method: 'POST',
        formData: {
            file: {
                value:  '<file-contents>',
                options: {
                    filename: 'my-file.txt',
                    contentType: 'text/plain'
                }
            }
        }

    })
})

您可以使用 Javascript 的 FileReader API 读取选定的文件内容。