So fügen Sie Parameter zu HttpURLConnection hinzu, indem Sie POST mit NameValuePair verwenden

Lesezeit: 9 Minuten

So fugen Sie Parameter zu HttpURLConnection hinzu indem Sie POST
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:

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

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&param2=%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

1646718188 406 So fugen Sie Parameter zu HttpURLConnection hinzu indem Sie POST
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

So fugen Sie Parameter zu HttpURLConnection hinzu indem Sie POST
Fahim

Da das NameValuePair veraltet ist. Dachte daran, meinen Code zu teilen

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

  • 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

1646718189 151 So fugen Sie Parameter zu HttpURLConnection hinzu indem Sie POST
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

1646718190 543 So fugen Sie Parameter zu HttpURLConnection hinzu indem Sie POST
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:

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

POSTing der Parameter:

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

Ich glaube, ich habe genau das gefunden, was Sie brauchen. Es kann anderen helfen.

Sie können die Methode verwenden 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) {}
}

1646718191 775 So fugen Sie Parameter zu HttpURLConnection hinzu indem Sie POST
wojciii

Die akzeptierte Antwort wirft eine ProtocolException auf:

OutputStream os = conn.getOutputStream();

da es die Ausgabe für das URLConnection-Objekt nicht aktiviert. Die Lösung sollte Folgendes beinhalten:

conn.setDoOutput(true);

damit es funktioniert.

Wenn es nicht zu spät ist, würde ich gerne meinen Code teilen

Dienstprogramme.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;
    }

Hauptaktivität.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...
        }
    }

  • @Srinivasan, wie Sie in meinem Code sehen: “if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { … } else { … } “

    – BNK

    7. Dezember 2015 um 10:22 Uhr

  • Ja, das habe ich bereits verstanden, aber was ich gefragt habe, war, welche Variable die vollständige Antwort von der angegebenen URL haben wird

    – iSrinivasan27

    7. Dezember 2015 um 10:25 Uhr

  • @Srinivasan mehr Details können Sie versuchen InputStream inputStream = null; if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { inputStream = urlConnection.getInputStream(); } Else { InputStream = urlConnection.getErrorStream(); }

    – BNK

    7. Dezember 2015 um 10:27 Uhr

  • @Srinivasan tatsächlich, wenn der Resp-Code < 400 (Bad Request) ist, verwenden Sie getInputStream, wenn> = 400, getErrorStream

    – BNK

    7. Dezember 2015 um 10:29 Uhr

  • Super Stuff Bro Gute Beispiele

    – Was ist los

    15. Februar 2019 um 5:24 Uhr

972430cookie-checkSo fügen Sie Parameter zu HttpURLConnection hinzu, indem Sie POST mit NameValuePair verwenden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy