# Webservice per URL ansprechen



## majin (1. Aug 2011)

Vermutlich ein leidiges Thema, aber weil ich neu in der Materie bin, fällt mir das suchen atm etwas schwer, weil ich nicht weiß was ich suche.

Folgendes ist stand der Dinge, ich hab mir einen Webservice geschrieben


```
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class MyWeb {

     public MyWeb() {
     }

     @WebMethod
     public String getData(String data) {
    	 User user = new User(data);
         XStream xstream = new XStream(new JettisonMappedXmlDriver());
         xstream.setMode(XStream.NO_REFERENCES);
         xstream.alias("User", User.class);
         
         System.out.println( xstream.toXML(user));
         
         return xstream.toXML(user);
     }
}
```

ganz simpel und der xStream parsed das ganze nur nach Json, nicht spannendes.

Server

```
public class WebServer {
    public static void main(String[] args) {
    	MyWeb server = new MyWeb();
        Endpoint endpoint = Endpoint.publish("http://localhost:8080/MyWeb", server);
    }
}
```

Wenn der Server nun gestartet ist, dann ist zwar alles toll, aber das einzige was ich finde, ist wie man einen Client dafür schreibt, das hab ich dann zwar erstmal gemacht, weil ich dachte so komm ich dem Thema näher und komme selbst auf die Lösung, aber leider wars das nicht.
Ich kann zwar nun ne Anfrage senden, allerdings nicht per URL.
Muss ich dafür n HTTPServlet schreiben? Das ist das einzige was mir grad einfällt, vllt hat auch jmd.
n Link parat?

Ich danke schonmal für Eure Hilfe


----------



## Gelöschtes Mitglied 5909 (2. Aug 2011)

Was du warscheinlich machen willst ist einen REST Webservice schreiben.
Was du geschrieben hast ist ein SOAP WebService.
Da kann man nicht mal eben per url drauf (mehr als die wsdl wirst du normalerweise nicht sehen).
Man kann aber tools wie soap-ui verwenden um das ganze zu testen.


----------



## majin (2. Aug 2011)

Das ist doch mal n Tipp 
danke... werd ich mir direkt mal anschauen


----------



## majin (8. Aug 2011)

Bevor ich einen neuen Thread aufmache, führe ich den lieber weiter.

Ich hab hab mich nun mit REST Webservices beschäftigt. Und hab auch was geschrieben.
Allerdings weiß ich nicht warum er tut, was er tut.

Ein paar Zeilen meinerseits:


```
@XmlRootElement
public class User {
	private String name;

	public String getUser() {
		return name;
	}
	public void setUser(String name) {
		this.name = name;
	}
}
```

und ...


```
@Path("/user")
public class UserResource {
	@GET
	@Path("{username}")
	@Produces(MediaType.APPLICATION_JSON)
	public User getJSON(@PathParam("username") String userName) {
		User user = new User();
		user.setUser(userName);
		return user;
	}
}
```

Wenn ich nun dads ganze anzeigen lassen will mit:


```
http://localhost:8080/GF/rest/user/Peter
```

bietet er mir an eine Datei runterzuladen die dann genau JSON beinhaltet.
Mir fällt beim schreiben gerade auf, dass ich vmtl. eine HTML Seite schreiben muss, damit er weiß
wo er das anzeigen muss? Aber erstmal Mittag 
Falls das jemand liest bevor ich es ausprobiere, wäre es nett zu schreiben, ob ich richtig liege oder
wie ich es besser machen kann, danke soweit


----------



## nillehammer (8. Aug 2011)

Kurz zum Hintergrund: Bei RESTfull-Webservices wird sehr stark danach getrennt, ob ein Request Daten nur abruft oder Daten auf dem Server ändert. Für den Datenabruf wird ein sog. GET-Request verwendet (im Prinzip ne URL mit Suchparametern, dabei hat sich das Schema /parameter1/unterparameter2/... durchgesetzt). Das hast Du gemacht und bekommst das Ergebnis der Abfrage in einer maschinenlesbaren Form (JSON). Vielfach wird auch XML für die Antwort verwendet.

Soll der Aufruf Daten verändern, werden sog. POST-Requests (PUT lassen wir jetzt mal weg) benutzt. Das ist im Prinzip so, als wenn Du ein Formular ausfüllst und den Submit-Button drückst. Hier werden die Daten nicht in der URL übergeben, sondern an den Request angehängt.

Wie Du schon siehst, haben Webservices eine gewisse Ähnlichkeit mit dem Abruf von Webseiten uind dem Absenden von Daten mittels Formularen. ABER, Webservices sind dazu da, dass Anwendungen untereinander Daten austauschen. Wenn Du willst, dass Html herauskommt, dann schreib eine normale Webanwendungm, keinen Webservice.


----------



## majin (8. Aug 2011)

