Avatar billede nzc Nybegynder
19. april 2004 - 10:59 Der er 29 kommentarer og
1 løsning

Java client til C# web service

Hej!

Jeg har en C# web service og jeg vil gerne bruge en java client til at kommunikere med denne web service. Den metode jeg vil interagere med returnere en XmlNode (.NET datatype). Denne XmlNode vil jeg gerne arbejde videre med i min java client men så vidt jeg ved findes der ikke noget tilsvarende en XmlNode i java?

Det jeg spørg om er hvordan henter jeg C# XmlNode fra C# web servicen over på min java client og hvordan transformerer jeg den til noget jeg kan arbejde med i java.

På forhånd rigtig mange tak :)

NZC
Avatar billede arne_v Ekspert
19. april 2004 - 11:05 #1
Det tætteste er vel interfacet org.w3c.dom.Node ...

Men hvis man vil lave sprog uafhængige web services så må man nøjes
med de typer som er standardiseret i SOAP.

Hvilket på mere jævnt dansk betyder at hvis du overfører den som string
så får du ingen problemer.
Avatar billede nzc Nybegynder
19. april 2004 - 11:29 #2
Det tætteste? Kan org.w3c.dom.Node ikke bruges eller?

Hvis ikke så regner jeg med at anvende en String i stedet.

Har du et hurtigt link til en go tutorial der handler om at tilgå .NET web services fra java?
Avatar billede arne_v Ekspert
19. april 2004 - 11:48 #3
Jeg har aldrig prøvet, men jeg tror ikke på at den kan bruges.
Avatar billede arne_v Ekspert
19. april 2004 - 11:56 #4
SOAP er en sprog uafhængig standard. Jeg kan ike se hvordan den skulle
kune oversætte en Systen.Xml.XmlNode til en org.w3c.dom.Node
Avatar billede arne_v Ekspert
19. april 2004 - 11:59 #5
Avatar billede arne_v Ekspert
19. april 2004 - 12:02 #6
Og en om hvorvidt implementationerne så kan det som SOAP faktisk kræver:
  http://www.mssoapinterop.org/results/resaspx.xml
Avatar billede arne_v Ekspert
19. april 2004 - 12:09 #7
Avatar billede nzc Nybegynder
19. april 2004 - 13:27 #8
Jeg har lidt nettet tyndt og fundet den her

http://www.dotnetextreme.com/code/WsJava.asp

