Avatar billede rar_jacobsen Nybegynder
16. december 2013 - 16:00 Der er 21 kommentarer

HTTP Method : PUT - XML fil til Cisco server

Hej alle sammen,

Jeg står i den situation at jeg har brug for at modificere nogle indstillinger via en XML fil til Cisco Unified telefonisystem. Måden XML filen skal loades på er via en webbrowser som "sender" (PUT) filen til vores Cisco server

Jeg har følgende oplysninger på hvordan det skal gøres :
URI                http://<server>/adminapi/resources/{id}
Example URI        http://<server>/adminapi/resources/{id}
HTTP Method        PUT
Content Type      Application/XML, Application/JSON
HTTP Success Code  200
HTTP Failure Codes 401, 402, 405
Failure Response  —
Error Codes        —

XML filen indeholder fx følgende data (forskelligt fra medarbejder til medarbejder) :
<?xml version="1.0" encoding="utf-8" ?>
<resource>
    <self>http://10.146.102.13:8080/adminapi/resource/rarja</self>
    <userID>rarja</userID>
    <skillMap>
        <skillCompetency>
            <competencelevel>1</competencelevel>
            <skillNameUriPair name="Reception">
                <refURL>http://10.146.102.13:8080/adminapi/Skill/2</refURL>
            </skillNameUriPair>
        </skillCompetency>
        <skillCompetency>
            <competencelevel>1</competencelevel>
            <skillNameUriPair name="TyveriSpaerring">
                <refURL>http://10.146.102.13:8080/adminapi/Skill/3</refURL>
            </skillNameUriPair>
        </skillCompetency>
        <skillCompetency>
            <competencelevel>1</competencelevel>
            <skillNameUriPair name="Salg">
                <refURL>http://10.146.102.13:8080/adminapi/Skill/4</refURL>
            </skillNameUriPair>
        </skillCompetency>
        <skillCompetency>
            <competencelevel>1</competencelevel>
            <skillNameUriPair name="MBB">
                <refURL>http://10.146.102.13:8080/adminapi/Skill/6</refURL>
            </skillNameUriPair>
        </skillCompetency>
        <skillCompetency>
            <competencelevel>1</competencelevel>
            <skillNameUriPair name="MOB">
                <refURL>http://10.146.102.13:8080/adminapi/Skill/7</refURL>
            </skillNameUriPair>
        </skillCompetency>
    </skillMap>
    <primarySupervisorOf/>
    <secondarySupervisorOf/>
</resource>

Jeg har forsøgt at google mig til en måde jeg kan få det til at virke, men indtil videre er jeg på helt bar bund da jeg stadig er nybegynder på området.

Håber der er nogen som har mod på at prøve kræfter med mig og se om opgaven kan løses.

Skyd løs hvis der mangler informationer eller I har spørgsmål - det er svært at forklare når jeg ikke kender området godt nok selv, hvilket sikkert også gør jeg ikke har kunne finde ordentlig hjælp via Google ;)

På forhånd tak,

Rar Jacobsen
Avatar billede arne_v Ekspert
16. december 2013 - 16:08 #1
Jeg tror ikke paa brug af browser.

Du skal nok have et lille script til at lave den PUT.
Avatar billede rar_jacobsen Nybegynder
16. december 2013 - 16:45 #2
Ja, og det er også det jeg har forsøgt at finde hjælp til desværre.

Kunne alternativet være Web API tror du?
Avatar billede rar_jacobsen Nybegynder
16. december 2013 - 16:46 #3
Eller en webservice - planen er at XML filen skal genereres ud fra en databasetabel
Avatar billede arne_v Ekspert
16. december 2013 - 16:50 #4
Det er en web service.

Du skal bare kalde den.

Hvad kan du programmere i?
Avatar billede rar_jacobsen Nybegynder
16. december 2013 - 16:55 #5
VB .net
Avatar billede arne_v Ekspert
16. december 2013 - 17:06 #6
Det kan nemt goeres i VB.NET.

HttpWebRequest kan.

