Comment ajouter des paramètres à HttpURLConnection à l'aide de POST à ​​l'aide de NameValuePair

257

J'essaie de faire du POST avec HttpURLConnection(j'ai besoin de l'utiliser de cette façon, HttpPostje ne peux pas l'utiliser ) et je voudrais ajouter des paramètres à cette connexion tels que

post.setEntity(new UrlEncodedFormEntity(nvp));

nvp = new ArrayList<NameValuePair>();

avoir des données stockées. Je ne peux pas trouver un moyen d'ajouter ceci ArrayListà mon HttpURLConnectionqui est ici:

HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
https.setHostnameVerifier(DO_NOT_VERIFY);
http = https;
http.setRequestMethod("POST");
http.setDoInput(true);
http.setDoOutput(true);

La raison de cette combinaison https et http maladroite est la nécessité de ne pas vérifier le certificat. Ce n'est pas un problème, cependant, il affiche bien le serveur. Mais j'en ai besoin pour poster des arguments.

Des idées?


Clause de non-responsabilité en double:

En 2012, je ne savais pas comment les paramètres étaient insérés dans une requête HTTP POST . Je m'accrochais NameValuePairparce que c'était dans un tutoriel. Cette question peut sembler être un doublon, cependant, mon auto 2012 a lu cette autre question et elle n'utilisait PASNameValuePair . En fait, cela n'a pas résolu mon problème.

Michal
la source
2
Si vous avez des problèmes avec la publication des paramètres, le lien ci-dessous peut vous aider. stackoverflow.com/questions/2793150/…
Hitendra
1
String url = " example.com "; String charset = "UTF-8"; String param1 = "value1"; String param2 = "value2"; // ... String query = String.format ("param1 =% s & param2 =% s", URLEncoder.encode (param1, charset), URLEncoder.encode (param2, charset)); vous pouvez créer une chaîne de requête au lieu d'utiliser la liste NameValuePair.
Hitendra
"J'ai besoin de l'utiliser de cette façon, je ne peux pas utiliser HttpPost", c'est pourquoi j'ai suggéré que cette autre réponse publiée par Manikandan fonctionne bien.
Hitendra
1
C'est parce que "beaucoup de réponses" ici étaient les mêmes que les réponses à cette question. Mais maintenant je vois que c'est une question différente, merci pour la clarification :)
rogerdpack

Réponses:

362

Vous pouvez obtenir le flux de sortie pour la connexion et y écrire la chaîne de requête de paramètres.

URL url = new URL("http://yoururl.com");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);

List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("firstParam", paramValue1));
params.add(new BasicNameValuePair("secondParam", paramValue2));
params.add(new BasicNameValuePair("thirdParam", paramValue3));

OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
        new OutputStreamWriter(os, "UTF-8"));
writer.write(getQuery(params));
writer.flush();
writer.close();
os.close();

conn.connect();

...

private String getQuery(List<NameValuePair> params) throws UnsupportedEncodingException
{
    StringBuilder result = new StringBuilder();
    boolean first = true;

    for (NameValuePair pair : params)
    {
        if (first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
    }

    return result.toString();
}
tomusiaka
la source
25
NameValuePair peut également être remplacé par SimpleEntry de AbstractMap. Voir cette page: stackoverflow.com/questions/2973041/a-keyvaluepair-in-java
Voici les importations si vous n'êtes pas sûr. import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair;
WoodenKitty
9
Pour de meilleures performances, vous devez appeler soit setFixedLengthStreamingMode (int) lorsque la longueur du corps est connue à l'avance, soit setChunkedStreamingMode (int) dans le cas contraire. Sinon, HttpURLConnection sera forcé de mettre en mémoire tampon le corps de la requête complète avant sa transmission, ce qui gaspillera (et éventuellement épuisera) le tas et augmentera la latence.
Muhammad Babar
11
NameValuePair est déconseillé dans Api 22, consultez ma réponse stackoverflow.com/a/29561084/4552938
Fahim
1
Peut-être que vous pouvez utiliser le mode brut lors de la construction d'un objet URL, quelque chose comme ceci: URL url = new URL("http://yoururl.com?k1=v1&k2=v2&···&kn=vn");alors lorsque vous définissez conn pour utiliser la méthode POST, vous n'avez pas besoin de les écrire.
alexscmar
184

Étant donné que NameValuePair est obsolète. Pensé à partager mon code

public String  performPostCall(String requestURL,
            HashMap<String, String> postDataParams) {

        URL url;
        String response = "";
        try {
            url = new URL(requestURL);

            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(15000);
            conn.setConnectTimeout(15000);
            conn.setRequestMethod("POST");
            conn.setDoInput(true);
            conn.setDoOutput(true);


            OutputStream os = conn.getOutputStream();
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));
            writer.write(getPostDataString(postDataParams));

            writer.flush();
            writer.close();
            os.close();
            int responseCode=conn.getResponseCode();

            if (responseCode == HttpsURLConnection.HTTP_OK) {
                String line;
                BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream()));
                while ((line=br.readLine()) != null) {
                    response+=line;
                }
            }
            else {
                response="";

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

        return response;
    }

