首页 > 解决方案 > 如何在 RESTful 架构中从后端获取数据?

问题描述

我正在使用Java后端和Angular前端构建 RESTful 架构。这个想法如下:给定一个带有一堆 的表单Fields,前端生成一个JSON文件并将其发送到后端,该文件将xdocreport与模板文件一起处理.docx以执行上下文替换。这个管道生成一个.docx文件,我应该以某种方式返回到前端,要么下载它,要么返回一个Response包含byte[]实体的文件。

所以,这是我在后端的帖子:

@POST
@Path("/form/{category}/export")
public Response generateDoc(JSONObject jObj) {
    Response.ResponseBuilder rb = Response.ok(Controller.generateDocument(
                                                Utils.getFileExtension(jObj.get("metadata").toString()),
                                                (ArrayList)jObj.get("data"),
                                                jObj.get("metadata").toString()
                                                ));
    rb.header("Access-Control-Allow-Origin", "*");
    rb.header("Access-Control-Allow-Methods", "POST, GET, PUT, UPDATE, OPTIONS");
    rb.header("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With");
    return rb.build();
}

whereController.generateDocument()是一个静态方法,它实际生成文档并返回一个byte[]. 我在前端的要求是:

exportToBackend(): void {
    this.fields.forEach(field=>{
      field.value = this.formGroup.value[field.label];
      if (field.label == 'image') {
        field.value = this.imgURL;
      }
    });

    let result = {metadata: this.selectedTemplate, data: this.fields};

    const httpOptions = {
      headers: new HttpHeaders({
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'GET, POST, PUT, UPDATE, OPTIONS',
        'Access-Control-Allow-Headers': 'Content-Type, Accept, X-Requested-With'
      })
    };
    this.http.post<Uint8Array>('http://localhost:8080/ExportLibrary-BackEnd-1.0-SNAPSHOT/form/'
      .concat(this.category).concat('/export'), result, httpOptions).toPromise().then(data => {
        this.doc = data;
    });

 }

当我运行它时,文档会正确生成(我将 byte[] 对象和实际.docx文件都创建为一种“调试”),但在前端我得到一个Uint8Array (0)空对象,我不明白为什么。此外,我还应该从该数组创建.docx文件。更准确地说,我得到的错误如下:

HttpResponseError

即使我在后端根本JSON不使用文件。

所以,我的问题是:我错在哪里?如何从Response前端的 Java 对象中获取实际数据?

最后,我看到了一堆实际从后端下载文件的示例(像这样)。这是如何运作的?它比获取byte[]对象更好吗?

标签: javascriptjavarestpost

解决方案


推荐阅读