2017-02-22 80 views
0

Я посылаю запрос на сообщение CISCO ISE с данными XML, и я получаю следующее сообщение об ошибке:400 Bad Request на XML POST

400 Bad Request   

Я проверил мой текст XML, заголовки и данные аутентификации в RestClient (для веб-служб RESTful), он успешно делает запрос на отправку. Однако мой запрос не работает с его предполагаемым клиентом, и я считаю, что с моим скриптом что-то не так.

В API документации говорится, что я должен иметь следующее:

Method: POST 
URI: https://10.10.10.10:9060/ers/config/networkdevice 
HTTP 'Content-Type' header:application/vnd.com.cisco.ise.network.networkdevice.1.0+xml; charset=utf-8  
HTTP 'Accept' header: application/vnd.com.cisco.ise.network.networkdevice.1.0+xml 

Может кому-л сказать мне, что случилось с моими данными 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; 
use HTTP::Request; 
use XML::Simple; 

#Create a user agent object 
    my $ua = LWP::UserAgent->new(ssl_opts=> { 
    SSL_verify_mode => SSL_VERIFY_NONE(), 
    verify_hostname => 0, 
    } 
    ); 


my $uri='https://10.10.10.10:9060/ers/config/networkdevice/'; 
my $header = HTTP::Headers->new; 
my $req = HTTP::Request->new('POST', $uri); 

my $message =('<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <ns3:networkdevice name="LAB-WLZZ" id="89c7e480-591f-11e4-ac6a b83861d71000" xmlns:ns2="ers.ise.cisco.com" xmlns:ns3="network.ers.ise.cisco.com"> 
    <authenticationSettings> 
     <enableKeyWrap>false</enableKeyWrap> 
     <keyInputFormat>ASCII</keyInputFormat> 
     <networkProtocol>RADIUS</networkProtocol> 
     <radiusSharedSecret>******</radiusSharedSecret> 
    </authenticationSettings> 
     <NetworkDeviceIPList> 
     <NetworkDeviceIP> 
      <ipaddress>9.9.9.9</ipaddress> 
      <mask>21</mask> 
     </NetworkDeviceIP> 
     </NetworkDeviceIPList> 
     <NetworkDeviceGroupList> 
     <NetworkDeviceGroup>Location</NetworkDeviceGroup> 
     <NetworkDeviceGroup>DeviceType</NetworkDeviceGroup> 
     </NetworkDeviceGroupList> 
    </ns3:networkdevice>') 
    ; 

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


    $req->content($message); 
    $req->content_type("charset=utf-8"); 
    $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->status_line, "n"; 
      } else { 
       print $res->status_line, "n"; 
      } 
+0

Вы на самом деле не с помощью REST :: Client, даже если вы 'использовать REST :: Client ; '. Почему вы не делаете 'my $ client = REST :: Client-> new (...)'? – ThisSuitIsBlackNot

+0

Что такое серверные блоки сообщений (SMB)? – Borodin

ответ

4

Вы установка Content-Type заголовка charset=utf-8 с

$req->content_type("charset=utf-8"); 

Это заменяет заголовок предыдущего значения

application/vnd.com.cisco.ise.network.networkdevice.1.0+xml 

с

charset=utf-8 

Вы должны сделать

$req->content_type(
    'application/vnd.com.cisco.ise.network.networkdevice.1.0+xml; charset=utf-8' 
); 

Вы также можете создать свой запрос, как это:

my $req = HTTP::Request->new('POST', $uri, [ 
    Accept   => 'application/vnd.com.cisco.ise.network.networkdevice.1.0+xml', 
    'Content-Type' => 'application/vnd.com.cisco.ise.network.networkdevice.1.0+xml; charset=utf-8' 
], $message); 
+1

Совет: 'Content_Type' также может использоваться вместо' 'Content-Type'', если вы хотите избежать кавычек. – ikegami

+0

Я бы не указал кодировку вообще. Хотя это необходимо для текстовых форматов, это не для XML и других «приложений». – ikegami

+0

Спасибо за советы ... но он не работает, у меня есть ошибка '400 Bad Request'. Правильно ли мой текст XML? Я имею в виду, как я должен упаковать это '(' 'или просто' '', но на самом деле я уже пробовал все ... – StayCalm