Jak dodać parametry do HttpURLConnection przy użyciu POST przy użyciu NameValuePair

257

Próbuję zrobić POST z HttpURLConnection(muszę używać go w ten sposób, nie można użyć HttpPost) i chciałbym dodać do tego parametry połączenia, takich jak

post.setEntity(new UrlEncodedFormEntity(nvp));

gdzie

nvp = new ArrayList<NameValuePair>();

posiadanie niektórych danych. Nie mogę znaleźć sposobu, aby dodać to ArrayListdo mojego, HttpURLConnectionktóry jest tutaj:

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

Powodem tej niezręcznej kombinacji https i http jest konieczność nie weryfikowania certyfikatu. Nie stanowi to jednak problemu, dobrze publikuje serwer. Ale potrzebuję tego, aby zamieszczać argumenty.

Jakieś pomysły?


Duplikat zastrzeżenia:

W 2012 roku nie miałem pojęcia, jak parametry zostały wstawione do żądania HTTP POST . Trzymałem się tego, NameValuePairponieważ był w tutorialu. To pytanie może wydawać się duplikatem, jednak moje ja z 2012 roku przeczytałem to drugie pytanie i NIE było z niego korzystać NameValuePair. W rzeczywistości nie rozwiązało to mojego problemu.

Michał
źródło
2
Jeśli masz problem z opublikowaniem params, poniższy link może ci pomóc. stackoverflow.com/questions/2793150/…
Hitendra,
1
String url = " example.com "; Zestaw znaków string = "UTF-8"; Ciąg param1 = "wartość1"; Ciąg param2 = "wartość2"; // ... Ciąg zapytania = String.format ("param1 =% s & param2 =% s", URLEncoder.encode (param1, charset), URLEncoder.encode (param2, charset)); możesz utworzyć ciąg zapytania zamiast korzystać z listy NameValuePair.
Hitendra,
„Muszę używać tego w ten sposób, nie mogę używać HttpPost”, dlatego zasugerowałem, że ta inna odpowiedź opublikowana przez Manikandana działa dobrze.
Hitendra,
1
Stało się tak, ponieważ „wiele odpowiedzi” tutaj było takich samych, jak odpowiedzi na to pytanie. Ale teraz widzę, że to inne pytanie, dziękuję za wyjaśnienie :)
rogerdpack

Odpowiedzi:

362

Możesz pobrać strumień wyjściowy dla połączenia i zapisać do niego ciąg zapytania parametru.

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
źródło
25
NameValuePair można również zastąpić SimpleEntry firmy AbstractMap. Zobacz tę stronę: stackoverflow.com/questions/2973041/a-keyvaluepair-in-java
Oto import, jeśli nie masz pewności. import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair;
WoodenKitty
9
Aby uzyskać najlepszą wydajność, należy wywołać albo setFixedLengthStreamingMode (int), gdy długość ciała jest znana z góry, albo setChunkedStreamingMode (int), gdy tak nie jest. W przeciwnym razie HttpURLConnection będzie zmuszony buforować całą treść żądania w pamięci przed jej przesłaniem, marnując (i ewentualnie wyczerpując) stertę i zwiększając opóźnienie.
Muhammad Babar
11
NameValuePair jest przestarzałe w Api 22, sprawdź moją odpowiedź stackoverflow.com/a/29561084/4552938
Fahim
1
Być może możesz użyć trybu raw podczas budowania obiektu URL, coś takiego: URL url = new URL("http://yoururl.com?k1=v1&k2=v2&···&kn=vn");wtedy, gdy ustawisz conn, aby używał metody POST, nie musisz ich zapisywać.
alexscmar
184

Ponieważ NameValuePair jest przestarzałe. Myśl o udostępnieniu mojego kodu

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
źródło
10
Dziękujemy za aktualizację Fahim :-)
Michał
3
Jeśli twój compileSdkVersion ma 23 (Marshmallow), nie możesz już używać NameValuePair, ponieważ usunęli bibliotekę. Obawiałem się, że migracja będzie bolesna, ale twoje rozwiązanie zaoszczędziło mi dużo czasu. Dziękuję Ci.
Wyzwanie
To działa świetnie, ale dlaczego odpowiedź zawiera podwójne cudzysłowy ""result""?
Apostrofix
1
Czy któryś z was miał problem z tym wierszem OutputStream os = conn.getOutputStream();na żelku, który nie dotyczy adresu związanego z nazwą hosta?
Ricardo
1
Dziękujemy za udostępnienie kodu. Nawet witryna programisty Androida nie oferuje rozwiązania.
Ahsan,
153

