# Direkter Zugriff auf Servlet- doPost



## Generic1 (6. Aug 2010)

Hallo,

ich hätte eine Frage zum direkten Zugriff auf doPost eines Servlets und zwar hab ich bei meinem WebProjekt eine index.jsp mit einem Button, wenn ich den Button klicke, dann wird die Methode doPost aufgerufen und im Browser die URL http://localhost:8080/getData angezeigt.

Wenn ich diesen Link http://localhost:8080/getData aber direkt im Browser eingebe, wird die Methode doPost nicht aufgerufen.
Wie kann ich es machen, dass es auch ohne index.jsp funktioniert, so dass ich die URL im Browser eingeben kann und dann die Methode doPost aufgerufen wird?


----------



## maki (6. Aug 2010)

> Wie kann ich es machen, dass es auch ohne index.jsp funktioniert, so dass ich die URL im Browser eingeben kann und dann die Methode doPost aufgerufen wird?


Gar nicht.

Den Unterschied zwischen einem GET und POST Request müsstest du eigentlich schon wissen, wenn nicht solltest du jetzt nachlesen.


----------



## Generic1 (6. Aug 2010)

Wie interpretierst du das:


```
Deploy the web app in tomcat and check if you see the xml by calling your servlet url (tomcathost:port/FlexExample/getData) from your browser.
```

von diesem Link: 

Flex with Java Servlets: how to use XML from an HttpService to populate a Data Grid(Table) | DevRecipes

Wie ist das dann gemeint?


----------



## maki (6. Aug 2010)

> Wie ist das dann gemeint?


Was meinst du?
Was hat ein (wahrscheinlich fehlerhaftes, siehe vorletztes Kommentar) Flex Beispiel mit deiner Frage zu tun?

Interessant für dich ist nur diese Frage:
Was ist den Unterscheid zwischen einem GET Request und einem POST Request? 


Wenn du den Code in doPost aufrufen willst. musst du eben einem POST Request absetzen, keinen GET Request.


----------



## Generic1 (6. Aug 2010)

Es geht aber auch nicht in der doGet Methode, wo ich erwartet hätte, dass diese über die URL erreichbar ist.


----------



## maki (6. Aug 2010)

Generic1 hat gesagt.:


> Es geht aber auch nicht in der doGet Methode, wo ich erwartet hätte, dass diese über die URL erreichbar ist.


Dann benutzt du entweder die falsche URL oder machst etwas anderes falsch


----------



## Generic1 (7. Aug 2010)

Hallo,

also es funktioniert jetzt mit dem unteren Flex- Code und ich erhalte die Daten vom Servlet,
ich habe jetzt als Methode "POST" ausgewählt, es funktioniert noch immer aber es wird auch noch immer die doGet- Methode des Servlets aufgerufen, Das ist mir nicht klar warum.

Die XML- Datei, die ich auf dem Server habe, hat eine unbestimmte Größe, wenn diese also zu groß ist, hab ich mit GET ein Problem, da das Ergebnis an die URL angehängt wird und nur eine bestimmte Größe haben darf.

Kann sich das jemand erklären, warum das POST im unteren Flex- Code keine wirkung zeigt?


```
<mx:HTTPService  id="myService"
		url="http://localhost:8080/FlexServletTest/FrontendServlet"
		resultFormat="e4x"
		result="onResult(event)"
		fault="onFault(event)"
		method="POST">
	</mx:HTTPService>
```


----------



## JanHH (8. Aug 2010)

Vielleicht stell ich mir das zu einfach vor, aber normalerweise kann man get und post identisch behandeln.. indem die eine immer die andere aufruft:


```
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
   doGet(request, response);
}
	
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
   ...
}
```


----------



## Generic1 (9. Aug 2010)

Das würde dann heißen, dass der Request per "GET" zum Server (Servlet -> doGet(...)) kommt, dieser Request dann zur Methode doPost weitergeleitet wird und ein response per "POST" an den Client gesendet wird?
Das kann ich mir jetzt nicht vorstellen, dass das so ist,  oder?

Wie seht ihr die Problematik, wenn ich mit "GET" die XML- Datei abfrage und wenn diese XML- Datei zu groß wird, dass ich dann Probleme bekomme?

Und warum das "method="POST"" im unteren Code nicht anschlägt ist mir gänzlich ein Rätsel -> Bewirkt nämlich überhaupt nichts.


