Bonjour,
j'ai trouvé sur le net un exemple de code pour demander une page internet, et ce via une requête HTTP en utilisant java.nio
Voici donc la méthode que j'ai faite :
Cela marche très bien et j'ai constater une amélioration notable de la vitesse. Seulement j'aimerais bien pouvoir envoyé des données POST, et comme je ne connaissais pas les requête HTTP j'ai été me renseigné, et j'ai fini par adopter ce code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public static String fileGetContents(String url, String host, int port) throws IOException { String result = ""; SocketAddress remote = new InetSocketAddress(host, port); SocketChannel channel = SocketChannel.open(remote); String request = "GET /"+url+" HTTP/1.1\r\nUser-Agent: HTTPGrab\r\nAccept: text/*\r\nConnection: close\r\nHost: " +host + "\r\n" + "\r\n"; // System.out.println(request); ByteBuffer header = ByteBuffer.wrap(request.getBytes("US-ASCII")); channel.write(header); ByteBuffer buffer = ByteBuffer.allocate(8192); while (channel.read(buffer) != -1) { buffer.flip(); result+=decoder.decode(buffer).toString(); buffer.clear(); } channel.close(); return result; }
j'ai ensuite créer une page internet pour faire mes test :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 public static String fileGetContents(String url, String host, int port, String post) throws IOException { String result = ""; SocketAddress remote = new InetSocketAddress(host, port); SocketChannel channel = SocketChannel.open(remote); String request = "POST /"+url+" HTTP/1.1\r\nUser-Agent: HTTPGrab\r\nAccept: text/html\r\nConnection: close\r\nHost: " +host + "\r\n\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: "+post.length()+"\r\n"+post+"\r\n"; System.out.println(request); System.out.println("-------------------------"); ByteBuffer header = ByteBuffer.wrap(request.getBytes("US-ASCII")); channel.write(header); ByteBuffer buffer = ByteBuffer.allocate(8192); while (channel.read(buffer) != -1) { buffer.flip(); result+=decoder.decode(buffer).toString(); buffer.clear(); } channel.close(); return result; }
c'est cette page, qui répond 'datapost no exists ...' si on ne lui passe rien, ou 'datapost finded -> valeur_d_essai' quand on lui passe une valeur par post avec le nm de variable 'essai'. Vous pouvez tester le fonctionement de cette page grâce à cette autre page.
Bon, maintenant le code d'essai :
(la fonction que j'ai montrée plus haut est dans la class Framework).
et le résultat (très décevant) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public static void main(String[] args){ try { String result = Framework.fileGetContents("/essai.php", "www.pedagogiefondamentale.fr", 80, "essai=valeur") ; System.out.println(result); } catch (IOException e) { e.printStackTrace(); } }
(en rouge l'affichage de la requête envoyée e en bleu le résultat renvoyé les tirets c'est juste pour marquer la limite entre le deux.)
POST /essai.php HTTP/1.1
User-Agent: HTTPGrab
Accept: text/html
Connection: close
Host: www.pedagogiefondamentale.fr
Content-Type: application/x-www-form-urlencoded
Content-Length: 12
essai=valeur
-------------------------
HTTP/1.1 200 OK
Set-Cookie: mediaplan=R3721204049; path=/; expires=Wed, 21-Dec-2011 21:55:32 GMT
Date: Mon, 19 Dec 2011 09:43:46 GMT
Server: Apache/2.2.X (OVH)
X-Powered-By: PHP/5.2.17
Vary: Accept-Encoding
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html
16
datapost no exists ...
0
le requête envoyée me paraît pourtant juste ... (j'ai analysé les requête qu'envoi Firefox, et c'est sensiblement pareil).
Je suppose qu'il y a une erreur dans m'a manière d'envoyé les requête ...
Merci d'avance.
(et merci de m'avoir lu jusqu'au bout )
Partager