0

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

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

我们所有的 3 个 pod(自定义 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 请求参数”

感谢这里的任何帮助。谢谢

4

1 回答 1

2

Disclamer:我是 Graphileon 的首席开发人员。

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

formData在目标 API 中模拟文件上传的唯一方法是在参数中发送文件数据。问题是使用 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 读取选定的文件内容。

于 2021-09-06T14:44:30.560 回答