Comment envoyer une requête HTTP en Java?

En Java, comment composer un message de requête HTTP et l’envoyer à un serveur Web HTTP?

Vous pouvez utiliser java.net.HttpUrlConnection .

Exemple ( d’ici ), avec des améliorations. Inclus en cas de pourriture des liens:

public static Ssortingng executePost(Ssortingng targetURL, Ssortingng urlParameters) { HttpURLConnection connection = null; try { //Create connection URL url = new URL(targetURL); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.setRequestProperty("Content-Length", Integer.toSsortingng(urlParameters.getBytes().length)); connection.setRequestProperty("Content-Language", "en-US"); connection.setUseCaches(false); connection.setDoOutput(true); //Send request DataOutputStream wr = new DataOutputStream ( connection.getOutputStream()); wr.writeBytes(urlParameters); wr.close(); //Get Response InputStream is = connection.getInputStream(); BufferedReader rd = new BufferedReader(new InputStreamReader(is)); SsortingngBuilder response = new SsortingngBuilder(); // or SsortingngBuffer if Java version 5+ Ssortingng line; while ((line = rd.readLine()) != null) { response.append(line); response.append('\r'); } rd.close(); return response.toSsortingng(); } catch (Exception e) { e.printStackTrace(); return null; } finally { if (connection != null) { connection.disconnect(); } } } 

Du tutoriel Java d’Oracle

 import java.net.*; import java.io.*; public class URLConnectionReader { public static void main(Ssortingng[] args) throws Exception { URL yahoo = new URL("http://www.yahoo.com/"); URLConnection yc = yahoo.openConnection(); BufferedReader in = new BufferedReader( new InputStreamReader( yc.getInputStream())); Ssortingng inputLine; while ((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close(); } } 

Je sais que d’autres recommanderont le client http d’Apache, mais cela ajoute de la complexité (c.-à-d. Plus de choses qui peuvent mal tourner) qui est rarement justifiée. Pour une tâche simple, java.net.URL fera l’affaire.

 URL url = new URL("http://www.y.com/url"); InputStream is = url.openStream(); try { /* Now read the resortingeved document from the stream. */ ... } finally { is.close(); } 

Apache HttpComponents . Les exemples pour les deux modules – HttpCore et HttpClient vous permettront de démarrer tout de suite.

HttpUrlConnection n’est pas un mauvais choix, HttpComponents résumera une grande partie du fastidieux codage. Je recommanderais ceci, si vous voulez vraiment supporter beaucoup de serveurs / clients HTTP avec un code minimum. Par ailleurs, HttpCore pourrait être utilisé pour des applications (clients ou serveurs) avec des fonctionnalités minimales, tandis que HttpClient doit être utilisé pour les clients nécessitant la prise en charge de plusieurs schémas d’authentification, prise en charge des cookies, etc.

Voici un programme complet de Java 7:

 class GETHTTPResource { public static void main(Ssortingng[] args) throws Exception { try (java.util.Scanner s = new java.util.Scanner(new java.net.URL("http://tools.ietf.org/rfc/rfc768.txt").openStream())) { System.out.println(s.useDelimiter("\\A").next()); } } } 

Le nouveau try-with-resources va fermer automatiquement le scanner, qui ferme automatiquement le InputStream.

Le client Google java http a une belle API pour les requêtes http. Vous pouvez facilement append le support JSON, etc.

 import com.google.api.client.http.GenericUrl; import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpResponse; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import java.io.IOException; import java.io.InputStream; public class Network { static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport(); public void getRequest(Ssortingng reqUrl) throws IOException { GenericUrl url = new GenericUrl(reqUrl); HttpRequest request = HTTP_TRANSPORT.createRequestFactory().buildGetRequest(url); HttpResponse response = request.execute(); System.out.println(response.getStatusCode()); InputStream is = response.getContent(); int ch; while ((ch = is.read()) != -1) { System.out.print((char) ch); } response.disconnect(); } } 

Cela vous aidera. N’oubliez pas d’append le HttpClient.jar JAR HttpClient.jar au classpath.

 import java.io.FileOutputStream; import java.io.IOException; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; public class MainSendRequest { static Ssortingng url = "http://localhost:8080/HttpRequestSample/RequestSend.jsp"; public static void main(Ssortingng[] args) { //Instantiate an HttpClient HttpClient client = new HttpClient(); //Instantiate a GET HTTP method PostMethod method = new PostMethod(url); method.setRequestHeader("Content-type", "text/xml; charset=ISO-8859-1"); //Define name-value pairs to set into the QuerySsortingng NameValuePair nvp1= new NameValuePair("firstName","fname"); NameValuePair nvp2= new NameValuePair("lastName","lname"); NameValuePair nvp3= new NameValuePair("email","email@email.com"); method.setQuerySsortingng(new NameValuePair[]{nvp1,nvp2,nvp3}); try{ int statusCode = client.executeMethod(method); System.out.println("Status Code = "+statusCode); System.out.println("QuerySsortingng>>> "+method.getQuerySsortingng()); System.out.println("Status Text>>>" +HttpStatus.getStatusText(statusCode)); //Get data as a Ssortingng System.out.println(method.getResponseBodyAsSsortingng()); //OR as a byte array byte [] res = method.getResponseBody(); //write to file FileOutputStream fos= new FileOutputStream("donepage.html"); fos.write(res); //release connection method.releaseConnection(); } catch(IOException e) { e.printStackTrace(); } } } 

Vous pouvez utiliser Socket pour cela comme

 Ssortingng host = "www.yourhost.com"; Socket socket = new Socket(host, 80); Ssortingng request = "GET / HTTP/1.0\r\n\r\n"; OutputStream os = socket.getOutputStream(); os.write(request.getBytes()); os.flush(); InputStream is = socket.getInputStream(); int ch; while( (ch=is.read())!= -1) System.out.print((char)ch); socket.close(); 

Il existe un excellent lien sur l’envoi d’une requête POST ici par Example Depot ::

 try { // Construct data Ssortingng data = URLEncoder.encode("key1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8"); data += "&" + URLEncoder.encode("key2", "UTF-8") + "=" + URLEncoder.encode("value2", "UTF-8"); // Send data URL url = new URL("http://hostname:80/cgi"); URLConnection conn = url.openConnection(); conn.setDoOutput(true); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(data); wr.flush(); // Get the response BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); Ssortingng line; while ((line = rd.readLine()) != null) { // Process line... } wr.close(); rd.close(); } catch (Exception e) { } 

Si vous souhaitez envoyer une demande GET, vous pouvez modifier légèrement le code en fonction de vos besoins. Plus précisément, vous devez append les parameters dans le constructeur de l’URL. Ensuite, commentez également cette wr.write(data);

Une chose qui n’a pas été écrite et dont vous devez vous méfier, ce sont les délais. Surtout si vous voulez l’utiliser dans WebServices, vous devez définir des délais d’attente, sinon le code ci-dessus attendra indéfiniment ou pour un temps très long au moins et c’est probablement quelque chose que vous ne voulez pas.

Les délais d’attente sont définis comme ceci: conn.setReadTimeout(2000); le paramètre d’entrée est en millisecondes