....

  private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException{
        StringBuilder result = new StringBuilder();
        boolean first = true;
        for(Map.Entry<String, String> entry : params.entrySet()){
            if (first)
                first = false;
            else
                result.append("&");

            result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
            result.append("=");
            result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
        }

        return result.toString();
    }
Fahim
la source
10
Merci de l'avoir mis à jour Fahim :-)
Michal
3
Si votre compileSdkVersion est 23 (Marshmallow), vous ne pouvez plus utiliser NameValuePair car ils ont supprimé la bibliothèque. Je craignais que la migration ne soit pénible, mais votre solution m'a fait gagner beaucoup de temps. Je vous remercie.
Challenge
Cela fonctionne très bien, mais pourquoi la réponse contient-elle des guillemets doubles ""result""?
Apostrofix
1
L'un de vous a-t-il eu un problème avec cette ligne OutputStream os = conn.getOutputStream();sur Jelly Bean concernant aucune adresse associée au nom d'hôte?
Ricardo
1
Merci d'avoir partagé votre code. Même le site Web des développeurs Android n'offre pas de solution.
Ahsan
153

Si vous n'avez pas besoin des ArrayList<NameValuePair>paramètres for, il s'agit d'une solution plus courte qui crée la chaîne de requête à l'aide de la Uri.Builderclasse:

URL url = new URL("http://yoururl.com");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);

Uri.Builder builder = new Uri.Builder()
        .appendQueryParameter("firstParam", paramValue1)
        .appendQueryParameter("secondParam", paramValue2)
        .appendQueryParameter("thirdParam", paramValue3);
String query = builder.build().getEncodedQuery();

OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
            new OutputStreamWriter(os, "UTF-8"));
writer.write(query);
writer.flush();
writer.close();
os.close();

conn.connect();
mpolci
la source
7
cela devrait être une réponse, car aucune réinvention de la roue ne doit être effectuée!
injecteur
comment télécharger un corps de fichier dans appendqueryparameter pour les images et tout
Harsha
2
solution plus satisfaisante
PYPL
@mpolci, j'ai une question / un doute concernant le type complexe de paramètres. J'ai des paramètres et je ne sais pas comment passer ces paramètres. {"clé1": "valeur1", "clé2": "valeur2", "clé3": {"clé intérieure1": "valeur intérieure1", "clé intérieure2": "valeur intérieure 2"}}. On m'a fourni ce type de paramètres de valeur clé complexes et je veux savoir comment puis-je transmettre ces paramètres dans le service Web?
Krups
1
@Krups Je pense que votre problème est différent de cela, essayez de chercher l'envoi d'un objet JSON en utilisant POST
mpolci
25

Une solution consiste à créer votre propre chaîne de paramètres.

C'est la méthode que j'ai utilisée pour mon dernier projet. Vous devez changer les arguments de la table de hachage en namevaluepair:

private static String getPostParamString(Hashtable<String, String> params) {
    if(params.size() == 0)
        return "";

    StringBuffer buf = new StringBuffer();
    Enumeration<String> keys = params.keys();
    while(keys.hasMoreElements()) {
        buf.append(buf.length() == 0 ? "" : "&");
        String key = keys.nextElement();
        buf.append(key).append("=").append(params.get(key));
    }
    return buf.toString();
}

