Hinzufügen von Parametern zu HttpURLConnection mithilfe von POST mithilfe von NameValuePair

257

Ich versuche, POST mit zu machen HttpURLConnection(ich muss es auf diese Weise verwenden, kann es nicht verwenden HttpPost) und möchte dieser Verbindung Parameter hinzufügen, wie z

post.setEntity(new UrlEncodedFormEntity(nvp));

wo

nvp = new ArrayList<NameValuePair>();

Ich kann keinen Weg finden, wie ich dies ArrayListzu meinem HttpURLConnectionhier hinzugefügten hinzufügen kann :

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, das Zertifikat nicht zu überprüfen . Das ist jedoch kein Problem, es postet den Server gut. Aber ich brauche es, um mit Argumenten zu posten.

Irgendwelche Ideen?


Doppelter Haftungsausschluss:

Im Jahr 2012 hatte ich keine Ahnung, wie Parameter in eine HTTP-POST- Anfrage eingefügt wurden . Ich habe daran festgehalten, NameValuePairweil es in einem Tutorial war. Diese Frage mag wie ein Duplikat erscheinen, aber mein 2012er hat diese andere Frage selbst gelesen und sie wurde NICHT verwendet NameValuePair. Es hat mein Problem tatsächlich nicht gelöst.

Michal
quelle
2
Wenn Sie Probleme beim Posten von Parametern haben, kann Ihnen der folgende Link helfen. 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, Zeichensatz), URLEncoder.encode (param2, Zeichensatz)); Sie können eine Abfragezeichenfolge erstellen, anstatt die NameValuePair-Liste zu verwenden.
Hitendra
"Ich muss es so verwenden, kann HttpPost nicht verwenden", deshalb habe ich vorgeschlagen, dass diese andere Antwort von Manikandan gut funktioniert.
Hitendra
3
Mögliches Duplikat von Java - HTTP-Parameter einfach über die POST-Methode
senden
1
Es war, weil "viele der Antworten" hier die gleichen waren wie die Antworten auf diese Frage. Aber jetzt sehe ich, dass es eine andere Frage ist, danke für die Klarstellung :)
Rogerdpack

Antworten:

362

Sie können den Ausgabestream für die Verbindung abrufen und die Parameterabfragezeichenfolge in diese schreiben.

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
quelle
25
NameValuePair kann auch durch SimpleEntry von AbstractMap ersetzt werden. Siehe diese Seite: stackoverflow.com/questions/2973041/a-keyvaluepair-in-java
Hier sind die Importe, wenn Sie sich nicht sicher sind. import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair;
WoodenKitty
9
Für eine optimale 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 gesamten Anforderungshauptteil im Speicher zu puffern, bevor er übertragen wird, wodurch Heap verschwendet (und möglicherweise erschöpft) und die Latenz erhöht wird.
Muhammad Babar
11
NameValuePair ist in Api 22 veraltet. Überprüfen Sie meine Antwort stackoverflow.com/a/29561084/4552938
Fahim
1
Möglicherweise können Sie den Rohmodus verwenden, wenn Sie ein URL-Objekt URL url = new URL("http://yoururl.com?k1=v1&k2=v2&···&kn=vn");erstellen. Wenn Sie conn für die Verwendung der POST-Methode festlegen, müssen Sie diese nicht schreiben.
Alexscmar
184

Da das NameValuePair veraltet ist. Ich 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();
    }
Fahim
quelle
10
Danke, dass du es auf dem neuesten Stand hältst Fahim :-)
Michal
3
Wenn Ihre compileSdkVersion 23 (Marshmallow) ist, können Sie NameValuePair nicht mehr verwenden, da die Bibliothek entfernt wurde. Ich hatte Angst, dass Migration ein Schmerz sein würde, aber Ihre Lösung hat mir viel Zeit gespart. Danke dir.
ChallengeAccepted
Das funktioniert gut, aber warum hat die Antwort doppelte Anführungszeichen ""result""?
Apostrofix
1
Hatte einer von Ihnen ein Problem mit dieser Zeile OutputStream os = conn.getOutputStream();auf Jelly Bean, da keine Adresse mit dem Hostnamen verknüpft war?
Ricardo
1
Vielen Dank, dass Sie Ihren Code geteilt haben. Selbst die Android-Entwickler-Website bietet keine Lösung.
Ahsan
153

