java - HTTP POST Angular 到 Java。无法发送多个不同类型的参数

标签 java ajax angular rest grizzly

我正在尝试将上传的文件(来自 Angular 的 FormData)和同一 HTTP POST 请求中的字符串发送到后端(使用 Grizzly 服务器的 Java 和用于 REST 服务的 Ajax)。 问题是我收到 HTTP 400 错误请求,因为文件未正确映射:

jersey message: Can not construct instance of java.io.InputStream: abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type

在前端,我有一个使用 ng g class Form 创建的名为 Form 的类,其中包含:

export class Form {
    private file:FormData;
    private bookName: String;

    constructor(file:FormData, bookName: String) {
        this.file = file;
        this.bookName = bookName;
    }
}

前端的 HTTP POST 方法是:

  sendFormData() {
    const form  = new Form(this.testData, this.bookName);

    this.pdfService.sendFormData(form).subscribe((res) => {
      console.log(res);
    });
  }

上面的 this.testData 具有 FormData 类型,而 this.bookName 是一个字符串。它们都包含预期的输入值。

pdfService.sendFormData 是:

  public sendFormData(form: Form) {
    console.log("sending to " + this.baseUrl + "uploadFile")
    return this.http.post(this.baseUrl + "uploadFile", form, { responseType: 'text' });
  }

在后端我有一个类 Form.java (映射的类):

public class Form {
    String bookName;
    InputStream file;
    ... (getters & setters & constructor)
}

HTTP POST 方法是:

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.TEXT_HTML)
    @Path("uploadFile")
    public Response convertPdfToHtml(Form form) {
            ...
    }

要获取映射的字符串,我使用:form.getBookName() 并获取映射的文件,我使用:form.getFile()。

正如我所说,问题在于来自前端的文件未正确映射到来自后端的输入流。

我应该使用什么类型将 FormData 从前端映射到后端的类型?或者我可以使用哪些其他实现在同一个 POST 请求中发送文件和字符串?

谢谢。

最佳答案

在 POST 方法中,您应该提供 FormData 类型的对象,并且

export class Form {
  private file: File;
  private bookName: String;

  constructor(file:File, bookName: String) {
    this.file = file;
    this.bookName = bookName;
  }
}


public sendFormData(form: Form) {
  const formData = new FormData();
  formData.append('bookName', form.bookName);
  formData.append('file', form.file, form.file.name);

  console.log("sending to " + this.baseUrl + "uploadFile")
  return this.http.post(this.baseUrl + "uploadFile", formData, {responseType: 'text'});
}

您将获得内容类型为 multipart/form-data 的帖子

关于java - HTTP POST Angular 到 Java。无法发送多个不同类型的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57354491/

相关文章:

javascript - Angular2 和社交共享爬虫

javascript - 扩展面板组标题和迭代子对象

java - 在 OpenSSL 中完成的 AES 加密成功解密,但在 Java 中加密时失败

java - Collectors.toMap() 中映射的默认值

jquery - 将 AJAX 转换为 jQuery

javascript - 如何在angular2 webpack typescript 中包含第三方javascript库

java - 如何在 Spring 非 EE 应用程序中注入(inject) infinispan 缓存?

java - (Java) 从内存中删除一个实例?

php - 将 PHP var 从远程 PHP 脚本获取到 JQuery

jquery - 在针对 TurboGears 服务器的失败 AJAX 请求中访问交互式 backlash/Werkzeug 调试器