Java - envoi de paramètres HTTP via la méthode POST facilement

319

J'utilise avec succès ce code pour envoyer des HTTPdemandes avec certains paramètres via la GETméthode

void sendRequest(String request)
{
    // i.e.: request = "http://example.com/index.php?param1=a&param2=b&param3=c";
    URL url = new URL(request); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();           
    connection.setDoOutput(true); 
    connection.setInstanceFollowRedirects(false); 
    connection.setRequestMethod("GET"); 
    connection.setRequestProperty("Content-Type", "text/plain"); 
    connection.setRequestProperty("charset", "utf-8");
    connection.connect();
}

Maintenant, je devrai peut-être envoyer les paramètres (c'est-à-dire param1, param2, param3) via la POSTméthode car ils sont très longs. Je pensais ajouter un paramètre supplémentaire à cette méthode (ie String httpMethod).

Comment modifier le moins possible le code ci-dessus pour pouvoir envoyer des paramètres via GETou POST?

J'espérais que changer

connection.setRequestMethod("GET");

à

connection.setRequestMethod("POST");

aurait fait l'affaire, mais les paramètres sont toujours envoyés via la méthode GET.

A HttpURLConnectionune méthode qui pourrait aider? Existe-t-il une construction Java utile?

Toute aide serait très appréciée.

dan
la source
Les paramètres de publication sont envoyés dans la section d'en-tête http et non dans l'URL. (votre URL de publication serait http://example.com/index.php)
dacwe
2
aucune méthode setRequestMethod dans Java 1.6 n'est
ante.sabo
2
Cast it to Http (s) UrlConnection ....
Peter Kriens
étendre la question! Quelqu'un sait-il comment envoyer une pièce jointe comme paramètre de publication ...
therealprashant
1
Pourquoi le premier extrait de code commence-t-il par le mot-clé "fonction"?
Llew Vallis

Réponses:

470

Dans une demande GET, les paramètres sont envoyés dans le cadre de l'URL.

Dans une requête POST, les paramètres sont envoyés sous forme de corps de la requête, après les en-têtes.

Pour effectuer un POST avec HttpURLConnection, vous devez écrire les paramètres dans la connexion après avoir ouvert la connexion.

Ce code devrait vous aider à démarrer:

String urlParameters  = "param1=a&param2=b&param3=c";
byte[] postData       = urlParameters.getBytes( StandardCharsets.UTF_8 );
int    postDataLength = postData.length;
String request        = "http://example.com/index.php";
URL    url            = new URL( request );
HttpURLConnection conn= (HttpURLConnection) url.openConnection();           
conn.setDoOutput( true );
conn.setInstanceFollowRedirects( false );
conn.setRequestMethod( "POST" );
conn.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded"); 
conn.setRequestProperty( "charset", "utf-8");
conn.setRequestProperty( "Content-Length", Integer.toString( postDataLength ));
conn.setUseCaches( false );
try( DataOutputStream wr = new DataOutputStream( conn.getOutputStream())) {
   wr.write( postData );
}
Alan Geleynse
la source
40
@Alan Geleynse: 'url.openconnection ()' n'ouvre pas la connexion. Dans le cas où vous ne spécifiez pas une instruction connect (), la connexion est ouverte lorsque vous écrivez dans le corps de la requête http / entendu et l'envoyez. J'ai essayé cela avec des certificats. La prise de contact SSL n'a lieu qu'après avoir appelé Connect ou lorsque vous avez envoyé des données au serveur.
Ashwin
14
getBytes () utilise le jeu de caractères par défaut de l'environnement, PAS UTF-8 charset = utf-8 doit suivre le type de contenu: application / x-www-form-urlencoded; charset = utf-8 Vous effectuez la conversion d'octets deux fois dans l'exemple. Devrait faire: byte [] data = urlParameters.getData ("UTF-8"); connection.getOutputStream (). write (data); inutile de fermer ET de vider ET de déconnecter
Peter Kriens
8
@PeterKriens Merci pour votre ajout - je pense que vous vouliez dire byte[] data = urlParameters.getBytes(Charset.forName("UTF-8")):).
gerrytan
7
@AlanGeleynse Ne manquez pas wr.flush (); et wr.close (); à la fin?
confile le
9
Comment se fait-il que cela ait autant de votes positifs, si cela ne fonctionne pas? Vous devez appeler l'un conn.getResponseCode()ou l' conn.getInputStream()autre, sinon il n'enverra aucune donnée.
Imaskar
229

Voici un exemple simple qui soumet un formulaire puis vide la page de résultats System.out. Modifiez l'URL et les paramètres POST selon le cas, bien sûr:

import java.io.*;
import java.net.*;
import java.util.*;

class Test {
    public static void main(String[] args) throws Exception {
        URL url = new URL("http://example.net/new-message.php");
        Map<String,Object> params = new LinkedHashMap<>();
        params.put("name", "Freddie the Fish");
        params.put("email", "[email protected]");
        params.put("reply_to_thread", 10394);
        params.put("message", "Shark attacks in Botany Bay have gotten out of control. We need more defensive dolphins to protect the schools here, but Mayor Porpoise is too busy stuffing his snout with lobsters. He's so shellfish.");

        StringBuilder postData = new StringBuilder();
        for (Map.Entry<String,Object> param : params.entrySet()) {
            if (postData.length() != 0) postData.append('&');
            postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
            postData.append('=');
            postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
        }
        byte[] postDataBytes = postData.toString().getBytes("UTF-8");

        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
        conn.setDoOutput(true);
        conn.getOutputStream().write(postDataBytes);

        Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

        for (int c; (c = in.read()) >= 0;)
            System.out.print((char)c);
    }
}

Si vous voulez que le résultat soit Stringimprimé au lieu de le faire directement:

        StringBuilder sb = new StringBuilder();
        for (int c; (c = in.read()) >= 0;)
            sb.append((char)c);
        String response = sb.toString();
Boann
la source
C'est la meilleure réponse car elle inclut l'encodage des paramètres et l'utilisation de Map.
Airy
4
Malheureusement, ce code suppose que l'encodage du contenu est UTF-8, ce qui n'est pas toujours le cas. Pour récupérer le jeu de caractères, il faut obtenir l'en-tête Content-Typeet analyser le jeu de caractères de cela. Lorsque cet en- tête ne sont pas disponibles, utilisez le standard http: ISO-8859-1.
engineercoding
@Aprel IFTFY ... utiliser des expressions avec des effets secondaires dans les évaluations est vraiment moche.
1
@engineercoding Malheureusement pour HTML, c'est encore plus difficile que de le faire complètement correctement, car il pourrait aussi y avoir une nomenclature Unicode, ou un en <meta charset="...">- <meta http-equiv="Content-Type" content="...">tête ou dans le document qui doit être analysé.
Boann
1
@Nepster Ne fais pas ça. response += line;est incroyablement lent et mange les sauts de ligne. J'ai ajouté à la réponse un exemple d'obtention d'une réponse de chaîne.
Boann
63

Je n'ai pas pu obtenir l'exemple d' Alan pour faire le post, alors je me suis retrouvé avec ceci:

String urlParameters = "param1=a&param2=b&param3=c";
URL url = new URL("http://example.com/index.php");
URLConnection conn = url.openConnection();

conn.setDoOutput(true);

OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());