Wenn Sie die ArrayList<NameValuePair>for-Parameter nicht benötigen , ist dies eine kürzere Lösung, mit der die Abfragezeichenfolge mithilfe der Uri.BuilderKlasse erstellt wird:

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
quelle
7
Dies sollte eine Antwort sein, da das Rad nicht neu erfunden werden muss!
Injektor
Wie lade ich Filebody in Appendqueryparameter für Bilder und alles hoch
Harsha
2
zufriedenstellendere Lösung
PYPL
@mpolci, ich habe eine Frage / Zweifel bezüglich der komplexen Art von Parametern. Ich habe Parameter und weiß nicht, wie ich diese Parameter übergeben soll. {"Schlüssel1": "Wert1", "Schlüssel2": "Wert2", "Schlüssel3": {"innerer Schlüssel1": "innerer Wert1", "innerer Schlüssel2": "innerer Wert 2"}}. Ich habe diese Art von komplexen Schlüsselwertparametern erhalten und möchte wissen, wie ich diese Parameter im Webservice übergeben kann.
Krups
1
@Krups Ich denke, Ihr Problem ist anders als dieses, versuchen Sie, nach dem Senden von JSON-Objekt mit POST
mpolci
25

Eine Lösung besteht darin, eine eigene Parameterzeichenfolge zu erstellen.

Dies ist die eigentliche Methode, die ich für mein letztes Projekt verwendet habe. Sie müssen die Argumente von hashtable in namevaluepair ä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();
}

POSTEN der Parameter:

OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write(getPostParamString(req.getPostParams()));
Stefan Emanuelsson
quelle
3
Sicherlich sollten Sie die Schlüssel-Wert-Paare codieren
Max Nanasy
14

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

Sie können die Methode UrlEncodedFormEntity.writeTo (OutputStream) verwenden .

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
quelle
14

Die akzeptierte Antwort löst eine ProtocolException aus bei:

OutputStream os = conn.getOutputStream();

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

conn.setDoOutput(true);

damit es funktioniert.

Victor Caveda
quelle
13

Wenn es nicht zu spät ist, möchte ich meinen Code teilen

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
quelle
@Srinivasan, wie Sie in meinem Code sehen: "if (urlConnection.getResponseCode () == HttpURLConnection.HTTP_OK) {...} else {...}"
BNK
Ja, das habe ich schon bekommen, aber ich habe gefragt, welche Variable die gesamte Antwort von der angegebenen URL haben wird
iSrinivasan27
1
@Srinivasan mehr Details können Sie InputStream versuchen inputStream = null; if (urlConnection.getResponseCode () == HttpURLConnection.HTTP_OK) {inputStream = urlConnection.getInputStream (); } else {inputStream = urlConnection.getErrorStream (); }
BNK
@Srinivasan tatsächlich, wenn resp Code <400 (Bad Request), verwenden Sie getInputStream, wenn> = 400, getErrorStream
BNK
1
Super Stuff Bro Gute Beispiele
Was ist los am
10

Es gibt einen viel einfacheren Ansatz mit PrintWriter (siehe hier) )

Grundsätzlich brauchen Sie nur:

// 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
quelle
4

AsyncTaskDaten wie JSONObectüber POSTMethode senden

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
quelle
3

Versuche dies:

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

Sie können so viele hinzufügen, nameValuePairswie Sie benötigen. Und vergessen Sie nicht, die Anzahl in der Liste zu erwähnen.

Manikandan
quelle
Verweisen Sie auf diesen Link. xyzws.com/Javafaq/…
Manikandan
1
Dies beantwortet nicht die Frage mit dem Titel How to add parameters to HttpURLConnection using POST- Es führt in die Irre.
User3
2
Dies ist keine richtige Antwort auf diese Frage.
Skynet
1
NameValuePair ist in Api 22 veraltet. Überprüfen Sie meine Antwort stackoverflow.com/a/29561084/4552938
Fahim
2

Zum Aufrufen von POST / PUT / DELETE / GET Restful-Methoden mit benutzerdefinierten Header- oder JSON-Daten kann die folgende Async-Klasse verwendet werden

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

Und die Verwendung ist

    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.
quelle
1

Mit org.apache.http.client.HttpClient können Sie dies auch auf eine besser lesbare Weise wie unten beschrieben tun.

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

Innerhalb von try catch können Sie einfügen

// 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
quelle
1
Danke für die Antwort! Ich kann es jedoch nicht so verwenden (in der Frage, erste Zeile angegeben).
Michal
7
Dies ist keine richtige Antwort auf diese Frage.
Skynet
3
NameValuePair ist in Api 22 veraltet. Überprüfen Sie meine Antwort stackoverflow.com/a/29561084/4552938
Fahim
1
Sogar HTTP Client veraltet und entfernt in API 23
RevanthKrishnaKumar V.
0

In meinem Fall habe ich eine Funktion wie diese erstellt, um eine Post-Anfrage zu stellen, die eine String-URL und eine Hashmap von Parametern verwendet

 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
quelle
0

Ich benutze so etwas:

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
quelle
-1
JSONObject params = new JSONObject();
try {
   params.put(key, val);
}catch (JSONException e){
   e.printStackTrace();
}

So übergebe ich "params" (JSONObject) durch POST

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