den er brandgo hvis bare ikke jeg altid fik Http response code 500 hele tiden :(
Avatar billede nzc Nybegynder
19. april 2004 - 13:37 #9
denne kode gir response code 500

import java.net.*;
import java.io.*;
public class test {
    public byte[] marshall() {
        StringBuffer payload = new StringBuffer("<?xml version=\'1.0\' encoding=\'UTF-8\'?>");
            payload.append("<?xml version=\1.0\" encoding=\"utf-8\"?>" +
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
  "<soap:Body>"+
    "<getKeywords xmlns=\"http://tempuri.org/\">"+
      "<Lang>english</Lang>"+
    "</getKeywords>"+
  "</soap:Body>"+
"</soap:Envelope>");
        return payload.toString().getBytes();
    }
    public void post() {
        try {
            byte[] request = marshall();
            URL endpoint = new URL("http://authors.aspalliance.com/dotnetsolutions/WebService11/Service1.asmx");
            URLConnection con = endpoint.openConnection();
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setUseCaches(false);
            con.setAllowUserInteraction(false);
            con.setRequestProperty("Content-Length", Integer.toString(request.length));
            con.setRequestProperty("Content-Type", "text/xml");
            con.setRequestProperty("SOAPAction","\"http://authors.aspalliance.com/dotnetsolutions/WebService11/getKeywords\"");
            OutputStream out = con.getOutputStream();
            out.write(request);
            out.flush();
            out.close();
            InputStream in = con.getInputStream();
            int i= -1;
            while((i = in.read()) > -1) {
                System.out.print((char)i);
            }
        }
        catch(MalformedURLException e1) {
            System.out.println(e1.getMessage());
        }
        catch(IOException e2) {
            System.out.println(e2.getMessage());
        }
    }

    public static void main(String[] args) {
        test sc = new test();
        sc.marshall();
        sc.post();
    }
}
Avatar billede arne_v Ekspert
19. april 2004 - 13:48 #10
Mangler der ikke en:
  con.setRequestMethod("POST");
?
Avatar billede arne_v Ekspert
19. april 2004 - 13:48 #11
Hvorfor håndkoder du iøvrigt på Java siden ?

Hvorfor ikke generere stub kode udfra URL på WSDL ?
Avatar billede nzc Nybegynder
19. april 2004 - 13:54 #12
con.setRequestMethod("POST"); findes ikke ?!

Jeg håndkoder fordi jeg ikke ved bedre :|
Avatar billede arne_v Ekspert
19. april 2004 - 13:57 #13
Der mangler en cast.

Følgende virker:

        URL url = new URL("...");
        HttpURLConnection con = (HttpURLConnection)url.openConnection();
        con.setRequestMethod("POST");
Avatar billede arne_v Ekspert
19. april 2004 - 13:59 #14
Det giver mulighed for at bruge:

con.getResponseCode()
con.getResponseMessage()

hvilket kan være meget praktisk !
Avatar billede arne_v Ekspert
19. april 2004 - 14:01 #15
Axis kommer med en wsdl2java utility.

Du kan læse mere her:
  http://www.eksperten.dk/artikler/159

[omhandler både server og client i Axis men altså også client]
Avatar billede nzc Nybegynder
19. april 2004 - 14:19 #16
"Følgende virker:

        URL url = new URL("...");
        HttpURLConnection con = (HttpURLConnection)url.openConnection();
        con.setRequestMethod("POST");"

virker hvordan ?! Jeg får stadig response code 500

public void post() {
        try {
            byte[] request = marshall();
            URL url = new URL("http://authors.aspalliance.com/dotnetsolutions/WebService11/Service1.asmx");
        HttpURLConnection con = (HttpURLConnection)url.openConnection();
        con.setRequestMethod("POST");
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setUseCaches(false);
            con.setAllowUserInteraction(false);

            con.setRequestProperty("Content-Length", Integer.toString(request.length));
            con.setRequestProperty("Content-Type", "text/xml");
            con.setRequestProperty("SOAPAction","\"http://authors.aspalliance.com/dotnetsolutions/WebService11/getKeywords\"");
            OutputStream out = con.getOutputStream();
            out.write(request);
            out.flush();
            out.close();
            InputStream in = con.getInputStream();
            int i= -1;
            while((i = in.read()) > -1) {
                System.out.print((char)i);
            }
        }
        catch(MalformedURLException e1) {
            System.out.println(e1.getMessage());
        }
        catch(IOException e2) {
            System.out.println(e2.getMessage());
        }
    }
Avatar billede arne_v Ekspert
19. april 2004 - 14:23 #17
virker<del><del><del><del><del>compiler
Avatar billede arne_v Ekspert
19. april 2004 - 14:24 #18
Prøv lige at printe con.getResponseCode() og con.getResponseMessage()
Avatar billede nzc Nybegynder
19. april 2004 - 15:20 #19
con.getResponseCode() = 500 - Internal Server Error.
con.getResponseMessage() = null
Avatar billede nzc Nybegynder
19. april 2004 - 15:27 #20
Får du et positivt resultat når du bruger ovenstående kode eller får vi begge fejl 500?
Avatar billede nzc Nybegynder
19. april 2004 - 15:30 #21
System.out.println(con.getResponseCode() + " - " + con.getResponseMessage()); = 500 - Internal Server Error

ups :)
Avatar billede arne_v Ekspert
19. april 2004 - 23:13 #22
Jeg har fået det til at virke nu.

Du har 2 gange XML header:

