【问题标题】:415 Unsupported Media Type HTTP415 不支持的媒体类型 HTTP
【发布时间】:2017-07-05 15:25:21
【问题描述】:

我正在尝试向思科 ISE 发送 GET 请求,但收到此错误:

415 不支持的媒体类型n

我做错了什么? API 文档说:

方法:获取

URI:https://10.10.10.10:9060/ers/config/networkdevice/

HTTP“接受”标头:application/vnd.com.cisco.ise.network.networkdevice.1.0+xml

所以,我应该能够接收 XML 格式的数据。

我已经尝试过这样做:

$header->header(
    'Content-Type'=>'application/vnd.com.cisco.ise.network.networkdevice.xml');
$header->header(
    'Content-Type'=>'application/vnd.com.cisco.ise.network.networkdevice.1.0+xml');

没有任何效果..每次我收到上述错误。

这是我的完整代码。

use strict;
use warnings;
use JSON -support_by_pp;
use LWP 5.64;
use LWP::UserAgent;
use MIME::Base64;
use REST::Client;
use IO::Socket::SSL;
use HTTP::Headers;

#So dass es auch ohne SSL Sertifizierung funktioniert
BEGIN { $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0 }
#Create a user agent object
my $ua = LWP::UserAgent->new(ssl_opts=> {
SSL_verify_mode => SSL_VERIFY_NONE(),
verify_hostname => 0,
                                              }
                                        );

#Create a request
my $uri='https://10.10.10.10:9060/ers/config/networkdevice';
my $header = HTTP::Headers->new;
$header->header('Content-Type'=>'application/vnd.com.cisco.ise.network.networkdevice');
my $req = HTTP::Request->new('GET', $uri, $header);
$req-> authorization_basic("user", "user");

#Pass request to the user agent and get a response back
my $res = $ua->request($req);

#Check the outcome of the response
if ($res->is_success) {
  print $res->content;
} else {
   print $res->status_line, "n";
}

【问题讨论】:

  • 似乎对媒体类型不一致。
  • 文档说您需要一个Accept 标头,但您发送的是Content-Type。那是错误的标题。写一个答案。

标签: xml perl http-status-code-415


【解决方案1】:

您的文档说您应该发送一个具有该长类型的 Accept 标头。

HTTP“接受”标头:application/vnd.com.cisco.ise.network.networkdevice.1.0+xml

Accept 是您的客户端将在响应中接受的内容类型。但是您将其用作 GET 请求中的 Content-Type 标头。这是没有意义的,因为 GET 请求没有正文。因此,它没有内容,也不能有其内容的类型。

API 以 415 Unsupported Media Type 响应的事实有点奇怪。它也可以忽略这一点。我们无法知道开发人员为什么选择这样做。

要解决您的问题,请将您的请求更改为使用 Accept 标头而不是 Content-Type。

my $header = HTTP::Headers->new;
$header->header(Accept => 'application/vnd.com.cisco.ise.network.networkdevice.1.0+xml');
my $req = HTTP::Request->new('GET', $uri, $header);

请注意,您不必显式创建自己的 HTTP::Headers 对象。对于这个简单的请求,您可以将带有键/值对的数组 ref 传递给 HTTP::Request->new。

my $req = HTTP::Request->new(
    'GET', 
    $uri, 
    [ Accept =>'application/vnd.com.cisco.ise.network.networkdevice.1.0+xml' ],
);

【讨论】:

  • 好像一切都在显眼的位置,但不幸的是我有同样的错误......接受不是颜色......我需要安装一些模块吗?
  • @StayCalm 您可以在您的问题中添加请求转储吗?你可以做print $req->as_string。只需将基本身份验证数据和其他敏感数据替换为输出中的虚假内容,然后再将其发布到此处。
  • GET https://10.10.10.10:9060/ers/config/networkdevice Accept: application/vnd.com.cisco.ise.network.networkdevice+xml Authorization: Basic dXNlcjp1c2Vy
  • 与文档中的@StayCalm 字符串完全相同吗?我认为1.0 不见了。我也没有从您的文档中复制它。 :-/
  • @StayCalm 注意细节总是很重要的。随着时间的推移,你会学到这一点。有时它是缺少空格,或分号,或者有太多的换行符。在这种情况下,我所做的是将示例数据复制/粘贴到我拥有的代码上方,将它们排列起来并检查一切是否匹配。
【解决方案2】:

更正的代码

#Create a request
my $uri='https://10.10.10.10:9060/ers/config/networkdevice';

my $req = HTTP::Request->new('GET', $uri);

$req->header('Accept'=>'application/vnd.com.cisco.ise.network.networkdevice.1.0+xml');

$req->authorization_basic("user", "user");

#Pass request to the user agent and get a response back
my $res = $ua->request($req);

您必须发送 Accept 标头而不是 Content-Type。

【讨论】:

    猜你喜欢
    • 2015-08-29
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2014-05-10
    相关资源
    最近更新 更多