So fügen Sie Parameter zu HttpURLConnection hinzu, indem Sie POST mit NameValuePair verwenden
Lesezeit: 9 Minuten
Michal
Ich versuche zu tun POST mit HttpURLConnection(Ich muss es auf diese Weise verwenden, kann es nicht verwenden HttpPost) und ich möchte dieser Verbindung Parameter hinzufügen, z
post.setEntity(new UrlEncodedFormEntity(nvp));
wo
nvp = new ArrayList<NameValuePair>();
Ich habe einige Daten gespeichert. Ich kann keine Möglichkeit finden, dies hinzuzufügen ArrayList zu meinem HttpURLConnection das ist hier:
Der Grund für diese umständliche Kombination aus https und http ist die Notwendigkeit von nicht verifizieren die Urkunde. Das ist aber kein Problem, es postet den Server gut. Aber ich brauche es, um mit Argumenten zu posten.
Irgendwelche Ideen?
Doppelter Haftungsausschluss:
Damals im Jahr 2012 hatte ich keine Ahnung, wie Parameter in eine eingefügt werden HTTP-POST Anfrage. Ich hing an NameValuePair weil es in einem Tutorial war. Diese Frage mag wie ein Duplikat erscheinen, aber mein Selbst von 2012 hat das gelesen andere Frage und es war NICHT verwenden NameValuePair. Tatsächlich hat es mein Problem nicht gelöst.
Wenn Sie Probleme beim Posten von Parametern haben, kann Ihnen der folgende Link helfen. stackoverflow.com/questions/2793150/…
– Hitendra
19. März 2012 um 9:51 Uhr
String-URL = “beispiel.com“; String charset = “UTF-8”; String param1 = “value1”; String param2 = “value2”; // … String query = String.format(“param1=%s¶m2=%s”, URLEncoder.encode (param1, charset), URLEncoder.encode(param2, charset)); Sie können eine Abfragezeichenfolge erstellen, anstatt NameValuePair List zu verwenden.
– Hitendra
19. März 2012 um 10:06 Uhr
“Ich muss es so verwenden, kann HttpPost nicht verwenden”, deshalb habe ich vorgeschlagen, dass diese andere Antwort von Manikandan gut funktioniert.
– Hitendra
19. März 2012 um 10:33 Uhr
Mögliches Duplikat von Java – einfaches Senden von HTTP-Parametern über die POST-Methode
– Rogerpack
24. Mai 2018 um 17:56 Uhr
Das lag daran, dass „viele der Antworten“ hier dieselben waren wie die Antworten auf diese Frage. Aber jetzt sehe ich, dass es eine andere Frage ist, danke für die Klarstellung 🙂
– Rogerpack
25. Mai 2018 um 13:53 Uhr
Tomusiaka
Sie können den Ausgabestream für die Verbindung abrufen und die Parameterabfragezeichenfolge hineinschreiben.
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();
}
NameValuePair kann auch durch SimpleEntry von AbstractMap ersetzt werden. Siehe diese Seite: stackoverflow.com/questions/2973041/a-keyvaluepair-in-java
– Benutzer1499731
30. Januar 2013 um 19:54 Uhr
Hier sind die Importe, wenn Sie sich nicht sicher sind. import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair;
– WoodenKitty
27. Oktober 2014 um 2:40 Uhr
Für die beste Leistung sollten Sie entweder setFixedLengthStreamingMode(int) aufrufen, wenn die Körperlänge im Voraus bekannt ist, oder setChunkedStreamingMode(int), wenn dies nicht der Fall ist. Andernfalls wird HttpURLConnection gezwungen, den vollständigen Anforderungstext im Speicher zu puffern, bevor er übertragen wird, wodurch Heap verschwendet (und möglicherweise erschöpft) und die Latenz erhöht wird.
– Muhammad Babar
24. November 2014 um 13:46 Uhr
NameValuePair ist in API 22 veraltet, überprüfen Sie meine Antwort stackoverflow.com/a/29561084/4552938
– Fahim
14. April 2015 um 8:21 Uhr
Vielleicht können Sie beim Erstellen von URL-Objekten den Raw-Modus verwenden, etwa so: URL url = new URL("http://yoururl.com?k1=v1&k2=v2&···&kn=vn"); Wenn conn dann auf die Verwendung der POST-Methode eingestellt ist, müssen sie nicht geschrieben werden.
– alexscmar
27. November 2015 um 10:34 Uhr
Fahim
Da das NameValuePair veraltet ist. Dachte daran, meinen Code zu teilen
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();
}
Danke, dass du es auf dem Laufenden hältst, Fahim 🙂
– Michael
10. April 2015 um 12:18 Uhr
Wenn Ihre compileSdkVersion 23 (Marshmallow) ist, können Sie NameValuePair nicht mehr verwenden, da sie die Bibliothek entfernt haben. Ich hatte befürchtet, dass die Migration mühsam werden würde, aber Ihre Lösung hat mir viel Zeit gespart. Danke.
– Herausforderung angenommen
13. September 2015 um 9:29 Uhr
Das funktioniert großartig, aber warum enthält die Antwort doppelte Anführungszeichen, wie z ""result"" ?
– Apostrofix
13. Oktober 2015 um 19:15 Uhr
Hatte jemand von euch ein Problem mit dieser Leitung OutputStream os = conn.getOutputStream(); auf Jelly Bean in Bezug auf keine Adresse mit Hostnamen verbunden?
– Ricardo
20. März 2017 um 12:27 Uhr
Danke, dass Sie Ihren Code geteilt haben. Auch die Android-Entwickler-Website bietet keine Lösung.
– Ahsan
3. April 2017 um 7:07 Uhr
mpolci
Wenn Sie die nicht brauchen ArrayList<NameValuePair> für Parameter ist dies eine kürzere Lösung, die die Abfragezeichenfolge mithilfe von erstellt Uri.Builder Klasse:
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();
Dies sollte eine Antwort sein, da das Rad nicht neu erfunden werden muss!
– Injekteur
26. November 2015 um 15:07 Uhr
wie man filebody in appendqueryparameter für Bilder und alle hochlädt
– Harscha
17. Dezember 2015 um 8:51 Uhr
befriedigendere Lösung
– PYPL
24. März 2016 um 12:12 Uhr
@Krups Ich denke, Ihr Problem unterscheidet sich von diesem. Versuchen Sie, mit POST nach dem Senden von JSON-Objekten zu suchen
– mpolci
14. Mai 2016 um 17:31 Uhr
Woher kommt Uri.Builder?
– Tschumann
1. November 2021 um 2:11 Uhr
Stefan Emmanuelsson
Eine Lösung besteht darin, einen eigenen params-String zu erstellen.
Dies ist die eigentliche Methode, die ich für mein neuestes Projekt verwendet habe. Sie müssen die Argumente von der Hashtabelle in die Namenswertpaare ändern:
Wenn Sie Probleme beim Posten von Parametern haben, kann Ihnen der folgende Link helfen. stackoverflow.com/questions/2793150/…
– Hitendra
19. März 2012 um 9:51 Uhr
String-URL = “beispiel.com“; String charset = “UTF-8”; String param1 = “value1”; String param2 = “value2”; // … String query = String.format(“param1=%s¶m2=%s”, URLEncoder.encode (param1, charset), URLEncoder.encode(param2, charset)); Sie können eine Abfragezeichenfolge erstellen, anstatt NameValuePair List zu verwenden.
– Hitendra
19. März 2012 um 10:06 Uhr
“Ich muss es so verwenden, kann HttpPost nicht verwenden”, deshalb habe ich vorgeschlagen, dass diese andere Antwort von Manikandan gut funktioniert.
– Hitendra
19. März 2012 um 10:33 Uhr
Mögliches Duplikat von Java – einfaches Senden von HTTP-Parametern über die POST-Methode
– Rogerpack
24. Mai 2018 um 17:56 Uhr
Das lag daran, dass „viele der Antworten“ hier dieselben waren wie die Antworten auf diese Frage. Aber jetzt sehe ich, dass es eine andere Frage ist, danke für die Klarstellung 🙂
– Rogerpack
25. Mai 2018 um 13:53 Uhr