+++
title = "soap"
draft = false
tags = [
"code",
"java",
"soap"
]
date = "2013-03-12"
+++
# code:java >> Soap
### Een simpele SOAP Client maken als Unit Test
```java
@Test
public void processManageCustomers() throws Exception {
URL url = new URL("http://localhost:8888/bla");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
setSOAPPostHeaders(conn);
IOUtils.copy(new FileInputStream(new File("src/test/resources/example.xml")), conn.getOutputStream());
String result = IOUtils.toString(conn.getInputStream());
assertThat(result).contains("something");
}
private void setSOAPPostHeaders(HttpURLConnection conn) throws ProtocolException {
conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
conn.setRequestProperty("SOAPAction", "");
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
}
```
Gebruik makende van `apache commons`
### Endpoint URL met JAX-WS goed zetten
Twee mogelijkheden:
ofwel zit de URL juist op de server in de WSDL, in dat geval kan je de gegenereerde Service aanmaken met een url naar de remote WSDL:
```java
BlaService service = new BlaService(new URL("http://server.com/soapaction?wsdl"), new QName("namespace.com", "localpart"));
service.getPort().doStuff();
```
Deze gaat van de wsdl dit uitlezen:
```xml
```
Als dat verkeerd geconfigureerd staat heb je nog een tweede mogelijkheid, via property `BindingProvider.ENDPOINT_ADDRESS_PROPERTY`:
```java
try {
EmployeeServiceService service = new EmployeeServiceService();
EmployeeService port = service.getEmployeeServicePort();
BindingProvider bp = (BindingProvider)port;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://server1.grallandco.com:8282/HumanRessources/EmployeeServiceService");
Employee emp = port.getEmployee(123);
// continue doing stuff
```
Zie http://tugdualgrall.blogspot.be/2009/02/jax-ws-how-to-configure-service-end_17.html
### Logging enablen voor Sun JAX-WS
Gemakkelijke methode :met een JVM argument: `-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump="true"`
Moeilijke methode: met een `HandlerResolver` die tussen de chain in hangt (weet niet meer precies hoe dat moet, op te zoeken)
### Multipart SOAP Stub server maken
#### Response opbouwen
Zie http://www.java2s.com/Open-Source/Java-Document/Groupware/hipergate/com/oreilly/servlet/MultipartResponse.java.htm
Aandachtspuntjes:
1. content type in de HEADER meesturen (niet als `servlet output stream.println()`): `multipart/related`
2. Per part moet "Content-Id" meegestuurd worden. Voor een binair stuk moet dat dan overeenkomen met de HREF dat in uw SOAP XML envelop zit:
3. Binaire gegevens gewoon als byte array wegscvhrijven met `stream.write()`, maar vergeet niet content type op dit part op `application/octet-stream` te zetten.
```xml
```
Hierboven is de content id 0ba91... zonder "cid".