```
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
   doPost(request, response);
}
	
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{ 
    final PrintWriter writer=response.getWriter();
    writer.println("<?xml version=\"1.0\"?>\n");
...
}
```


```
<mx:HTTPService  id="httpXmlDataService" url="http://localhost:8080/getData"
						resultFormat="e4x" result="resultHandler(event)" fault="faultHandler(event)"
						useProxy="false"
						method="POST">
	 	</mx:HTTPService>
```


----------



## ARadauer (9. Aug 2010)

> wird und ein response per "POST" an den Client gesendet wird?


per POST oder GET wird gar nix an den Client gesendet!
Das sind die Request Methoden und die gehen immer zum Server!
Hypertext Transfer Protocol ? Wikipedia

der Aufruf doGet in doPost, bedeutet eigentlich nur, dass POST und GET das selbe machen... was ja eigentlich immer der Fall ist...


----------



## maki (9. Aug 2010)

[quot6e]Wie seht ihr die Problematik, wenn ich mit "GET" die XML- Datei abfrage und wenn diese XML- Datei zu groß wird, dass ich dann Probleme bekomme?[/quote]
Genau, deswegen sollte man da auch ein POST Request nutzen 



> Und warum das "method="POST"" im unteren Code nicht anschlägt ist mir gänzlich ein Rätsel -> Bewirkt nämlich überhaupt nichts.


Mir auch, ist aber auch kein Java Problem 
Der Client entscheidet ob ein POST oder GET gesendet wird.

Nebenbei, ja, man kann POST und GET Requests in Java Servlets gleich behandeln, löst aber nicht die Probleme die man mit GET und großen Datenmengen bekommt.


----------



## mvitz (9. Aug 2010)

ARadauer hat gesagt.:


> ...der Aufruf doGet in doPost, bedeutet eigentlich nur, dass POST und GET das selbe machen... was ja eigentlich immer der Fall ist...


Nicht, wenn man eine REST Architektur umsetzt 

Aber ansonsten hat ARadauer recht, wenn man in die doGet-Methode einen Aufruf an die doPost-Methode delegiert, dann machen halt beide Methoden dasselbe, der Request bleibt aber natürlich ein GET-Request.

EDIT: Zitat eingefügt zum besseren Verständis


----------



## Generic1 (9. Aug 2010)

ARadauer hat gesagt.:


> per POST oder GET wird gar nix an den Client gesendet!
> Das sind die Request Methoden und die gehen immer zum Server!
> Hypertext Transfer Protocol ? Wikipedia
> 
> der Aufruf doGet in doPost, bedeutet eigentlich nur, dass POST und GET das selbe machen... was ja eigentlich immer der Fall ist...




Ok, das ist klar, da hab ich was verwechselt, also man kann dann sagen, dass es eine Einschränkung bei der Kommunikation zwischen Client und Server gibt, wenn der Client vom Server per "GET" etwas anfragt, da die Parameter mit GET an die URL angehängt werden, 
das Versenden der Daten vom Server zum Client hat mit GET oder POST nichts zu tun und deshalb gibt es auch keine Einschränkung bezüglich der Datenmenge?

Ist das richtig formuliert?. 
lg


----------



## Gelöschtes Mitglied 5909 (9. Aug 2010)

1. Es gibt eine maximale länge der URL
2. Steht die längengröße mit sicherheit auch im Standard (HTTP 1.0/1.1)
3. Wie willst du mit get Binärdaten Übertragen (z.b. ein Bild)

Schau dir am besten mal die Header an


----------



## maki (9. Aug 2010)

raiL hat gesagt.:


> 1. Es gibt eine maximale länge der URL
> 2. Steht die längengröße mit sicherheit auch im Standard (HTTP 1.0/1.1)
> 3. Wie willst du mit get Binärdaten Übertragen (z.b. ein Bild)


1. Ja, aber die variiert
2. leider nein
3. per Base64

@ Generic1
Bei der Request Method handelt es sich eben um die *Request*-Methode, der Response wird vom Server geschickt, kann sonstwie kodiert sein.


----------



## Generic1 (10. Aug 2010)

Also zur Vollständigkeit, um den Thread zu vervollständigen, wenn man im ActionScript folgendes macht:


```
httpXmlDataService.method = "POST";
httpXmlDataService.contentType = "text/xml";  
httpXmlDataService.send("request");
```

dann schickt AS3 die Anfrage mit POST.
lg


----------