StringBuffer payload = new StringBuffer("<?xml version=\'1.0\' encoding=\'UTF-8\'?>");
payload.append("<?xml version=\1.0\" encoding=\"utf-8\"?>" +
Avatar billede arne_v Ekspert
19. april 2004 - 23:14 #23
Her er en lettere pyntet udgave:

import java.net.*;
import java.io.*;

public class WSTest {
    public String marshall() {
        StringBuffer payload = new StringBuffer("<?xml version='1.0' encoding='UTF-8'?>");
        payload.append("<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>\r\n"
                    + "<soap:Body>\r\n"
                    + "<getKeywords xmlns='http://tempuri.org/'>\r\n"
                    + "<Lang>english</Lang>\r\n"
                    + "</getKeywords>\r\n"
                    + "</soap:Body>\r\n"
                    + "</soap:Envelope>\r\n");
        return payload.toString();
    }
    public void post() {
        try {
            String request = marshall();
            URL url = new URL("http://authors.aspalliance.com/dotnetsolutions/WebService11/Service1.asmx");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("POST");
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setUseCaches(false);
            con.setAllowUserInteraction(false);
            con.setRequestProperty("Content-Length", Integer.toString(request.length()));
            con.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");
            con.setRequestProperty("SOAPAction", "\"http://tempuri.org/getKeywords\"");
            OutputStream out = con.getOutputStream();
            out.write(request.getBytes());
            out.flush();
            out.close();
            System.out.println(con.getResponseCode() + " - " + con.getResponseMessage());
            InputStream in = con.getInputStream();
            byte[] b = new byte[1000];
            int n;
            while((n = in.read(b)) >= 0) {
              System.out.println(new String(b,0,n));
            }
        } catch (MalformedURLException e1) {
            System.out.println(e1.getMessage());
        } catch (IOException e2) {
            System.out.println(e2.getMessage());
        }
    }
    public static void main(String[] args) {
        WSTest sc = new WSTest();
        sc.post();
    }
}
Avatar billede arne_v Ekspert
19. april 2004 - 23:14 #24
Og et svar
Avatar billede nzc Nybegynder
20. april 2004 - 09:27 #25
Jeg har kigget på din artikkel og kommet frem til det har må virker for mig

import javax.xml.rpc.*;
import javax.xml.namespace.*;

public class yyey
{
    public static int mul(String lang) throws Exception
    {        // lookup service
        String endpoint = "http://authors.aspalliance.com/dotnetsolutions/WebService11/Service1.asmx";
        ServiceFactory servfact = ServiceFactory.newInstance();
        Provider.Service serv = servfact.createService(new QName("authors.aspalliance.com"));       
        // setup method
        Call cal = serv.createCall();
        cal.setTargetEndpointAddress(endpoint);
        cal.setOperationName(new QName("getKeywords"));
        // setup arguments
        Object[] arg = new Object[2];
        arg[0] = new String(lang);

        // call
        return ((Integer)cal.invoke(arg)).intValue();
    }
    public static void main(String[] args) throws Exception
    {
        System.out.println(mul("english"));
    }
}

men hvilken Provider er det man skal bruge i

Provider.Service serv = servfact.createService(new QName("authors.aspalliance.com"));

Jeg mangler at importe noget. Jeg har sat classpath op til at indeholde alle jar-filerne fra Axis.
Avatar billede nzc Nybegynder
20. april 2004 - 09:30 #26
ups

public static String mul(String lang) throws Exception

og

Object[] arg = new Object[1];
        arg[0] = new String(lang);

        // call
        return ((String)cal.invoke(arg));

:)
Avatar billede arne_v Ekspert
20. april 2004 - 12:44 #27
Hm.

Den web service er ikke helt nem at kalde.

Er der ikke en WSDL på den ?

Mit bedste forsøg ser ud som:

import javax.xml.rpc.*;

import javax.xml.namespace.*;

public class WSTestAxis {
    public static void main(String[] args) throws Exception {
        String endpoint =  "http://authors.aspalliance.com/dotnetsolutions/WebService11/Service1.asmx";
        ServiceFactory servfact = ServiceFactory.newInstance();
        Service serv = servfact.createService(new QName("tempuri.org"));
        Call cal = serv.createCall();
        cal.setTargetEndpointAddress(endpoint);
        cal.setOperationName(new QName("getKeywords"));
        ((org.apache.axis.client.Call)cal).setUseSOAPAction(true);
        ((org.apache.axis.client.Call)cal).setSOAPActionURI("http://tempuri.org/getKeywords");
        org.apache.axis.message.RPCParam parm = new org.apache.axis.message.RPCParam("Lang", "English");
        parm.setXSITypeGeneration(new Boolean(false));
        org.apache.axis.message.RPCElement arg = new org.apache.axis.message.RPCElement("getKeywords");
        arg.setNamespaceURI("http://tempuri.org/");
        arg.addParam(parm);
        ((org.apache.axis.client.Call)cal).invoke(arg);
    }
}

(men det virker altså ikke selvom den faktisk sender noget jeg mener er
rigtigt)
Avatar billede nzc Nybegynder
20. april 2004 - 21:32 #28
jeg faldt over dettet

http://www.websphere-world.com/static_html/was502series/part1.html

og eksemplet med amazon virker perfekt... Men vælger jeg at bruge en anden web service så får jeg ikke genereret XXXXPort klassen og lortet virker derfor ikke... :(
Avatar billede nzc Nybegynder
20. april 2004 - 21:53 #29
fik det til at virke :)
Avatar billede arne_v Ekspert
20. april 2004 - 22:12 #30
Godt.

Det burde det nu også. Axis er et ret anerkendt WS Toolkit.
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
Kategori
Kurser inden for grundlæggende programmering

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