当前位置: 首页 > 知识库问答 >
问题:

无法在RabbitMQ接收器中将content\u类型从应用程序/八位字节流更改为应用程序/json

徐学潞
2023-03-14

我有一个简单的RabbitMQ源和接收器。我正在将消息发布到具有以下属性的源队列:

content_type -> application/json

和JSON负载:

{
  "userId": 2,
  "customerId": 1,
}

RabbitMQ接收器使用application/octet-stream而不是JSON获取消息。

我尝试使用以下属性启动应用程序

spring.cloud.stream.default.contentType=application/json

但这于事无补。

流定义:

stream_1=rabbitSource: rabbit --queues=queue1 --password=p --host=h --username=u | sink: rabbit --exchange=ex --routing-key=rk --converter-bean-name=jsonConverter --password=p --host=h --username=u

如何将内容类型设置为应用程序/json?参考指南似乎没有答案。

发布版本:

  • spring-cloud-dataflow-server:2.0.1。释放
  • spring-cloud-skiper-server:2.0.0。释放

更新:

正如@SabbyAnandan在回答中所建议的,我现在正在跑步:

dataflow:>stream create --name test123 --definition "rabbitSource: rabbit --queues=queue --password=p --host=rmq --username=u --spring.cloud.stream.bindings.output.contentType='application/json' | sink: rabbit --exchange=ex --routing-key=rk --converter-bean-name=jsonConverter --password=p --host=rmq --username=p"
Created new stream 'test123123'

dataflow:>stream deploy --name test123 --properties "app.rabbit.spring.cloud.stream.bindings.output.contentType='application/json'"
Deployment request has been sent for stream 'test123'

但是content_type还是一样的。

共有2个答案

韩欣怿
2023-03-14

Rabbit源的标题中设置的默认内容类型是:<代码>内容类型:应用程序/x-java-serialized-object。

您可以通过传递以下内容来覆盖该行为:

1) <代码>--Spring。云流动绑定。输出contentType='application/json'作为Rabbit源的内联属性。

2) 部署流时,您可以通过properties=“app.rabbit.spring.cloud.stream.bindings.output.contentType='application/json”覆盖特定于应用程序的属性。

部署后,您可以通过转到特定于应用程序的超文本传输协议来确认属性是否被覆盖://

要解决所有这些问题,您可以独立运行应用程序(即java-jar...)以在通过SCDF运行它们之前确认行为。如果它独立工作,它也应该在SCDF中工作。

壤驷彦
2023-03-14

@Maroun,正如所讨论的,这里有一些选项。

  1. Rabbit接收器始终以字节[]的形式接收数据。您可以通过提供配置(rabbit.converterBeanName=jsonConverter)来强制它使用json转换器。但这在默认情况下使用Base64编码器,生成的文本将进行Base64编码。然后,在从接收器发布到的exchange接收数据的自定义应用程序中,您需要提供一个自定义转换器,该转换器使用Base64解码器进行属性解码
 类似资料:
  • 我有一个第三方服务,它用文件向我的Django应用程序发出POST请求。要成功上传到Django应用程序,请求必须具有“多部分/表单数据”内容类型,但在我的案例和请求中,内容类型是“八位流”。文件总是空的。我怎么能在Django中接收八位流内容类型的文件?

  • 最近我为下载创建了一个子域,我希望浏览器下载文件,而不是查看文件。为此,我在文件: 在Firefox和GoogleChrome上,它可以正常工作,但微软浏览器-Internet Explorer和微软Edge都忽略了MIME类型,而是查看它们。我怎样才能强迫他们也下载这些文件呢?

  • 我写一个服务器端应用程序与嵌入jetty接收一些请求从第三方客户端。客户端将一些小文件上传到服务器。但是我很惊讶地看到,客户端并没有上传文件数据作为应用程序/八位流,而是上传了一个json作为应用程序/json,其中包括文件的所有元数据,并在一个字段中将所有数据作为字符串 {“_id”:“水果”,“名称”:“水果”,“_shasum”:“4954f1f8b4a8cbf9ea6b675face476

  • 我不清楚它们是什么,也不知道什么时候使用它们。 在这个例子中,我有一个REST客户端,我想发送一个文件(.zip文件),如果我使用其中任何一种类型,会发生什么 我猜application/octet-stream相当于application/zip,这只是为了向另一方提供有关传输数据的提示,文件以某种方式进行了编码 多部分/表单数据以某种方式破坏数据,您可以通过其特定的mime类型传递“多个数据”

  • 有人知道为什么将内容类型设置为application/octet stream,然后在restify中未定义请求主体吗? 这是我的密码 HTTP请求 控制台打印:您好 控制台打印: 控制台打印:未定义

  • 我有一个节点-快递应用程序。在那里,我试图调用一个API,它响应一个原始的xlsx对象作为 'Content-Type':'应用程序/八位流;charset=; UTF-8' 编写如何调用API的代码: 现在我正试图用这些数据做两件事。 将其写入excel文件。下面是我尝试的代码: 因此,在这两种情况下,文件都会损坏。 但是API响应是完美的,因为当它被UI直接使用时,xlsx文件正在正确生成。