writer.write(urlParameters);
writer.flush();

String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

while ((line = reader.readLine()) != null) {
    System.out.println(line);
}
writer.close();
reader.close();         
Craigo
la source
1
Malheureusement, ce code ne lit pas la réponse. Il lit le formulaire vide html.
Kovács Imre
ce que je devais ajouter à l'exemple d'alan était d'ouvrir le flux de réponse. avant de l'avoir fait, aucun octet n'a été envoyé.
beefeather
1
La suppression de l'appel writer.close () l'a fait pour moi.
Maxime T
23

je trouve HttpURLConnection vraiment très lourd à utiliser. Et vous devez écrire beaucoup de code passe-partout, sujet aux erreurs. J'avais besoin d'un wrapper léger pour mes projets Android et je suis sorti avec une bibliothèque que vous pouvez également utiliser: DavidWebb .

L'exemple ci-dessus pourrait être écrit comme ceci:

Webb webb = Webb.create();
webb.post("http://example.com/index.php")
        .param("param1", "a")
        .param("param2", "b")
        .param("param3", "c")
        .ensureSuccess()
        .asVoid();

Vous pouvez trouver une liste de bibliothèques alternatives sur le lien fourni.

hgoebl
la source
1
Je ne vais pas voter, car votre message était moins une réponse et plus une annonce ... mais, j'ai joué avec votre bibliothèque et j'aime ça. Très succinct; beaucoup de sucre syntaxique; si vous utilisez Java comme un peu un langage de script comme je le fais, c'est une excellente bibliothèque pour ajouter très rapidement et efficacement des interactions http. Le passe-partout zéro est parfois précieux et il peut avoir été utile au PO.
Dean
3
Je vais voter. J'ai utilisé avec succès DavidWebb dans l'une de mes applications, et je le ferai pour deux autres que je développerai bientôt. Très simple d'utilisation.
William T. Mallard
Merci, l'utilisation de DefaultHttpClient avec https sur Android échoue avec SSLPeerUnverifiedException: pas de certificat d'homologue (même sur les certificats https correctement signés), l'utilisation de l'URL est fastidieuse (paramètres d'encodage, vérification du résultat). L'utilisation de DavidWebb a fonctionné pour moi, merci.
Martin Vysny
pas de support AsyncTask? Donc, verrouiller le thread d'interface utilisateur par défaut ... c'est mauvais
slinden77
C'est une bibliothèque très basique. Le programmeur doit l'appeler depuis background-thread, dans AsyncTask, dans IntentService, dans Synchronization Handler et autres. Et cela ne dépend pas d'Android -> peut également être utilisé dans Java SE et EE.
hgoebl
12

j'ai lu les réponses ci-dessus et j'ai créé une classe utilitaire pour simplifier la requête HTTP. j'espère que cela vous aidera.

Appel de méthode

  // send params with Hash Map
    HashMap<String, String> params = new HashMap<String, String>();
    params.put("email","[email protected]");
    params.put("password","12345");

    //server url
    String url = "http://www.example.com";

    // static class "HttpUtility" with static method "newRequest(url,method,callback)"
    HttpUtility.newRequest(url,HttpUtility.METHOD_POST,params, new HttpUtility.Callback() {
        @Override
        public void OnSuccess(String response) {
        // on success
           System.out.println("Server OnSuccess response="+response);
        }
        @Override
        public void OnError(int status_code, String message) {
        // on error
              System.out.println("Server OnError status_code="+status_code+" message="+message);
        }
    });

Classe utilitaire

import java.io.*;
import java.net.*;
import java.util.HashMap;
import java.util.Map;
import static java.net.HttpURLConnection.HTTP_OK;

public class HttpUtility {

 public static final int METHOD_GET = 0; // METHOD GET
 public static final int METHOD_POST = 1; // METHOD POST

 // Callback interface
 public interface Callback {
  // abstract methods
  public void OnSuccess(String response);
  public void OnError(int status_code, String message);
 }
 // static method
 public static void newRequest(String web_url, int method, HashMap < String, String > params, Callback callback) {

  // thread for handling async task
  new Thread(new Runnable() {
   @Override
   public void run() {
    try {
     String url = web_url;
     // write GET params,append with url
     if (method == METHOD_GET && params != null) {
      for (Map.Entry < String, String > item: params.entrySet()) {
       String key = URLEncoder.encode(item.getKey(), "UTF-8");
       String value = URLEncoder.encode(item.getValue(), "UTF-8");
       if (!url.contains("?")) {
        url += "?" + key + "=" + value;
       } else {
        url += "&" + key + "=" + value;
       }
      }
     }

     HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
     urlConnection.setUseCaches(false);
     urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // handle url encoded form data
     urlConnection.setRequestProperty("charset", "utf-8");
     if (method == METHOD_GET) {
      urlConnection.setRequestMethod("GET");
     } else if (method == METHOD_POST) {
      urlConnection.setDoOutput(true); // write POST params
      urlConnection.setRequestMethod("POST");
     }

     //write POST data 
     if (method == METHOD_POST && params != null) {
      StringBuilder postData = new StringBuilder();
      for (Map.Entry < String, String > item: params.entrySet()) {
       if (postData.length() != 0) postData.append('&');
       postData.append(URLEncoder.encode(item.getKey(), "UTF-8"));
       postData.append('=');
       postData.append(URLEncoder.encode(String.valueOf(item.getValue()), "UTF-8"));
      }
      byte[] postDataBytes = postData.toString().getBytes("UTF-8");
      urlConnection.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
      urlConnection.getOutputStream().write(postDataBytes);

     }
     // server response code
     int responseCode = urlConnection.getResponseCode();
     if (responseCode == HTTP_OK && callback != null) {
      BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
      StringBuilder response = new StringBuilder();
      String line;
      while ((line = reader.readLine()) != null) {
       response.append(line);
      }
      // callback success
      callback.OnSuccess(response.toString());
      reader.close(); // close BufferReader
     } else if (callback != null) {
      // callback error
      callback.OnError(responseCode, urlConnection.getResponseMessage());
     }

     urlConnection.disconnect(); // disconnect connection
    } catch (IOException e) {
     e.printStackTrace();
     if (callback != null) {
      // callback error
      callback.OnError(500, e.getLocalizedMessage());
     }
    }
   }
  }).start(); // start thread
 }
}
Pankaj Kant Patel
la source
10

Je vois que d'autres réponses ont donné l'alternative, je pense personnellement que vous faites intuitivement la bonne chose;). Désolé, chez devoxx où plusieurs orateurs se sont moqués de ce genre de choses.

