Avatar billede spyrodrag Nybegynder
31. juli 2008 - 20:35 Der er 12 kommentarer og
1 løsning

Java axis webservice kald

Jeg har nogle udfordringer med at kalde en .NET Webservice. Koden fejler på denne linje:
javax.xml.rpc.Service serv = servfact.createService(new QName("localhost"));

String endpoint = "http://localhost:80/Services/VideoService.asmx";
try
{
    javax.xml.rpc.ServiceFactory servfact = javax.xml.rpc.ServiceFactory.newInstance();
    javax.xml.rpc.Service serv = servfact.createService(new QName("localhost"));
   
    javax.xml.rpc.Call cal = serv.createCall();
    cal.setTargetEndpointAddress(endpoint);
    cal.setOperationName(new QName("SaveVideo"));
   
    Object[] arg = new Object[1];
    arg[0] = (String)clientName;
    cal.invoke(arg);
    return true;
}
catch (Exception se)
{
    return false;
}
Avatar billede arne_v Ekspert
31. juli 2008 - 20:44 #1
Hvis du udskrev exception tekst, saa kunne vi faa nogle hints til hvad problemet er.

Generelt er det nemmere at lade Axis generere en stub fremfor selv at kode mod API'et.
Avatar billede spyrodrag Nybegynder
01. august 2008 - 13:19 #2
Jeg kigger lige på den exception tekst i aften. Kan du give et eksempel på hvordan du ville benytte Axis i stedet?
Avatar billede arne_v Ekspert
01. august 2008 - 14:41 #3
Jeg ville bruge WSDL2Java utility til at generere en stub med. En stub er en Java
klasse som genereres automatisk. Saa kan man i sin kode bare kalde metoder i
stub koden og saa tager den sig af alle de mystisk udseende kald i web service
API'et.

http://www.eksperten.dk/artikler/159 er gammel, men princippet duer stadig.
Avatar billede spyrodrag Nybegynder
01. august 2008 - 21:45 #4
hej igen... Jeg er kommet forbi første fejl, men nu har jeg problemer med cal.invoke(arg). Kunne jeg få dig til at lave et kode eksempel der virker med en c# service der ser sådan her ud:

namespace Services
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    public class VideoService : System.Web.Services.WebService
    {
        [WebMethod]
        public void SaveVideo(string videoName)
        {
            // hurra!
        }
    }
}
Avatar billede arne_v Ekspert
01. august 2008 - 22:47 #5
Gerne.

Men jeg har allerede en anelse.

Så vidt jeg husker har javax.xml.rpc et problem med WS-I 1.1 attributten.
Avatar billede arne_v Ekspert
01. august 2008 - 22:50 #6
Det virker hvis du genererer stub.

Ellers bliver du nødt til caste dit cal object til org.apache.axis.client.Call
for at få adgang til den nødvendige metode.

Men jeg prøver lige at bixe et komplet eksempel.
Avatar billede arne_v Ekspert
02. august 2008 - 00:46 #7
Jeg huskede rigtigt.

Prøv:

        String endpoint = "http://localhost:80/VideoService.asmx";
        try
        {
            javax.xml.rpc.ServiceFactory servfact = javax.xml.rpc.ServiceFactory.newInstance();
            javax.xml.rpc.Service serv = servfact.createService(new QName("localhost"));
         
            javax.xml.rpc.Call cal = serv.createCall();
            cal.setTargetEndpointAddress(endpoint);
            cal.setOperationName(new QName("http://tempuri.org/", "SaveVideo"));
            cal.setProperty(javax.xml.rpc.Call.SOAPACTION_USE_PROPERTY, true);
            cal.setProperty(javax.xml.rpc.Call.SOAPACTION_URI_PROPERTY, "http://tempuri.org/SaveVideo");
            cal.setProperty(javax.xml.rpc.Call.ENCODINGSTYLE_URI_PROPERTY , "literal");
            ((org.apache.axis.client.Call)cal).addParameter(new QName("http://tempuri.org/", "videoName"), XMLType.XSD_STRING, String.class, ParameterMode.IN);
            cal.setReturnType(XMLType.XSD_STRING);
            Object[] arg = new Object[1];
            arg[0] = (String)clientName;
            cal.invoke(arg);
            return true;
        }
        catch (Exception se)
        {
            se.printStackTrace();
            return false;
        }
Avatar billede arne_v Ekspert
02. august 2008 - 00:46 #8
Og vil du undgå at blive vanvittig, så lad Axis generere den stub.
Avatar billede spyrodrag Nybegynder
02. august 2008 - 10:51 #9
Tusind tak, du må meget gerne smide et svar. Din kode virker perfekt :-)
Avatar billede spyrodrag Nybegynder
02. august 2008 - 11:38 #10
Hvor meget skal der til for at kalde den anden vej? (.NET -> Java)
Avatar billede arne_v Ekspert
02. august 2008 - 14:55 #11
svar
Avatar billede arne_v Ekspert
02. august 2008 - 14:57 #12
.NET er grundliggende det samme.

Du deployer din Java web service på Tomcat eller en anden server.

Du giver .NET URL på WSDL og lader .NET generere en stub (i Visual Studio
kalde de det "web reference").


Og så kalder du stub som al anden kode.
Avatar billede spyrodrag Nybegynder
02. august 2008 - 15:37 #13
Merci
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