269 votes

Comment ajouter des paramètres à HttpURLConnection en utilisant POST

Je suis en train de faire le POST avec HttpURLConnection(j'ai besoin de l'utiliser de cette façon, ne peut pas utiliser HttpPost) et j'aimerais ajouter des paramètres à cet égard comme

post.setEntity(new UrlEncodedFormEntity(nvp));

nvp = new ArrayList<NameValuePair>();

avoir quelques données stockées dans. Je ne peux pas trouver un moyen comment ajouter cette ArrayList mon HttpURLConnection qui 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 en est maladroit https et http combinaison est la nécessité de ne pas vérifier le certificat. Ce n'est pas un problème, même si, il l'envoie au serveur. Mais j'en ai besoin pour post avec des arguments.

Des idées?

370voto

tomusiaka Points 924

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

 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();
}
 

25voto

Une solution consiste à créer votre propre chaîne de params, c'est la méthode que j'ai utilisée pour mon dernier projet.

 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();
}
 

POST des paramètres:

 OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write(getPostParamString(req.getPostParams()));
 

J'espère que cette aide, bien sûr, ceci est ma première réponse, donc si vous trouvez cela utile, votez moi, merci.

14voto

Samuel Points 327

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) {}
}
 

14voto

Victor Caveda Points 66

La réponse acceptée lance une ProtocolException à:

OutputStream os = conn.getOutputStream();

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

conn.setDoOutput(true);

pour que cela fonctionne.

0voto

Vyacheslav Shilkin Points 4915

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);
    ......
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X