C'est pourquoi j'utilise personnellement les bibliothèques HTTPClient / HttpCore d'Apache pour faire ce genre de travail, je trouve que leur API est plus facile à utiliser que le support HTTP natif de Java. YMMV bien sûr!

Martijn Verburg
la source
10
import java.net.*;

public class Demo{

  public static void main(){

       String data = "data=Hello+World!";
       URL url = new URL("http://localhost:8084/WebListenerServer/webListener");
       HttpURLConnection con = (HttpURLConnection) url.openConnection();
       con.setRequestMethod("POST");
       con.setDoOutput(true);
       con.getOutputStream().write(data.getBytes("UTF-8"));
       con.getInputStream();

    }

}
Manish Mistry
la source
5
WTH import java.net.*;!
Yousha Aleayoub
4

J'ai eu le même problème. Je voulais envoyer des données via POST. J'ai utilisé le code suivant:

    URL url = new URL("http://example.com/getval.php");
    Map<String,Object> params = new LinkedHashMap<>();
    params.put("param1", param1);
    params.put("param2", param2);

    StringBuilder postData = new StringBuilder();
    for (Map.Entry<String,Object> param : params.entrySet()) {
        if (postData.length() != 0) postData.append('&');
        postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
        postData.append('=');
        postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
    }
    String urlParameters = postData.toString();
    URLConnection conn = url.openConnection();

    conn.setDoOutput(true);

    OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());

    writer.write(urlParameters);
    writer.flush();

    String result = "";
    String line;
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

    while ((line = reader.readLine()) != null) {
        result += line;
    }
    writer.close();
    reader.close()
    System.out.println(result);

J'ai utilisé Jsoup pour l'analyse:

    Document doc = Jsoup.parseBodyFragment(value);
    Iterator<Element> opts = doc.select("option").iterator();
    for (;opts.hasNext();) {
        Element item = opts.next();
        if (item.hasAttr("value")) {
            System.out.println(item.attr("value"));
        }
    }
SergeyUr
la source
4

Méthode GET et POST définie comme ceci ... Deux types d'appels API: 1) get () et 2) post (). get () pour obtenir la valeur du tableau api json pour obtenir la valeur et la méthode post () utilisée dans notre publication de données en url et obtenir une réponse.

 public class HttpClientForExample {

    private final String USER_AGENT = "Mozilla/5.0";

    public static void main(String[] args) throws Exception {

        HttpClientExample http = new HttpClientExample();

        System.out.println("Testing 1 - Send Http GET request");
        http.sendGet();

        System.out.println("\nTesting 2 - Send Http POST request");
        http.sendPost();

    }

    // HTTP GET request
    private void sendGet() throws Exception {

        String url = "http://www.google.com/search?q=developer";

        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(url);

        // add request header
        request.addHeader("User-Agent", USER_AGENT);

        HttpResponse response = client.execute(request);

        System.out.println("\nSending 'GET' request to URL : " + url);
        System.out.println("Response Code : " + 
                       response.getStatusLine().getStatusCode());

        BufferedReader rd = new BufferedReader(
                       new InputStreamReader(response.getEntity().getContent()));

        StringBuffer result = new StringBuffer();
        String line = "";
        while ((line = rd.readLine()) != null) {
            result.append(line);
        }

        System.out.println(result.toString());

    }

    // HTTP POST request
    private void sendPost() throws Exception {

        String url = "https://selfsolve.apple.com/wcResults.do";

        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(url);

        // add header
        post.setHeader("User-Agent", USER_AGENT);

        List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
        urlParameters.add(new BasicNameValuePair("sn", "C02G8416DRJM"));
        urlParameters.add(new BasicNameValuePair("cn", ""));
        urlParameters.add(new BasicNameValuePair("locale", ""));
        urlParameters.add(new BasicNameValuePair("caller", ""));
        urlParameters.add(new BasicNameValuePair("num", "12345"));

        post.setEntity(new UrlEncodedFormEntity(urlParameters));

        HttpResponse response = client.execute(post);
        System.out.println("\nSending 'POST' request to URL : " + url);
        System.out.println("Post parameters : " + post.getEntity());
        System.out.println("Response Code : " + 
                                    response.getStatusLine().getStatusCode());

        BufferedReader rd = new BufferedReader(
                        new InputStreamReader(response.getEntity().getContent()));

        StringBuffer result = new StringBuffer();
        String line = "";
        while ((line = rd.readLine()) != null) {
            result.append(line);
        }

        System.out.println(result.toString());

    }

}
Chirag Patel
la source
3