PUBLICATION des paramètres:

OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write(getPostParamString(req.getPostParams()));
Stefan Emanuelsson
la source
3
Vous devriez sûrement encoder les paires clé-valeur
Max Nanasy
14

Je pense avoir trouvé exactement ce dont vous avez besoin. Cela peut aider les autres.

Vous pouvez utiliser la méthode UrlEncodedFormEntity.writeTo (OutputStream) .

UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nvp); 
http.connect();

OutputStream output = null;
try {
  output = http.getOutputStream();    
  formEntity.writeTo(output);
} finally {
 if (output != null) try { output.close(); } catch (IOException ioe) {}
}
Samuel
la source
14

La réponse acceptée lève une exception ProtocolException à:

OutputStream os = conn.getOutputStream();

car il n'active pas la sortie de l'objet URLConnection. La solution doit inclure ceci:

conn.setDoOutput(true);

pour le faire fonctionner.

Victor Caveda
la source
13

Si ce n'est pas trop tard, j'aimerais partager mon code

Utils.java:

public static String buildPostParameters(Object content) {
        String output = null;
        if ((content instanceof String) ||
                (content instanceof JSONObject) ||
                (content instanceof JSONArray)) {
            output = content.toString();
        } else if (content instanceof Map) {
            Uri.Builder builder = new Uri.Builder();
            HashMap hashMap = (HashMap) content;
            if (hashMap != null) {
                Iterator entries = hashMap.entrySet().iterator();
                while (entries.hasNext()) {
                    Map.Entry entry = (Map.Entry) entries.next();
                    builder.appendQueryParameter(entry.getKey().toString(), entry.getValue().toString());
                    entries.remove(); // avoids a ConcurrentModificationException
                }
                output = builder.build().getEncodedQuery();
            }
        }

        return output;
    }

public static URLConnection makeRequest(String method, String apiAddress, String accessToken, String mimeType, String requestBody) throws IOException {
        URL url = new URL(apiAddress);
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        urlConnection.setDoInput(true);
        urlConnection.setDoOutput(!method.equals("GET"));
        urlConnection.setRequestMethod(method);

        urlConnection.setRequestProperty("Authorization", "Bearer " + accessToken);        

        urlConnection.setRequestProperty("Content-Type", mimeType);
        OutputStream outputStream = new BufferedOutputStream(urlConnection.getOutputStream());
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8"));
        writer.write(requestBody);
        writer.flush();
        writer.close();
        outputStream.close();            

        urlConnection.connect();

        return urlConnection;
    }

MainActivity.java:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new APIRequest().execute();
}

private class APIRequest extends AsyncTask<Void, Void, String> {

        @Override
        protected Object doInBackground(Void... params) {

            // Of course, you should comment the other CASES when testing one CASE

            // CASE 1: For FromBody parameter
            String url = "http://10.0.2.2/api/frombody";
            String requestBody = Utils.buildPostParameters("'FromBody Value'"); // must have '' for FromBody parameter
            HttpURLConnection urlConnection = null;
            try {
                urlConnection = (HttpURLConnection) Utils.makeRequest("POST", url, null, "application/json", requestBody);                    
                InputStream inputStream;
                // get stream
                if (urlConnection.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                    inputStream = urlConnection.getInputStream();
                } else {
                    inputStream = urlConnection.getErrorStream();
                }
                // parse stream
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                String temp, response = "";
                while ((temp = bufferedReader.readLine()) != null) {
                    response += temp;
                }
                return response;
            } catch (IOException e) {
                e.printStackTrace();
                return e.toString();
            } finally {
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
            }

            // CASE 2: For JSONObject parameter
            String url = "http://10.0.2.2/api/testjsonobject";
            JSONObject jsonBody;
            String requestBody;
            HttpURLConnection urlConnection;
            try {
                jsonBody = new JSONObject();
                jsonBody.put("Title", "BNK Title");
                jsonBody.put("Author", "BNK");
                jsonBody.put("Date", "2015/08/08");
                requestBody = Utils.buildPostParameters(jsonBody);
                urlConnection = (HttpURLConnection) Utils.makeRequest("POST", url, null, "application/json", requestBody);                    
                ...
                // the same logic to case #1
                ...
                return response;
            } catch (JSONException | IOException e) {
                e.printStackTrace();
                return e.toString();
            } finally {
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
            }           

            // CASE 3: For form-urlencoded parameter
            String url = "http://10.0.2.2/api/token";
            HttpURLConnection urlConnection;
            Map<String, String> stringMap = new HashMap<>();
            stringMap.put("grant_type", "password");
            stringMap.put("username", "username");
            stringMap.put("password", "password");
            String requestBody = Utils.buildPostParameters(stringMap);
            try {
                urlConnection = (HttpURLConnection) Utils.makeRequest("POST", url, null, "application/x-www-form-urlencoded", requestBody);
                ...
                // the same logic to case #1
                ...
                return response;
            } catch (Exception e) {
                e.printStackTrace();
                return e.toString();
            } finally {
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
            }                  
        }

