PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] Wie? Kommunizieren mit Webseite?


Unfug
2006-12-31, 13:53:49
Hallo,

weiß jemand wie man mit einer Webseite kommunizieren kann? Im wesentlichen sind es GET Anfragen.
www.xxx.de/abc.php?p=5432

ich möchte die dann angezeigte webseite haben (also den quellcode quasi).

mein bisheriger code kann nur direkte eine datei auslesen wwww.xxx.de/datei.html


public static void main(String args[])
{
URLConnection connect;
try {
connect = ( new URL ("http://www.google.de" ) ) .openConnection ( );

InputStream is = connect.getInputStream ( ) ;
BufferedReader URLinput = new BufferedReader(new InputStreamReader(is));
String line = "";
while ((line = URLinput.readLine()) != null)
{
System.out.println(line+"\n");

}
URLinput.close();

} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

also
www.google.de geht, aber nicht
http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=3dc

danke

Shink
2006-12-31, 16:05:45
Probier mal HTTPClient von den Apache Commons, die nehmen dir da viel Arbeit ab:
http://jakarta.apache.org/commons/httpclient/tutorial.html

Thorn of Roses
2007-01-01, 20:21:06
Ich kenne die URL klasse nicht und weiss somit auch nicht genau nach welchen kriterien die die MalformedURLException schmeisst, aber nachdem die einen String erwartet könnte man den auch einfach dynamisch generieren oder?

also einfach die GET komponente hinten anhängen?

Aber vielleicht hab ichs auch falsch verstanden (bin noch Anfänger :) )

mit rätselnden Grüssen,

-Thorn-

Köppchen
2007-01-02, 14:36:21
Du hättest gleich etwas mehr Info alles in deine Anfrage setzen können, das hätte vielleicht eher zu einer Anwort geführt.
Wenn ich das Codefragment mit der von dir eingetragenen URL in eine Klasse setze, so bekomme ich einen HTTP Statuscode 403 von Google.
Das bedeutet Google liefert bei dieser Anfrage einen Fehler (Siehe auch dort: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html). Scheinbar will google nicht das man Anfragen in dieser Art an Google sendet. Wenn ich eine solche URL an Yahoo sende, so klappt das (Beispiel url: http://de.search.yahoo.com/search?p=abc&fr=FP-tab-web-t340&ei=UTF-8&meta=vl%3D ).

Gruß Markus

EDIT: an der URL hängende Klammer nach URL verschoben.

Unfug
2007-01-02, 14:49:49
shink: noch habe ich den httpclient nicht zum laufen bekommen. bin noch dran.

zu den anderen: die einfach übergabe des ganzen strings funktioniert nicht. das yahoo vielleicht grad nicht meckert muss an yahoo liegen. aber generell gehen solche links nicht. selbst wenn man ein php script selbst auf einem eigenen server packt.
die URL klasse teilt nämlich schneidet nämlich automatisch den host ab. ich bin noch am werkeln.
gruß

UliBär
2007-01-02, 14:56:21
(...)
www.google.de geht, aber nicht
http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=3dcVermutlich, weil Java den String als Unicode liefert, in der URL aber UTF-8 als Encoding definiert wird?

[edit] HTTP 403 = forbidden. Vermutlich will Google hier einen Referrer von sich selbst sehen.

[edit2] Könnte auch am User-Agent der JVM liegen. Vielleicht mal Mozilla/5.0 als User-Agent mitschicken?

Thorn of Roses
2007-01-02, 15:05:55
Der folgende Teil aus der API Spec dürfte dir eventuell weiterhelfen.

URL

public URL(URL context,
String spec)
throws MalformedURLException

Creates a URL by parsing the given spec within a specified context. The new URL is created from the given context URL and the spec argument as described in RFC2396 "Uniform Resource Identifiers : Generic * Syntax" :

<scheme>://<authority><path>?<query>#<fragment>


The reference is parsed into the scheme, authority, path, query and fragment parts. If the path component is empty and the scheme, authority, and query components are undefined, then the new URL is a reference to the current document. Otherwise, the fragment and query parts present in the spec are used in the new URL.

If the scheme component is defined in the given spec and does not match the scheme of the context, then the new URL is created as an absolute URL based on the spec alone. Otherwise the scheme component is inherited from the context URL.

If the authority component is present in the spec then the spec is treated as absolute and the spec authority and path will replace the context authority and path. If the authority component is absent in the spec then the authority of the new URL will be inherited from the context.

If the spec's path component begins with a slash character "/" then the path is treated as absolute and the spec path replaces the context path.

Otherwise, the path is treated as a relative path and is appended to the context path, as described in RFC2396. Also, in this case, the path is canonicalized through the removal of directory changes made by occurences of ".." and ".".

For a more detailed description of URL parsing, refer to RFC2396.

Parameters:
context - the context in which to parse the specification.
spec - the String to parse as a URL.
Throws:
MalformedURLException - if no protocol is specified, or an unknown protocol is found.
See Also:
URL(java.lang.String, java.lang.String, int, java.lang.String), URLStreamHandler, URLStreamHandler.parseURL(java.net.URL, java.lang.String, int, int)

Der dazugehörige Standard: http://www.ietf.org/rfc/rfc2396.txt

mit hoffentlich hilfreichen Grüssen,

-Thorn-

Köppchen
2007-01-03, 00:12:51
Komisch, wenn ich eine eigene URL aufrufe klappt das auch problemlos mit allen Parametern, wie eben auch bei Yahoo.
Um genauer zu verstehen was bei dir passiert könntest du folgendes machen:
Saug dir einen HTTP Proxy der alles mitloggt, am besten als Plugin für deine IDE. Dann starte dein Programm mit angabe des Proxys (Wie das geht steht dort: http://www.rgagnon.com/javadetails/java-0085.html). Dann kannst du dir einfach ansehen was versendet und empfangen wird ohne groß einen Debugger zu bemühen.
Wenn du exakt verstehen willst was bei der HTTP Kommunikation passiert musst du in der HTTP Spezifikation lesen um exakter zu verstehen was du machst, den Link findest du ja schon in meinem ersten Post. Warum google den Request ablehnt dazu gabs ja schon ideen.

Gruß Markus

Shink
2007-01-04, 18:33:49
shink: noch habe ich den httpclient nicht zum laufen bekommen. bin noch dran.

Öhm... tatsächlich? Was genau ist denn das Problem? Man benötigt noch commons-logging.jar im Classpath. Das Ganze sollte dann so in der Art aussehen:

HttpClient client = new HttpClient();
GetMethod method = new GetMethod("http://www.xxx.de/abc.php");
method.setQueryString(new NameValuePair[]{new NameValuePair("p", "5432")});
int statusCode = client.executeMethod(method);
String responseBody = new String(method.getResponseBody());

Unfug
2007-01-04, 21:04:38
danke das hat funktioniert