WebClient kan maaske.
Avatar billede arne_v Ekspert
16. december 2013 - 17:07 #7
Jeg kunne evt. bixe et eksempel senere.
Avatar billede rar_jacobsen Nybegynder
16. december 2013 - 17:15 #8
Det ville være super fedt hvis du havde tiden til det ... kommer nok til at granske det bagefter og stiller nok lidt spørgsmål så jeg forhåbentlig bliver lidt klogere og måske ... MÅSKE lærer lidt ;)
Avatar billede arne_v Ekspert
17. december 2013 - 02:45 #9
Jeg behoever vist ikke engang at lave et koerende eksempel.

Dim wc As WebClient = New WebClient
wc.UploadString(strengmedurl, "PUT", strengmedxml)

burde goere det/
Avatar billede rar_jacobsen Nybegynder
17. december 2013 - 08:17 #10
Er det virkelig alt? Jeg tester ... og vender tilbage (føler sig lidt dum hvis det er så simpelt)
Avatar billede rar_jacobsen Nybegynder
17. december 2013 - 09:29 #11
Jeg får følgende fejl :
System.Net.WebException: Fjernserveren returnerede en fejl: (405) Metoden er ikke tilladt. ved System.Net.WebClient.UploadDataInternal(Uri address, String method, Byte[] data, WebRequest& request) ved System.Net.WebClient.UploadString(Uri address, String method, String data) ved System.Net.WebClient.UploadString(String address, String method, String data) ved _CiscoChange.UpdateAgentSkills() i E:\Projects\Webpage\CiscoChange.aspx.vb:linje 29

        Try
            Dim strHTTP = Request.ServerVariables("HTTP_HOST")
            Dim strServerFile As String = strHTTP & "/Webpage/Cisco_files/XML_masterfile.xml"
            Dim wc As WebClient = New WebClient
            wc.Credentials = New System.Net.NetworkCredential("rarja", "xx2013xx")
            wc.UploadString("http://10.146.102.13:8080/adminapi/resource/", "PUT", strServerFile)
        Catch ex As Exception
            Response.Write(ex)
        End Try
Avatar billede rar_jacobsen Nybegynder
17. december 2013 - 10:04 #12
Så jeg ved ikke om det betyder jeg ikke kan bruge den metode eller om der er noget som ikke er sat korrekt op på den modtagende server :)

Tak for hjælpen indtil videre
Avatar billede arne_v Ekspert
18. december 2013 - 05:01 #13
Fejlen siger at den ikke tillader PUT.

Men den dokumentation du viste i spoergsmaal siger PUT.

????
Avatar billede rar_jacobsen Nybegynder
18. december 2013 - 15:14 #14
Det er korrekt det er det den siger, men er også kommet lidt længere, dog modtager jeg stadig fejl.

Hvis jeg fra CMD prompt kører følgende script, så virker det, og nu skal jeg så have det ind i VB :