        @Override
        protected void onPostExecute(String response) {
            super.onPostExecute(response);
            // do something...
        }
    }
BNK
la source
@Srinivasan comme vous le voyez dans mon code: "if (urlConnection.getResponseCode () == HttpURLConnection.HTTP_OK) {...} else {...}"
BNK
Ya j'ai déjà obtenu cela mais ce que j'ai demandé était quelle variable aura la réponse entière de l'url donnée
iSrinivasan27
1
@Srinivasan plus de détails, vous pouvez essayer InputStream inputStream = null; if (urlConnection.getResponseCode () == HttpURLConnection.HTTP_OK) {inputStream = urlConnection.getInputStream (); } else {inputStream = urlConnection.getErrorStream (); }
BNK
@Srinivasan en fait, si le code resp <400 (Bad Request), vous utilisez getInputStream, si> = 400, getErrorStream
BNK
1
Super Stuff Bro Bons exemples
passe le
10

Il existe une approche beaucoup plus simple à l'aide de PrintWriter (voir ici )

Fondamentalement, tout ce dont vous avez besoin est:

// set up URL connection
URL urlToRequest = new URL(urlStr);
HttpURLConnection urlConnection = (HttpURLConnection)urlToRequest.openConnection();
urlConnection.setDoOutput(true);
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

// write out form parameters
String postParamaters = "param1=value1&param2=value2"
urlConnection.setFixedLengthStreamingMode(postParameters.getBytes().length);
PrintWriter out = new PrintWriter(urlConnection.getOutputStream());
out.print(postParameters);
out.close();

// connect
urlConnection.connect();
Marchy
la source
4

AsyncTaskenvoyer des données comme JSONObectvia la POSTméthode

public class PostMethodDemo extends AsyncTask<String , Void ,String> {
        String server_response;

        @Override
        protected String doInBackground(String... strings) {
            URL url;
            HttpURLConnection urlConnection = null;

            try {
                url = new URL(strings[0]);
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setDoOutput(true);
                urlConnection.setDoInput(true);
                urlConnection.setRequestMethod("POST");

                DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream ());

                try {
                    JSONObject obj = new JSONObject();
                    obj.put("key1" , "value1");
                    obj.put("key2" , "value2");

                    wr.writeBytes(obj.toString());
                    Log.e("JSON Input", obj.toString());
                    wr.flush();
                    wr.close();
                } catch (JSONException ex) {
                    ex.printStackTrace();
                }
                urlConnection.connect();

                int responseCode = urlConnection.getResponseCode();

                if(responseCode == HttpURLConnection.HTTP_OK){
                    server_response = readStream(urlConnection.getInputStream());
                }

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Log.e("Response", "" + server_response);
        }
    }

    public static String readStream(InputStream in) {
        BufferedReader reader = null;
        StringBuffer response = new StringBuffer();
        try {
            reader = new BufferedReader(new InputStreamReader(in));
            String line = "";
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return response.toString();
    }
Bhargav Thanki
la source
3

Essaye ça:

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("your url");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
nameValuePairs.add(new BasicNameValuePair("user_name", "Name"));
nameValuePairs.add(new BasicNameValuePair("pass","Password" ));
nameValuePairs.add(new BasicNameValuePair("user_email","email" ));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);

String ret = EntityUtils.toString(response.getEntity());
Log.v("Util response", ret);