Essayez ce modèle:

public static PricesResponse getResponse(EventRequestRaw request) {

    // String urlParameters  = "param1=a&param2=b&param3=c";
    String urlParameters = Piping.serialize(request);

    HttpURLConnection conn = RestClient.getPOSTConnection(endPoint, urlParameters);

    PricesResponse response = null;

    try {
        // POST
        OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
        writer.write(urlParameters);
        writer.flush();

        // RESPONSE
        BufferedReader reader = new BufferedReader(new InputStreamReader((conn.getInputStream()), StandardCharsets.UTF_8));
        String json = Buffering.getString(reader);
        response = (PricesResponse) Piping.deserialize(json, PricesResponse.class);

        writer.close();
        reader.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

    conn.disconnect();

    System.out.println("PricesClient: " + response.toString());

    return response;
}

public static HttpURLConnection getPOSTConnection(String endPoint, String urlParameters) {

    return RestClient.getConnection(endPoint, "POST", urlParameters);

}


public static HttpURLConnection getConnection(String endPoint, String method, String urlParameters) {

    System.out.println("ENDPOINT " + endPoint + " METHOD " + method);
    HttpURLConnection conn = null;

    try {
        URL url = new URL(endPoint);
        conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod(method);
        conn.setDoOutput(true);
        conn.setRequestProperty("Content-Type", "text/plain");

    } catch (IOException e) {
        e.printStackTrace();
    }

    return conn;
}
Pablo Rodriguez Bertorello
la source
3

Cette réponse couvre le cas spécifique de l'appel POST utilisant un POJO Java personnalisé.

Utilisation de la dépendance maven pour maven Gson pour sérialiser notre objet Java en JSON.

Installez Gson en utilisant la dépendance ci-dessous.

<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.8.5</version>
  <scope>compile</scope>
</dependency>

Pour ceux qui utilisent Gradle, vous pouvez utiliser ce qui suit

dependencies {
implementation 'com.google.code.gson:gson:2.8.5'
}

Autres importations utilisées:

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.*;
import org.apache.http.impl.client.CloseableHttpClient;
import com.google.gson.Gson;

Maintenant, nous pouvons aller de l'avant et utiliser le HttpPost fourni par Apache

private CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost("https://example.com");

Product product = new Product(); //custom java object to be posted as Request Body
    Gson gson = new Gson();
    String client = gson.toJson(product);

    httppost.setEntity(new StringEntity(client, ContentType.APPLICATION_JSON));
    httppost.setHeader("RANDOM-HEADER", "headervalue");
    //Execute and get the response.
    HttpResponse response = null;
    try {
        response = httpclient.execute(httppost);
    } catch (IOException e) {
        throw new InternalServerErrorException("Post fails");
    }
    Response.Status responseStatus = Response.Status.fromStatusCode(response.getStatusLine().getStatusCode());
    return Response.status(responseStatus).build();

Le code ci-dessus reviendra avec le code de réponse reçu de l'appel POST

kaushalop
la source
2

ici j'ai envoyé jsonobject comme paramètre // jsonobject = {"name": "lucifer", "pass": "abc"} // serverUrl = " http://192.168.100.12/testing " //host=192.168.100.12

  public static String getJson(String serverUrl,String host,String jsonobject){

    StringBuilder sb = new StringBuilder();

    String http = serverUrl;

    HttpURLConnection urlConnection = null;
    try {
        URL url = new URL(http);
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setDoOutput(true);
        urlConnection.setRequestMethod("POST");
        urlConnection.setUseCaches(false);
        urlConnection.setConnectTimeout(50000);
        urlConnection.setReadTimeout(50000);
        urlConnection.setRequestProperty("Content-Type", "application/json");
        urlConnection.setRequestProperty("Host", host);
        urlConnection.connect();
        //You Can also Create JSONObject here 
        OutputStreamWriter out = new OutputStreamWriter(urlConnection.getOutputStream());
        out.write(jsonobject);// here i sent the parameter
        out.close();
        int HttpResult = urlConnection.getResponseCode();
        if (HttpResult == HttpURLConnection.HTTP_OK) {
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    urlConnection.getInputStream(), "utf-8"));
            String line = null;
            while ((line = br.readLine()) != null) {
                sb.append(line + "\n");
            }
            br.close();
            Log.e("new Test", "" + sb.toString());
            return sb.toString();
        } else {
            Log.e(" ", "" + urlConnection.getResponseMessage());
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    } finally {
        if (urlConnection != null)
            urlConnection.disconnect();
    }
    return null;
}
Abhisek
la source
2

Je recommande vivement la requête http sur apache http api.

Pour votre cas, vous pouvez voir un exemple:

private static final HttpRequest<String.class> HTTP_REQUEST = 
      HttpRequestBuilder.createPost("http://example.com/index.php", String.class)
           .responseDeserializer(ResponseDeserializer.ignorableDeserializer())
           .build();

public void sendRequest(String request){
     String parameters = request.split("\\?")[1];
     ResponseHandler<String> responseHandler = 
            HTTP_REQUEST.executeWithQuery(parameters);

   System.out.println(responseHandler.getStatusCode());
   System.out.println(responseHandler.get()); //prints response body
}

Si vous n'êtes pas intéressé par le corps de réponse

private static final HttpRequest<?> HTTP_REQUEST = 
     HttpRequestBuilder.createPost("http://example.com/index.php").build();

public void sendRequest(String request){
     ResponseHandler<String> responseHandler = 
           HTTP_REQUEST.executeWithQuery(parameters);
}

Pour envoyer une demande de publication générale avec http-request : lire la documentation et voir mes réponses requête HTTP POST avec chaîne JSON en JAVA , envoi de requête HTTP POST en Java , HTTP POST utilisant JSON en Java

Beno Arakelyan
la source
1

Bonjour, veuillez utiliser cette classe pour améliorer votre méthode de publication

public static JSONObject doPostRequest(HashMap<String, String> data, String url) {

    try {
        RequestBody requestBody;
        MultipartBuilder mBuilder = new MultipartBuilder().type(MultipartBuilder.FORM);

        if (data != null) {


            for (String key : data.keySet()) {
                String value = data.get(key);
                Utility.printLog("Key Values", key + "-----------------" + value);

                mBuilder.addFormDataPart(key, value);

            }
        } else {
            mBuilder.addFormDataPart("temp", "temp");
        }
        requestBody = mBuilder.build();


        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();

        OkHttpClient client = new OkHttpClient();
        Response response = client.newCall(request).execute();
        String responseBody = response.body().string();
        Utility.printLog("URL", url);
        Utility.printLog("Response", responseBody);
        return new JSONObject(responseBody);

    } catch (UnknownHostException | UnsupportedEncodingException e) {

        JSONObject jsonObject=new JSONObject();

        try {
            jsonObject.put("status","false");
            jsonObject.put("message",e.getLocalizedMessage());
        } catch (JSONException e1) {
            e1.printStackTrace();
        }
        Log.e(TAG, "Error: " + e.getLocalizedMessage());
    } catch (Exception e) {
        e.printStackTrace();
        JSONObject jsonObject=new JSONObject();

        try {
            jsonObject.put("status","false");
            jsonObject.put("message",e.getLocalizedMessage());
        } catch (JSONException e1) {
            e1.printStackTrace();
        }
        Log.e(TAG, "Other Error: " + e.getLocalizedMessage());
    }
    return null;
}
CHirag RAmi
la source
0

J'ai pris la réponse de Boann et je l'ai utilisée pour créer un générateur de chaîne de requête plus flexible qui prend en charge les listes et les tableaux, tout comme la méthode http_build_query de php:

public static byte[] httpBuildQueryString(Map<String, Object> postsData) throws UnsupportedEncodingException {
    StringBuilder postData = new StringBuilder();
    for (Map.Entry<String,Object> param : postsData.entrySet()) {
        if (postData.length() != 0) postData.append('&');

        Object value = param.getValue();
        String key = param.getKey();

        if(value instanceof Object[] || value instanceof List<?>)
        {
            int size = value instanceof Object[] ? ((Object[])value).length : ((List<?>)value).size();
            for(int i = 0; i < size; i++)
            {
                Object val = value instanceof Object[] ? ((Object[])value)[i] : ((List<?>)value).get(i);
                if(i>0) postData.append('&');
                postData.append(URLEncoder.encode(key + "[" + i + "]", "UTF-8"));
                postData.append('=');            
                postData.append(URLEncoder.encode(String.valueOf(val), "UTF-8"));
            }
        }
        else
        {
            postData.append(URLEncoder.encode(key, "UTF-8"));
            postData.append('=');            
            postData.append(URLEncoder.encode(String.valueOf(value), "UTF-8"));
        }
    }
    return postData.toString().getBytes("UTF-8");
}
Curtis
la source
0

Pour ceux qui ont du mal à recevoir la demande sur une page php en utilisant $ _POST car vous attendez des paires clé-valeur:

Bien que toutes les réponses aient été très utiles, il me manquait une compréhension de base sur la chaîne à publier, car dans l'ancien Apache HttpClient, j'utilisais

new UrlEncodedFormEntity(nameValuePairs); (Java)

puis pourrait utiliser $ _POST en php obtenir les paires clé-valeur.

À ma connaissance, on a maintenant construit cette chaîne manuellement avant de poster. La chaîne doit donc ressembler à

val data = "key1=val1&key2=val2"