E:\Projects\Webpage\Cisco_files>curl -v -X PUT -d @XML_masterfile.xml -u rarja:password "http://10.146.102.13:8080/adminapi/resource/rarja" --header "Content
-Type:application/xml"
* About to connect() to 10.146.102.13 port 8080 (#0)
*  Trying 10.146.102.13...
* Adding handle: conn: 0x1f4c3d0
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x1f4c3d0) send_pipe: 1, recv_pipe: 0
* Connected to 10.146.102.13 (10.146.102.13) port 8080 (#0)
* Server auth using Basic with user 'rarja'
> PUT /adminapi/resource/rarja HTTP/1.1
> Authorization: Basic cmFyamE6U2FuZGVyMjAwOSU=
> User-Agent: curl/7.33.0
> Host: 10.146.102.13:8080
> Accept: */*
> Content-Type:application/xml
> Content-Length: 2532
> Expect: 100-continue
>
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
< Set-Cookie: JSESSIONID=91D8D679899986645DE21036E0ABB52C; Path=/adminapi/; Http Only
< Content-Length: 0
< Date: Wed, 18 Dec 2013 13:18:15 GMT
* Server Cisco is not blacklisted
< Server: Cisco
<
* Connection #0 to host 10.146.102.13 left intact


Og nu bruger jeg scriptet her på websiden :
            Dim strServerFile As String = Server.MapPath("~/Cisco_files/XML_masterfile.xml")
            If File.Exists(strServerFile) Then
                Dim strFile As New FileInfo(strServerFile)
                Dim strContentLenght As Long = strFile.Length
                Dim myWebClient As WebClient = New WebClient
                myWebClient.Credentials = New System.Net.NetworkCredential("rarja", "Sander2009%")
                myWebClient.Headers.Add(System.Net.HttpRequestHeader.Authorization, "basic")
                myWebClient.Headers.Add(System.Net.HttpRequestHeader.Accept, "*/*")
                myWebClient.Headers.Add("Content-Type", "Application/XML")
                myWebClient.Headers.Add("ContentLength", strContentLenght.ToString)
                myWebClient.UploadString("http://10.146.102.12:8080/adminapi/resource/rarja/", "PUT", strServerFile)
            End If

Jeg modtager dog fejlen (400) Forkert anmodning

Dokumentation hentet fra http://www.cisco.com/en/US/docs/security/ise/1.2/api_ref_guide/ise_api_ref_ers1.html under External RESTful Services Requests - se fejl kode her : 

400 Bad Request
The request could not be processed because it contains missing or invalid information (such as a validation error on an input field or a missing required value).

Er der noget du kan se jeg overser fra cmd til vb?
Avatar billede arne_v Ekspert
19. december 2013 - 02:54 #15
Maaske skal du have en CookieContainer.
Avatar billede arne_v Ekspert
19. december 2013 - 02:57 #16
Du kan ogsaa proev med en:

ServicePointManager.Expect100Continue = False

aller foerst.
Avatar billede rar_jacobsen Nybegynder
19. december 2013 - 09:14 #17
Nu siger du godt nok CookieContainer ? :)

Men du kan ellers ikke se der skulle mangle noget i de to forskellige kald?
Avatar billede rar_jacobsen Nybegynder
19. december 2013 - 10:45 #18
Det virkede desværre ikke med Expect100Continue
Avatar billede rar_jacobsen Nybegynder
19. december 2013 - 21:46 #19
Hej Arne,

Jeg har lavet lidt om og så modtager en ny fejl - men den giver ikke nogen mening.

Fejlen :
System.Net.ProtocolViolationException: Du skal skrive ContentLength-byte til anmodningsstreamen, før [Begin]GetResponse kaldes. ved System.Net.HttpWebRequest.GetResponse() ved _CiscoChange.UpdateAgentSkills() i E:\Projects\Webpage\CiscoChange.aspx.vb:linje 50

Koden :
Dim strServerFile As String = Server.MapPath("~/Cisco_files/XML_masterfile.xml")
            If File.Exists(strServerFile) Then
                Dim strFile As New FileInfo(strServerFile)
                Dim strContentLenght As Long = strFile.Length
                Dim strRequestURL As String = "http://10.146.102.12:8080/adminapi/resource/rarja/"
               
                Dim myWebRequest As WebRequest = WebRequest.Create(strRequestURL)
                myWebRequest.Credentials = New System.Net.NetworkCredential("rarja", "password")
                myWebRequest.Method = "PUT"
                myWebRequest.ContentType = "Application/XML"
                myWebRequest.ContentLength = strContentLenght
               
                myWebRequest.GetRequestStream()
                Dim myWebResponse As WebResponse = myWebRequest.GetResponse()

            End If

Men jeg sætter allerede ContentLenght inden jeg kalder GetResponse? Eller gør jeg det mon forkert?
Avatar billede rar_jacobsen Nybegynder
19. december 2013 - 23:44 #20
Fik det til at virke, ændrede uploadString til uploadFile og så gik den rent igennem :)

Smider du et svar?
Avatar billede arne_v Ekspert
23. december 2013 - 04:24 #21
OK
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester