# URLConnection + getLastModified



## Dravere (14. Aug 2007)

Hallo zusammen,

Habe eine ganz einfache und kurze Frage. Mit URLConnection#getLastModified kann man ja das Datum abfragen, wann die Datei zuletzt geändert wurde. Ich möchte bei meinem Programm den Traffic so gering wie möglich behalten, daher bevor der Download einer Datei beginnt, soll nur das Datum geprüft werden, ob es überhaupt eine neuere Datei hat.

Wenn ich folgendes mache:

```
URL url = new URL("http://www.irgendeineurl.com/index.html");
				
URLConnection urlc = url.openConnection();
				
long lDate = urlc.getLastModified();
```
Lädt der nun die ganze Datei runter und schaut sich dann das Datum an oder holt er sich wirklich NUR das Datum? Ich habe nämlich irgendwie das Gefühl, dass er sich deutlich mehr holt (wegen den Zeiten, welche benötigt werden). Wie kann ich es erreichen, dass er sich wirklich nur das Datum holt?

Vielen Dank für die Hilfe!
Grüssli


----------



## Guest (14. Aug 2007)

Es liegt am Verbindungsaufbau. Ausserdem wird "last-modified" nicht immer bzw. nicht von jedem Server 
in den Response-Header geschrieben. Gleiches gilt auch für "content-length".


----------



## Guest (14. Aug 2007)

Anonymous hat gesagt.:
			
		

> Es liegt am Verbindungsaufbau. Ausserdem wird "last-modified" nicht immer bzw. nicht von jedem Server
> in den Response-Header geschrieben. Gleiches gilt auch für "content-length".


Tut mir leid, aber ich weiss jetzt echt nicht, wie mir das weiterhelfen soll. Was, wie, warum liegt es am Verbindungsaufbau?

Bei dem Server, bei welchem ich abfragen gehe, hat es ein "last-modified". Ein anderer Server wird nicht abgefragt, somit kann ich davon ausgehen, dass dies kein Problem darstellt.

Grüssli


----------



## SlaterB (14. Aug 2007)

heißt:
die Übertragung über 10.000km an sich ist das zeitaufwendige,
ob man dabei nur die 1kb für diese Info oder 100kb für die ganze Datei überträgt ist dann fast schon egal

wobei sehr wahrscheinlich eh die ganze Datei übertragen wird,
wonach sollte das unterschieden werden?

wenn immer nur eine Teilinfo geladen wird, wäre das ja katastrophal, 
falls ein unbedarfter User diese Operation bei jedem seiner Zugriffe aufruft


----------



## Dravere (14. Aug 2007)

SlaterB hat gesagt.:
			
		

> heißt:
> die Übertragung über 10.000km an sich ist das zeitaufwendige,
> ob man dabei nur die 1kb für diese Info oder 100kb für die ganze Datei überträgt ist dann fast schon egal


Es braucht in etwas 2 - 3 Sekunden. Ich habe zu diesem Server einen Ping von 200ms, daher mit Verarbeitungszeit usw. sollte ich wohl innert 300ms eine Antwort haben. Aber sicher nicht nach mehr als einer Sekunde. Die Dateien sind hier noch klein, später werden sie grösser. Ich kann für einen Updatevorgang, welcher alle Minuten ausgeführt wird, nicht jedesmal die ganze Datei runterladen, obwohl gar nichts neues drauf ist. Deshalb möchte ich nur dieses Datum holen gehen.



			
				SlaterB hat gesagt.:
			
		

> wobei sehr wahrscheinlich eh die ganze Datei übertragen wird,
> wonach sollte das unterschieden werden?


Ich kenne mich im HTTP-Header Protokoll Zeug nicht aus, aber hätte gedacht, dass man dort was einstellen könnte, damit nur das Datum zurück gesendet wird und nicht die ganze Datei.



			
				SlaterB hat gesagt.:
			
		

> wenn immer nur eine Teilinfo geladen wird, wäre das ja katastrophal,
> falls ein unbedarfter User diese Operation bei jedem seiner Zugriffe aufruft


Dieser Text begreife ich überhaupt nicht. Wieso ist das Katastrophal, wenn ich nur ein Datum einer Datei wissen möchte und nicht den Inhalt der ganzen Datei?

Grüssli


----------



## SlaterB (14. Aug 2007)

das ist katastrophal, weil dann jede Anfrage aus zwei Anfragen besteht,
einmal um alle oder nur diesen einen Header zu bekommen und dann noch für den Content,
würde den Aufwand verdoppeln und das unsichtbar für den User


> Ich kenne mich im HTTP-Header Protokoll Zeug nicht aus, 
> aber hätte gedacht, dass man dort was einstellen könnte, 
> damit nur das Datum zurück gesendet wird und nicht die ganze Datei. 

das ist der richtige Weg, einen bestimmten Request senden (welchen, da habe ich keine Ahnung)
aber nicht einfach eine bestimmte Info mit einer einfachen get-Operation abfragen


----------



## Dravere (14. Aug 2007)

SlaterB hat gesagt.:
			
		

> das ist der richtige Weg, einen bestimmten Request senden (welchen, da habe ich keine Ahnung)
> aber nicht einfach eine bestimmte Info mit einer einfachen get-Operation abfragen


Jetzt bin ich einfach nur baff ...
URLConnection#getLastModified ruft aus der Headerdatei das entsprechende Feld ab und gibt es dann als long zurück. Ich frage dann, ob beim aufrufen dieser Methode, die ganze Datei runtergeladen wird oder nicht und wie man es denn anstellen könnte, dass nur das Datum zurückgesendet wird, also das nichts mehrfach gemacht wird. Und dann redest du quer hinüber und herunter und wiederholst am Ende meine Frage, aber einfach als Aussage, wie man es machen sollte, aber hast keine Ahnung, wie man es tut. Super, hättest auch gleich nix sagen können ... :roll: 

Jemand hier, der eine Ahnung von HTTP Headern hat und weiss wie man diese bei einem URLConnection verändern kann? Damit der Server mir dann eben NUR das Datum schickt?

Danke.

Grüssli


----------



## Guest (14. Aug 2007)

Anonymous hat gesagt.:
			
		

> Anonymous hat gesagt.:
> 
> 
> 
> ...


Eins steht fest, es wir nicht die ganze Datei runtergeladen, nur um zu schauen, ob sich das Datum geändert hat.
Es wird der komplette Header + was sonst noch in den Puffer gerät ausgelesen. Du kannst dir auch den Code von
Sun anschauen, dann weisst du mehr.
Willst mehr Kontrolle darüber, dann setze einen HEAD-Request ab und werte den Response-Header selbst aus.
Das ganze wieder unter der Voraussetzung, dass die Gegenseite HEAD-Requests zulässt.

Übrigens, überdenke deine Tonart hier. Man hilft ungerne, wenn man dafür dumm angemacht wird.


----------



## Dravere (14. Aug 2007)

Anonymous hat gesagt.:
			
		

> Eins steht fest, es wir nicht die ganze Datei runtergeladen, nur um zu schauen, ob sich das Datum geändert hat.
> Es wird der komplette Header + was sonst noch in den Puffer gerät ausgelesen. Du kannst dir auch den Code von
> Sun anschauen, dann weisst du mehr.


Aber der Server sendet alles und das wäre schon zuviel.



			
				Anonymous hat gesagt.:
			
		

> Willst mehr Kontrolle darüber, dann setze einen HEAD-Request ab und werte den Response-Header selbst aus.
> Das ganze wieder unter der Voraussetzung, dass die Gegenseite HEAD-Requests zulässt.


Anders gesagt, es ist nicht möglich das per URLConnection zu realisieren oder sonst einer Klasse? Ich muss da über Sockets selber was schicken und dann empfangen?



			
				Anonymous hat gesagt.:
			
		

> Übrigens, überdenke deine Tonart hier. Man hilft ungerne, wenn man dafür dumm angemacht wird.


Ich benutze immer die Tonart, welche angebracht ist. Wenn mir jemand hilft, dann bin ich ganz normal. Wenn jemand aber um den Brei drumherum redet und am Ende einem einfach nur verwirrt, aber selber anscheinend auch nix davon versteht, dann bin ich halt schon ein wenig genervt. Denn die ersten Posts sind wertvoll. Viele Helfer schauen sich Threads mit mehreren Antworten gar nicht mehr an, weil sie denken, dass demjenigen schon geholfen wird/wurde.

Grüssli und danke


----------



## André B. (15. Aug 2007)

Du kannst den Server die Überprüfung durchführen lassen. Dazu musst du den "If-Modified-Since"-Header setzen.
http://java.sun.com/j2se/1.5.0/docs/api/java/net/URLConnection.html#setIfModifiedSince(long)
So sollte der Server die Datei nur senden, wenn sie neuer als der Timestamp ist, den du übergibst. Dann überprüfst du einfach den Response Code. Der sollte dann entweder
200 ( http://java.sun.com/j2se/1.5.0/docs/api/java/net/HttpURLConnection.html#HTTP_OK )  sein, wenn die Datei auf dem Server neuer ist oder 
304 ( http://java.sun.com/j2se/1.5.0/docs/api/java/net/HttpURLConnection.html#HTTP_NOT_MODIFIED ) , wenn sie nicht neuer ist.
Mfg André


----------



## SlaterB (15. Aug 2007)

(schade dass hier bei solchen Umgangston immer noch geantwortet wird)


----------



## Dravere (15. Aug 2007)

And hat gesagt.:
			
		

> Du kannst den Server die Überprüfung durchführen lassen. Dazu musst du den "If-Modified-Since"-Header setzen.
> http://java.sun.com/j2se/1.5.0/docs/api/java/net/URLConnection.html#setIfModifiedSince(long)
> So sollte der Server die Datei nur senden, wenn sie neuer als der Timestamp ist, den du übergibst. Dann überprüfst du einfach den Response Code. Der sollte dann entweder
> 200 ( http://java.sun.com/j2se/1.5.0/docs/api/java/net/HttpURLConnection.html#HTTP_OK )  sein, wenn die Datei auf dem Server neuer ist oder
> ...


Hey, vielen Dank! Perfekt! Genau das was ich gesucht hatte.
Das ist eine super Hilfe, bzw. Antwort. Ein Posting, alles ist klar, schön verlinkt, einfach perfekt 

@SlaterB,
Mein Umgangston gilt nur dir. Ich bin auch "Helfer" in einem anderen Forum bei einer anderen Programmiersprache. Wichtigste Grundregel: Helfe jemandem nur, wenn du auch etwas von dem Thema verstehst, zu welchem er eine Frage hat.
Fasse es also als Kritik auf 

Grüssli


----------



## Dante (17. Aug 2007)

http kennt die sogenannte HEAD-Methode (andere methoden wären GET oder POST oder so), diese gibt nur die Header einer ANfrage zurück, nicht die Payload. würde sich hier also auch anbieten. wie irgendwer aber schon gesagt hat, bringt das fast nix, da kaum ein server wirklich weiss, wann sich was geändert hat. Bei downloads bzw. dem direkten Abfragen von Dateien könnte da sgehen. Sobald die Datei aber zB. von PHP ausgeliefert wird, müsste der Programmierer sich selbst um den Header kümmern und das tut wohl kaum einer.


----------



## Dravere (18. Aug 2007)

Dante hat gesagt.:
			
		

> http kennt die sogenannte HEAD-Methode (andere methoden wären GET oder POST oder so), diese gibt nur die Header einer ANfrage zurück, nicht die Payload. würde sich hier also auch anbieten.


Jo, aber wenn du einen HEAD sendest, bekommst die Header, merkst das die Sache abgelaufen ist und sendest nochmals eine Anfage, diesmal GET, um die Sache zu holen. Da ist if-last-modified wirklich besser 
Danke trotzdem.



			
				Dante hat gesagt.:
			
		

> wie irgendwer aber schon gesagt hat, bringt das fast nix, da kaum ein server wirklich weiss, wann sich was geändert hat. Bei downloads bzw. dem direkten Abfragen von Dateien könnte da sgehen. Sobald die Datei aber zB. von PHP ausgeliefert wird, müsste der Programmierer sich selbst um den Header kümmern und das tut wohl kaum einer.


Es sind *.xml dateien, welche jedes mal wenn neue vorhanden sind, neu kompiliert und auf den Server hochgeladen werden. 

Dank euch und einer Überarbeitung des Updatevorgangs (Threads) gab es nun eine 10-Fache Beschleunigung ^^

Grüssli


----------

