首页 > 解决方案 > RabbitMQ HTTP API 返回 401(未经授权)

问题描述

使用 RabbitMQ localhost 并尝试使用他的 API .. 当我从邮递员那里打电话时,它工作正常。

在此处输入图像描述

但我试图在我的应用程序代码中使用这个 API,我收到 401 错误:

const test = {
  count: 5,
  ackmode: 'ack_requeue_true',
  encoding: 'auto',
  truncate: 50000
}

  testPost() {
    fetch('http://localhost:15672/api/queues/%2F/QA.MOBILE/get', {
      method: 'post',
      mode: 'no-cors',
      body: JSON.stringify(test),
      headers: {Authorization: 'Basic ' + btoa('guest:guest'), Accept: 'application/json', 'Content-Type': 'application/json'}
    });
  }

POST http://localhost:15672/api/queues/%2F/QA.MOBILE/get net::ERR_ABORTED 401(未经授权)

我错过了什么?

谢谢

标签: rabbitmq

解决方案


我自己也遇到了这个问题。尽管我的问题与 CORS 无关,但我想我会在此处记录该问题,以防将来的读者遇到同样的问题。

我的问题是我没有正确地对用户凭据进行 base64 处理。在浏览器中,您可以像这样调用任何RabbitMQ API 端点

http://somename:somepassword@servername:15672/api/cluster-name

但是当以编程方式调用它时,您需要从 url 中删除凭据并改为 base 64。

using (var httpClient = new HttpClient())
{
    using (var request = new HttpRequestMessage(new HttpMethod("GET"), "http://servername:15672/api/cluster-name"))
    {
        var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes($"somename:somepassword"));
        request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}");

        var response = httpClient.SendAsync(request).Result;

        if (response.IsSuccessStatusCode == true)
        {
            string jsonContent = response.Content.ReadAsStringAsync().Result;
        }
    }
}

上面的代码是 C#,但它对于 Java 等是相同的过程。


推荐阅读