Jeśli nie potrzebujesz ArrayList<NameValuePair>parametrów for, jest to krótsze rozwiązanie, które buduje ciąg zapytania za pomocą Uri.Builderklasy:

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
źródło
7
to powinna być odpowiedź, ponieważ nie trzeba ponownie wymyślać koła!
wtryskiwacz
jak przesłać bodybody w parametrze appendquery dla obrazów i wszystkich
Harsha,
2
bardziej satysfakcjonujące rozwiązanie
PYPL
@mpolci, mam pytanie / wątpliwości dotyczące złożonego rodzaju parametrów. Mam parametry i nie wiem, jak przekazać te parametry. {„klucz 1”: „wartość 1”, „klucz 2”: „wartość 2”, „klucz 3”: {„klucz wewnętrzny 1”: „wartość wewnętrzna 1”, „klucz wewnętrzny 2”: „wartość wewnętrzna 2”}}. Dostarczono mi tego rodzaju złożone parametry wartości klucza i chcę wiedzieć, jak przekazać te parametry w usłudze sieciowej?
Krups
1
@Krups Myślę, że twój problem różni się od tego, spróbuj poszukać obiektu JSON za pomocą POST
mpolci
25

Jednym z rozwiązań jest utworzenie własnego ciągu parametrów.

To jest faktyczna metoda, której użyłem do mojego najnowszego projektu. Musisz zmienić argumenty z hashtable na 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();
}

WYKONYWANIE parametrów:

OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write(getPostParamString(req.getPostParams()));
Stefan Emanuelsson
źródło
3
Z pewnością powinieneś
kodować
14

Myślę, że znalazłem dokładnie to, czego potrzebujesz. Może pomóc innym.

Możesz użyć metody 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
źródło
14

Zaakceptowana odpowiedź zgłasza wyjątek protokołu w:

OutputStream os = conn.getOutputStream();

ponieważ nie włącza danych wyjściowych dla obiektu URLConnection. Rozwiązanie powinno obejmować:

conn.setDoOutput(true);

aby działało.

Victor Caveda
źródło
13

Jeśli nie jest za późno, chciałbym udostępnić mój kod

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
źródło
@Srinivasan, jak widać w moim kodzie: „if (urlConnection.getResponseCode () == HttpURLConnection.HTTP_OK) {...} else {...}”
BNK
Tak, już to dostałem, ale zapytałem, która zmienna będzie miała pełną odpowiedź z podanego
adresu
1
@Srinivasan więcej szczegółów, możesz wypróbować InputStream inputStream = null; if (urlConnection.getResponseCode () == HttpURLConnection.HTTP_OK) {inputStream = urlConnection.getInputStream (); } else {inputStream = urlConnection.getErrorStream (); }
BNK,
@Srinivasan faktycznie, jeśli kod względny <400 (niepoprawne żądanie), używasz getInputStream, jeśli> = 400, getErrorStream
BNK
1
Super Stuff Bro Dobre przykłady
Co się dzieje 15
10

Jest o wiele łatwiejsze podejście przy użyciu PrintWriter (patrz tutaj )

Zasadniczo wszystko czego potrzebujesz to:

// 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
źródło
4

AsyncTaskwysłać dane jak JSONObectza pomocą POSTmetody

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
źródło
3

Spróbuj tego:

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

Możesz dodać tyle, nameValuePairsile potrzebujesz. I nie zapomnij wspomnieć o liczbie na liście.

Manikandan
źródło
sprawdź ten link. xyzws.com/Javafaq/…
Manikandan
1
To nie odpowiada na pytanie zatytułowane How to add parameters to HttpURLConnection using POST- wprowadza w błąd.
Użytkownik3
2
To nie jest właściwa odpowiedź na to pytanie.
Skynet
1
NameValuePair jest przestarzałe w Api 22, sprawdź moją odpowiedź stackoverflow.com/a/29561084/4552938
Fahim
2

Aby wywołać metody POST / PUT / DELETE / GET Restful z niestandardowym nagłówkiem lub danymi json, można użyć następującej klasy Async

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

I wykorzystanie jest

    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.
źródło
1

Korzystając z org.apache.http.client.HttpClient, możesz łatwo to zrobić w bardziej czytelny sposób, jak poniżej.

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

W ramach try catch możesz wstawić

// 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
źródło
1
Dziękuję za odpowiedź! Nie mogę tego jednak używać w ten sposób (podany w pytaniu, pierwsza linia).
Michał
7
To nie jest właściwa odpowiedź na to pytanie.
Skynet
3
NameValuePair jest przestarzałe w Api 22, sprawdź moją odpowiedź stackoverflow.com/a/29561084/4552938
Fahim
1
Nawet klient HTTP również jest przestarzały i usunięty z interfejsu API 23
RevanthKrishnaKumar V.
0

W moim przypadku utworzyłem taką funkcję, aby utworzyć żądanie Post, które pobiera ciąg adresu URL i skrót mapy parametrów

 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
źródło
0

Używam czegoś takiego:

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);
Wiaczesław Szyylkin
źródło
-1
JSONObject params = new JSONObject();
try {
   params.put(key, val);
}catch (JSONException e){
   e.printStackTrace();
}

w ten sposób przekazuję „parametry” (JSONObject) przez POST

connection.getOutputStream().write(params.toString().getBytes("UTF-8"));
Zyrus Reyes
źródło