Hey und danke für deine Antwort 
XML hab ich bewusst nicht genommen, ich wollte das schon in Json haben.
Ich möchte das auch genau dafür benutzen, mein CMS soll sich Daten aus der DB
holen können und daher dachte ich wäre ein Webservice ganz gut dafür, hab damit aber
leider null Erfahrung und fange grad ganz vorne an, wie man ja deutlich sieht^^

Daher reicht mir auch GET, und nein, ich wollte das nicht in HTML darstellen und bis dato gelingt
mir auch nichts dergleichen, wollte nur n schnellen Dummy schreiben, damit ich keine Frage
nach einem download bekomme. Daher der Gedanke an HTML 

Edith: Weiter komme ich im Moment wenig, wenn ich mir n HTML Dokument erstelle und den JSON Output darstellen will, was muss ich dann dafür tun?
Wenn ich einen GET Request per HTML Formular abschicke erstellt er mir obv.:


```
http://localhost:8080/GF/rest/user?name=asd
```

und damit kann ich nichts anfangen, weil der richtige Aufruf ja:


```
http://localhost:8080/GF/rest/user/asd
```

wäre. Also im Moment stehe ich da auf dem Schlauch.


----------



## nillehammer (8. Aug 2011)

Der GET-Request, wie Du ihn gemacht hast (http://localhost:8080/GF/rest/user/asd) war schon richtig so. Das kann man mit URL machen. Das mit den Formularen hab ich nur erwähnt, um den Unterschied zum POST-Request zu erklären.

Dass Du einen Downloaddialog siehst, liegt daran, dass der Browser nicht weiß, wie er mit dem ContentType (@Produces(MediaType.APPLICATION_JSON)) Deines Responses umgehen soll. Du müsstest im Response einen ContentType setzen, mit dem der Browser umgehen kann. Schau mal, was es in der Enumeration "MediaType" noch so für ContentTypes gibt. Ideal wäre einer, mit dem sowohl die Clientanwendung als auch der Browser umgehen können. Falls es das nicht gibt, schreib eine zweite Methode, die der Browser aufruft.

[Edit1]
Ich sehe gerade, Du benutzt wohl JAX-RS. Dort ist MediaType garkeine Enumeration, sondern eine Klasse mit Konstanten. Und es gibt keinen MedaType, der für beides passt, also extra Methode für Darstellung in Browser. 
[/Edit1]


----------



## Gelöschtes Mitglied 5909 (10. Aug 2011)

Man kann sowohl mit xml als auch mit json gleichzeitig arbeiten:


```
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
```

Der Browser verwendet dann XML (weil er weiß wie er das anzeigen kann) und andere clients können JSON verwenden (weniger overhead)


----------



## majin (14. Aug 2011)

Sry das ich solange nicht geantwortet hab.



nillehammer hat gesagt.:


> ...
> 
> [Edit1]
> Ich sehe gerade, Du benutzt wohl JAX-RS. Dort ist MediaType garkeine Enumeration, sondern eine Klasse mit Konstanten. Und es gibt keinen MedaType, der für beides passt, also extra Methode für Darstellung in Browser.
> [/Edit1]



Hmmm, mit extra Methode meinst du was genau?
Ich hab PlugIns gefunden zum Darstellen von JSON, aber sonst?

@rail, vielen Dank 
Das kannte ich schon, möchte das ganze aber nur über JSON zurückgeben und XML
aussenvor lassen.


----------



## TheDarkRose (15. Aug 2011)

Du könntest dir auch Curl runterladen. Ist ein REST-Konsolenclient womit du ganz einfach deine Anfragen an deinen Webservice senden kannst und die JSON Antwort schön auf der Konsole ausgegeben bekommst.


----------



## majin (15. Aug 2011)

Ähm ja, netter Tip, danke, hilft bei meiner Frage aber nicht wirklich weiter.


----------



## TheDarkRose (15. Aug 2011)

Ähm, doch, weil Curl ein richtiger REST-Client ist. Das was du mit HTML ausgabe und HTML formularen machen willst, ist in diesem fall totaler murks.


----------



## majin (15. Aug 2011)

Hmmm, ich möchte aber nicht auf ein Tool angewiesen sein, ich will ja vom CMS einen Request an meinen Webservice schicken und der gibt dann xy zurück und xy ist dann n Link oder ne id or whatever und soll
dann entweder als Verweis genutzt werden können oder angezeigt werden.


----------



## TheDarkRose (16. Aug 2011)

Ja, da musst du aber für das CMS ein Plugin programmieren, das REST-Request abschicken kann und den JSON String auswertet.


----------



## Effad (6. Sep 2011)

Noch als Nebenbemerkung: Wenn dein Browser Firefox ist, kannst du z.B. JSONovich als Add-On installieren, dann wird JSON inline und hübsch formatiert angezeigt ;-).


----------

