Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Java/PHP] HashMap over SOAP

Pagina: 1
Acties:

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Ben bezig met het ontwikkelen van een web service. De server is gebouwd in Java (GlassFish) met NetBeans. De client is gebouwd in PHP. De service werkt met SOAP over HTTP.

Probeer om een ArrayList gevuld met HashMaps te verwerken in de PHP client, echter zonder succes. Deze (tijdelijke) code gebruik ik aan de Java-kant:

Java:
1
2
3
4
5
6
7
8
9
10
11
@WebMethod(operationName = "searchEntries")
    public java.util.ArrayList<HashMap<String, String>> searchEntries(String query) {
        ArrayList<HashMap<String, String>> entries = new ArrayList<HashMap<String, String>>();
        
        HashMap<String,String> map = new HashMap<String,String>();
        map.put("foo", "bar");
        map.put("bar", "foo");
        entries.add(map);
        
        return entries;
    }


In de web service tester lijkt alles goed te gaan:

code:
1
2
3
Method returned

java.util.List : "[org.me.o9000kb.HashMap@4a4f38]"


Vervolgens voer ik dit uit aan de client side:

PHP:
1
2
3
4
5
<?php
ini_set('soap.wsdl_cache_enabled', "0");
$client = new SoapClient('http://localhost:8080/O9000KBWS/O9000KBWS?WSDL');
print_r($client->searchEntries());
?>


Maar dan blijkt er een leeg object terug gestuurd te worden:

code:
1
2
3
4
5
6
7
stdClass Object
(
    [return] => stdClass Object
        (
        )

)


Kennelijk kan PHP niet met de ArrayList gevuld met HashMaps overweg. Had gehoopt dat de data zonder problemen in PHP verwerkt kon worden, maar dat blijkt dus niet het geval.

Hoe kan ik ervoor zorgen dat de data in PHP gelezen kan worden?

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Vanwaar SOAP? Dit doet me denken aan deze vraag, en het top-answer:
I built one of the first SOAP servers, including code generation and WSDL generation, from the original spec as it was being developed, when I was working at Hewlett-Packard. I do NOT recommend using SOAP for anything.

The acronym "SOAP" is a lie. It is not Simple, it is not Object-oriented, it defines no Access rules. It is, arguably, a Protocol. It is Don Box's worst spec ever, and that's quite a feat, as he's the man who perpetrated "COM".

There is nothing useful in SOAP that can't be done with REST for transport, and JSON, XML, or even plain text for data representation. [...]
Met JAX-RS kun je prima json genereren. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Er zijn inderdaad genoeg argumenten om niet voor SOAP te kiezen, maar de keuze lag helaas niet bij mij. :)

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Hoe ziet je SOAP bericht er nu echt uit dan?

Het feit dat de informatie aan de Java-kant in een ArrayList van HashMaps was opgeslagen, lijkt me na omzetten naar SOAP totaal niet meer relevant.

De vraag is dus hoe de SOAP structuur er uit ziet en wat die PHP SoapClient daar mee kan.

"Any sufficiently advanced technology is indistinguishable from magic."


  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Herko_ter_Horst schreef op maandag 27 mei 2013 @ 12:30:
Hoe ziet je SOAP bericht er nu echt uit dan?

Het feit dat de informatie aan de Java-kant in een ArrayList van HashMaps was opgeslagen, lijkt me na omzetten naar SOAP totaal niet meer relevant.

De vraag is dus hoe de SOAP structuur er uit ziet en wat die PHP SoapClient daar mee kan.
Makes sense.

Even gecheckt, en er blijkt weinig zinvolle data in te staan:

XML:
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:searchEntriesResponse xmlns:ns2="http://o9000kb.me.org/">
            <return/>
        </ns2:searchEntriesResponse>
    </S:Body>
</S:Envelope>


Kennelijk wordt de HashMap niet goed omgezet naar SOAP.

  • Laurens-R
  • Registratie: December 2002
  • Laatst online: 29-12-2024
Ligt er uberhaubt wel een ontwerp van alle interfaces?

Ik heb altijd het meeste gezeur gehad met code waarin gemakkelijk een 1 of andere data structure geretourneerd werd wat in veel gevallen gewoon niet werkte of eigenlijk te complex was om mee te werken vanuit een service perspectief. Probeer je maar eens in te beelden hoe een HashMap er uberhaubt uit ziet als je deze serialized naar XML.

Misschien is het handig om of je presentatie/structuur van de interfaces en data na te denken.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22-11 13:46

Janoz

Moderator Devschuur®

!litemod

Het is heel ongebruikelijk om zulke specifieke types terug te geven, zeker in het geval van een service. Gebruik daarvoor gewoon de interfaces. Je aanroep zal in dat geval zoiets als dit moeten worden:

Java:
1
2
3
4
5
6
7
8
9
10
11
@WebMethod(operationName = "searchEntries") 
    public List<Map<String, String>> searchEntries(String query) { 
        List<Map<String, String>> entries = new ArrayList<Map<String, String>>(); 
         
        Map<String,String> map = new HashMap<String,String>(); 
        map.put("foo", "bar"); 
        map.put("bar", "foo"); 
        entries.add(map); 
         
        return entries; 
    }


Het zou heel goed kunnen dat de marshaller daar een stuk beter me om weet te gaan.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Sowieso zou ik beginnen met het installeren van SoapUI om je webservice mee te testen. Het is een onmisbare tool omdat je erg simpel de request-response berichten kunt maken / laten zien. Je kunt ook mockservices laten maken of SoapUI als proxy tussen de service en de client laten bestaan.

Daarnaast is het gebruikelijk om contract-first te werken: je maakt eerst een WSDL aan en aan de hand daarvan kan je WS framework wel de java classes voor je uitgenereren. Jouw bean-first approach levert vaak enorme problemen op omdat de WSDL er door 't framework bijverzonnen wordt en over het algemeen alleen door datzelfde framework begrepen wordt (en afgezien daarvan vaak veel complexer is dan nodig).

https://niels.nu

Pagina: 1