mais au lieu de simplement l'ajouter à l'URL, il est publié (dans l'en-tête).

L'alternative serait d'utiliser une chaîne json à la place:

val data = "{\"key1\":\"val1\",\"key2\":\"val2\"}" // {"key1":"val1","key2":"val2"}

et tirez-le en php sans $ _POST:

$json_params = file_get_contents('php://input');
// echo_p("Data: $json_params");
$data = json_decode($json_params, true);

Vous trouverez ici un exemple de code dans Kotlin:

class TaskDownloadTest : AsyncTask<Void, Void, Void>() {
    override fun doInBackground(vararg params: Void): Void? {
        var urlConnection: HttpURLConnection? = null

        try {

            val postData = JsonObject()
            postData.addProperty("key1", "val1")
            postData.addProperty("key2", "val2")

            // reformat json to key1=value1&key2=value2
            // keeping json because I may change the php part to interpret json requests, could be a HashMap instead
            val keys = postData.keySet()
            var request = ""
            keys.forEach { key ->
                // Log.i("data", key)
                request += "$key=${postData.get(key)}&"
            }
            request = request.replace("\"", "").removeSuffix("&")
            val requestLength = request.toByteArray().size
            // Warning in Android 9 you need to add a line in the application part of the manifest: android:usesCleartextTraffic="true"
            // /programming/45940861/android-8-cleartext-http-traffic-not-permitted
            val url = URL("http://10.0.2.2/getdata.php")
            urlConnection = url.openConnection() as HttpURLConnection
            // urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded") // apparently default
            // Not sure what these are for, I do not use them
            // urlConnection.setRequestProperty("Content-Type", "application/json")
            // urlConnection.setRequestProperty("Key","Value")
            urlConnection.readTimeout = 5000
            urlConnection.connectTimeout = 5000
            urlConnection.requestMethod = "POST"
            urlConnection.doOutput = true
            // urlConnection.doInput = true
            urlConnection.useCaches = false
            urlConnection.setFixedLengthStreamingMode(requestLength)
            // urlConnection.setChunkedStreamingMode(0) // if you do not want to handle request length which is fine for small requests

            val out = urlConnection.outputStream
            val writer = BufferedWriter(
                OutputStreamWriter(
                    out, "UTF-8"
                )
            )
            writer.write(request)
            // writer.write("{\"key1\":\"val1\",\"key2\":\"val2\"}") // {"key1":"val1","key2":"val2"} JsonFormat or just postData.toString() for $json_params=file_get_contents('php://input'); json_decode($json_params, true); in php
            // writer.write("key1=val1&key2=val2") // key=value format for $_POST in php
            writer.flush()
            writer.close()
            out.close()

            val code = urlConnection.responseCode
            if (code != 200) {
                throw IOException("Invalid response from server: $code")
            }

            val rd = BufferedReader(
                InputStreamReader(
                    urlConnection.inputStream
                )
            )
            var line = rd.readLine()
            while (line != null) {
                Log.i("data", line)
                line = rd.readLine()
            }
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            urlConnection?.disconnect()
        }

        return null
    }
}
Gunnar Bernstein
la source
-3

Apparaît que vous devez également appeler connection.getOutputStream()"au moins une fois" (ainsi que setDoOutput(true)) pour qu'il le traite comme un POST.

Le code minimum requis est donc:

    URL url = new URL(urlString);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    //connection.setRequestMethod("POST"); this doesn't seem to do anything at all..so not useful
    connection.setDoOutput(true); // set it to POST...not enough by itself however, also need the getOutputStream call...
    connection.connect();
    connection.getOutputStream().close(); 

Vous pouvez même utiliser les paramètres de style "GET" dans l'urlString, de façon surprenante. Bien que cela puisse confondre les choses.

Vous pouvez également utiliser NameValuePair apparemment.

rogerdpack
la source
Où sont les paramètres POST ...?
Yousha Aleayoub
Pourquoi les gens votent-ils contre cela? C'est une note sur la façon de faire des POST, mais sans paramètres ... (c'est-à-dire sans charge utile0 ...
rogerdpack