Integratie van externe content of applicaties

Hoe integreer je externe content (of applicaties) het beste? Ik ga hier de komende tijd even induiken met wat eenvoudige demo’s en lijstjes met pro’s en con’s, maar ik zie alvast volgende mogelijkheden:

  1. server-side binnenhalen en alles in 1 html-pagina naar de browser duwen
  2. in een popup steken
  3. in een iframe zetten
  4. in een div en die vullen met behulp van een stukje ajax

De keuze voor een bepaalde oplossing hangt ongetwijfeld af van een aantal factoren:

  • is de externe content statisch of dynamisch
  • wordt die externe content snel of traag ‘opgediend’
  • is de content echt extern (i.e. van een ander domein) of gaat het over een ‘lokale’ applicatie die los van de rest van de content staat
  • wat is de impact op usability
  • wat is de impact op “searchability”

Soit, veel vragen maar nog geen mooie antwoorden (wel vage ideeën en enkele vooroordelen). Iedereen die hier een mening over heeft of links naar goeie info kent: schieten in de comments graag (staan sinds kort open voor iedereen). Ik ben er U -zoals steeds- eeuwig dankbaar voor en in ruil mogen jullie dan binnenkort een samenvatting van mijn bevindingen verwachten 🙂

10 thoughts on “Integratie van externe content of applicaties”

  1. Ik heb ooit ook voor hetzelfde probleem gestaan. Aangezien achterliggend op een andere site aangelogd moest worden met een gebruikersnaam die afhankelijk was van de ingelogde gebruiker in het eerste domein, heb ik hiervoor een heuse proxy moeten schrijven (die gebruik maakt van Jakarta commons HttpClient). De complexiteit hiervan stijgt wel; alle links dienen vertaald te worden naar het eerste domein. Wel is er dan de mogelijkheid om de content van de tweede site te wijzigen, zodat deze in de stijl van de eerste site past.
    Tegenwoordig zijn zulke proxies te vinden; bijvoorbeeld portlet bridge (http://www.portletbridge.org/) is een heel goed werkend (open source) product, dat ik ook gebruik (draait wel enkel in een portlet container).

    Reply
  2. In java heb je Sitemesh, waarmee je stukken uit externe html pagina’s kan halen en zelfs wat aanpassen.
    Ik ben eerder voorstander van een server-side oplossing, omdat je daarmee tragere externe content kunt cachen (bvb eenmaal ophalen en het volgende uur gewoon doorsturen). Voor Brussels Airport hebben we dat bijvoorbeeld gedaan met het Connections formulier met &ltc:import url=”…”> en dan daarrond een oscache tag van een uur. Hierdoor is usability en searchability ook beter omdat alles mooi als 1 html pagina naar de gebruiker gestuurd wordt. Wanneer je met iframes zou werken, wordt alles weer wat complexer (bvb links openen in het frame ipv in de pagina).
    Met Ajax kun je wel iets doen, maar dan heb je nog steeds geen searchability aangezien search engines (nog) geen javascript lezen en blokkeer je users zonder javascript (but who cares).

    Reply
  3. server-side binnenhalen en verwerken heeft zeker grote voordelen, maar is ook geen silver bullet.
    aggregatie -en daar kunnen ze hier op het werk van meespreken- kan de boel immers flink vertragen. netwerkproblemen en remote server errors kunnen roet in het eten gooien (ge kunt er maw dus maar best voor zorgen dat uw code met hangende connectie en server errors overweg kan).
    en als uw externe content meer moet ‘ververst’ worden dan de rest (cfr. arrival/departure op brussels airport) dan is server side eigenlijk geen optie?

    Reply
  4. Ik heb een gelijkaardig probleem.
    ik heb een sas server en een jsp applicatie.
    Nu staat die jsp applicatie met een tomcat en een iis op een apparte server.
    Hierdoor moet ik in de verwijzing naar een sasprogramma de naam van de sas server opgeven, echter als ik gewoon de naam of zijn ip adres opgeef lukt dit niet.
    Aan wat zou dit kunnen liggen?
    [begin code]
    Connection connection = new Connection();
    connection.setHost(“sng3pubsearch”);
    connection.setFunnel(true);
    connection.setFunnelHost(“sng3pubsearch”);
    connection.setProfileName(“local1”);
    connection.setUseProfile(true);
    Rocf rocf = new Rocf();
    // Begin code om de connectie en rocf objecten in de sessie te zetten.
    com.sas.servlet.util.BoundRocf br = new com.sas.servlet.util.BoundRocf(rocf);
    com.sas.servlet.util.BoundConnection bc = new com.sas.servlet.util.BoundConnection(connection);
    session.setAttribute(“cleanupConnection”, connection);
    session.setAttribute(“cleanupRocf”, rocf);
    session.setAttribute(“cleanupBc”, bc);
    session.setAttribute(“cleanupBr”, br);
    // Einde code om de connectie en rocf objecten in de sessie te zetten.
    session.setAttribute(“rocfAttr”,rocf);//nieuw
    com.sas.sasserver.submit.SubmitInterface si = (com.sas.sasserver.submit.SubmitInterface)
    rocf.newInstance(com.sas.sasserver.submit.SubmitInterface.class, connection);
    com.sas.servlet.util.SocketListener socket = new com.sas.servlet.util.SocketListener();
    String pgmText;
    if (request.getParameter(“V”)!=null)
    pgmText=
    “data _null_;” + “\n” +
    ” call symput(\’ond_nr\’,PUT((INPUT(\'” + request.getParameter(“V”) + “\’,HEX.)-TODAY()),Z10.));” + “\n” +
    “run;”;
    else
    pgmText =
    “%let ond_nr=”+request.getParameter(“ON”)+request.getParameter(“ON1”)+request.getParameter(“ON2″)+”;”;
    pgmText=pgmText +
    “%let UpdForm=” + session.getAttribute(“updateProfile”) + “;” + “\n” +
    “%let lang=” + Lang + “;” + “\n” +
    “libname initieel ‘d:/rawdata/ftproot/KBO/initieelprivate’;” + “\n” +
    “filename sock SOCKET ‘” + (java.net.InetAddress.getLocalHost()).getHostAddress() + “:” + socket.setup() + “‘;\n” +
    “%include \”d:/ecodata/nl/servlet/kbo_ps/sasprograms/private_onderneming_&lang..sas\”;” + “\n” +
    “%include ‘d:/ecodata/nl/servlet/kbo_ps/sasprograms/private_onderneming.sas’;”;
    socket.start();
    si.setProgramText(pgmText);
    //out.write(“” + pgmText + “”);
    //out.write(“” + si.getLastLogText() + “”);
    pgmText=” “;
    socket.write(out);
    socket.close();
    rocf.stop();
    session.removeAttribute(“rocfAttr”);
    if (logging==1)
    {
    myLog =new FileOutputStream(logFile,true);
    synchronized(myLog)
    {
    myOutput=new PrintStream(myLog);
    if (request.getParameter(“V”)!=null)
    myOutput.println(outDate + “|” + Lang + “|” + session.getId() + “|VF|” + (int)(System.currentTimeMillis()-myDate) + “|” + RR_NR);
    else myOutput.println(outDate + “|” + Lang + “|” + session.getId() + “|OF|” + (int)(System.currentTimeMillis()-myDate) + “|” + RR_NR + “|” + request.getParameter(“ON”)+request.getParameter(“ON1”)+request.getParameter(“ON2”));
    myOutput.close();
    myLog.close();
    }
    }
    }//if test==1
    %>
    [einde code]
    Alvast dank voor uw reacties.
    Groetjes
    Wim

    Reply
  5. ik ken niks van SAS en weinig van java (jsp’s) wim, maar; controleer of je wel degelijk van server A naar server B kunt over poort 80, firewalls zijn lastige dingen. en foutmeldingen en andere stacktraces kunnen altijd helpen 😉

    Reply
  6. Als ik het externe adres van de sas server gebruik krijg ik wel de volgende error message:
    java.lang.Exception: com.sas.sasserver.submit.FinalRemoteSubmitClient::creating:com.sas.sasserver.submit.Submit:caught:java.lang.Exception: com.sas.rmi.Connection::host(193.191.210.29:1099)::Cannot trap socket: java.rmi.ConnectException: Connection refused to host: 193.191.210.29; nested exception is:
    java.net.ConnectException: Operation timed out: connect
    >>> Connection expecting Middleware Server; you may need to start it.

    Reply
  7. dat je via het extern adres die foutmelding krijgt, duidt op een firewall die zijn werk doet. dat je op het intern adres niks van info terugkrijgt, maakt debuggen natuurlijk moeilijker. misschien eens kijken in de logfile op de ‘middlewareserver’ (sng3pubsearch) of daar iets relevants instaat?
    voor de rest lijkt veel van de code sas-specifiek en zul je vooral in die hoek support moeten zoeken?

    Reply

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.