Vous pouvez en ajouter autant nameValuePairsque vous le souhaitez. Et n'oubliez pas de mentionner le nombre dans la liste.

Manikandan
la source
référez ce lien. xyzws.com/Javafaq/…
Manikandan
1
Cela ne répond pas à la question intitulée How to add parameters to HttpURLConnection using POST- Cela induit en erreur.
User3
2
Ce n'est pas une bonne réponse à cette question.
Skynet
1
NameValuePair est obsolète dans Api 22, consultez ma réponse stackoverflow.com/a/29561084/4552938
Fahim
2

Pour appeler les méthodes POST / PUT / DELETE / GET Restful avec un en-tête personnalisé ou des données json, la classe Async suivante peut être utilisée

public class HttpUrlConnectionUtlity extends AsyncTask<Integer, Void, String> {
private static final String TAG = "HttpUrlConnectionUtlity";
Context mContext;
public static final int GET_METHOD = 0,
        POST_METHOD = 1,
        PUT_METHOD = 2,
        HEAD_METHOD = 3,
        DELETE_METHOD = 4,
        TRACE_METHOD = 5,
        OPTIONS_METHOD = 6;
HashMap<String, String> headerMap;

String entityString;
String url;
int requestType = -1;
final String timeOut = "TIMED_OUT";

int TIME_OUT = 60 * 1000;

public HttpUrlConnectionUtlity (Context mContext) {
    this.mContext = mContext;
    this.callback = callback;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected String doInBackground(Integer... params) {
    int requestType = getRequestType();
    String response = "";
    try {


        URL url = getUrl();
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        urlConnection = setRequestMethod(urlConnection, requestType);
        urlConnection.setConnectTimeout(TIME_OUT);
        urlConnection.setReadTimeout(TIME_OUT);
        urlConnection.setDoOutput(true);
        urlConnection = setHeaderData(urlConnection);
        urlConnection = setEntity(urlConnection);

        if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
            response = readResponseStream(urlConnection.getInputStream());
            Logger.v(TAG, response);
        }
        urlConnection.disconnect();
        return response;


    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (SocketTimeoutException e) {
        return timeOut;
    } catch (IOException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        Logger.e(TAG, "ALREADY CONNECTED");
    }
    return response;
}

@Override
protected void onPostExecute(String response) {
    super.onPostExecute(response);

    if (TextUtils.isEmpty(response)) {
        //empty response
    } else if (response != null && response.equals(timeOut)) {
        //request timed out 
    } else    {
    //process your response
   }
}


private String getEntityString() {
    return entityString;
}

public void setEntityString(String s) {
    this.entityString = s;
}

private String readResponseStream(InputStream in) {
    BufferedReader reader = null;
    StringBuffer response = new StringBuffer();
    try {
        reader = new BufferedReader(new InputStreamReader(in));
        String line = "";
        while ((line = reader.readLine()) != null) {
            response.append(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return response.toString();
}

private HttpURLConnection setEntity(HttpURLConnection urlConnection) throws IOException {
    if (getEntityString() != null) {
        OutputStream outputStream = urlConnection.getOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
        writer.write(getEntityString());
        writer.flush();
        writer.close();
        outputStream.close();
    } else {
        Logger.w(TAG, "NO ENTITY DATA TO APPEND ||NO ENTITY DATA TO APPEND ||NO ENTITY DATA TO APPEND");
    }
    return urlConnection;
}

private HttpURLConnection setHeaderData(HttpURLConnection urlConnection) throws UnsupportedEncodingException {
    urlConnection.setRequestProperty("Content-Type", "application/json");
    urlConnection.setRequestProperty("Accept", "application/json");
    if (getHeaderMap() != null) {
        for (Map.Entry<String, String> entry : getHeaderMap().entrySet()) {
            urlConnection.setRequestProperty(entry.getKey(), entry.getValue());
        }
    } else {
        Logger.w(TAG, "NO HEADER DATA TO APPEND ||NO HEADER DATA TO APPEND ||NO HEADER DATA TO APPEND");
    }
    return urlConnection;
}

private HttpURLConnection setRequestMethod(HttpURLConnection urlConnection, int requestMethod) {
    try {
        switch (requestMethod) {
            case GET_METHOD:
                urlConnection.setRequestMethod("GET");
                break;
            case POST_METHOD:
                urlConnection.setRequestMethod("POST");
                break;
            case PUT_METHOD:
                urlConnection.setRequestMethod("PUT");
                break;
            case DELETE_METHOD:
                urlConnection.setRequestMethod("DELETE");
                break;
            case OPTIONS_METHOD:
                urlConnection.setRequestMethod("OPTIONS");
                break;
            case HEAD_METHOD:
                urlConnection.setRequestMethod("HEAD");
                break;
            case TRACE_METHOD:
                urlConnection.setRequestMethod("TRACE");
                break;
        }
    } catch (ProtocolException e) {
        e.printStackTrace();
    }
    return urlConnection;
}

public int getRequestType() {
    return requestType;
}

public void setRequestType(int requestType) {
    this.requestType = requestType;
}

public URL getUrl() throws MalformedURLException {
    return new URL(url);
}

public void setUrl(String url) {
    this.url = url;
}

public HashMap<String, String> getHeaderMap() {
    return headerMap;
}

public void setHeaderMap(HashMap<String, String> headerMap) {
    this.headerMap = headerMap;
}   }

Et l'utilisation est

    HttpUrlConnectionUtlity httpMethod = new HttpUrlConnectionUtlity (mContext);
    JSONObject jsonEntity = new JSONObject();

    try {
        jsonEntity.put("key1", value1);
        jsonEntity.put("key2", value2);

    } catch (JSONException e) {
        e.printStackTrace();
    }
    httpMethod.setUrl(YOUR_URL_STRING);
    HashMap<String, String> headerMap = new HashMap<>();
    headerMap.put("key",value);
    headerMap.put("key1",value1);
    httpMethod.setHeaderMap(headerMap);
    httpMethod.setRequestType(WiseConnectHttpMethod.POST_METHOD); //specify POST/GET/DELETE/PUT
    httpMethod.setEntityString(jsonEntity.toString());
    httpMethod.execute();
Muhamed Riyas M
la source
1

En utilisant org.apache.http.client.HttpClient, vous pouvez également le faire facilement de manière plus lisible comme ci-dessous.

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php");

Dans try catch, vous pouvez insérer

// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("id", "12345"));
nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
MP Mathugama
la source
1
Merci pour votre réponse! Je ne peux cependant pas l'utiliser de cette façon (indiqué dans la question, première ligne).
Michal
7
Ce n'est pas une bonne réponse à cette question.
Skynet
3
NameValuePair est obsolète dans Api 22, consultez ma réponse stackoverflow.com/a/29561084/4552938
Fahim
1
Même le client HTTP est également obsolète et supprimé dans l'API 23
RevanthKrishnaKumar V.
0

Dans mon cas, j'ai créé une fonction comme celle-ci pour faire une demande de post qui prend l'url de chaîne et la table de hachage des paramètres

 public  String postRequest( String mainUrl,HashMap<String,String> parameterList)
{
    String response="";
    try {
        URL url = new URL(mainUrl);

        StringBuilder postData = new StringBuilder();
        for (Map.Entry<String, String> param : parameterList.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"));

        StringBuilder sb = new StringBuilder();
        for (int c; (c = in.read()) >= 0; )
            sb.append((char) c);
        response = sb.toString();


    return  response;
    }catch (Exception excep){
        excep.printStackTrace();}
    return response;
}
Rahul_Pawar
la source
0

J'utilise quelque chose comme ça:

SchemeRegistry sR = new SchemeRegistry();
sR.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

HttpParams params = new BasicHttpParams();
SingleClientConnManager mgr = new SingleClientConnManager(params, sR);

HttpClient httpclient = new DefaultHttpClient(mgr, params);

HttpPost httppost = new HttpPost(url);
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

HttpResponse response = httpclient.execute(httppost);
Vyacheslav Shylkin
la source
-1
JSONObject params = new JSONObject();
try {
   params.put(key, val);
}catch (JSONException e){
   e.printStackTrace();
}

voici comment je passe "params" (JSONObject) via POST

connection.getOutputStream().write(params.toString().getBytes("UTF-8"));
Zyrus Reyes
la source