Cách thêm tham số vào HTTPURLConnection bằng POST bằng NameValuePair


257

Tôi đang cố gắng thực hiện POST với HttpURLConnection(tôi cần sử dụng theo cách này, không thể sử dụng HttpPost) và tôi muốn thêm các tham số vào kết nối đó, chẳng hạn như

post.setEntity(new UrlEncodedFormEntity(nvp));

Ở đâu

nvp = new ArrayList<NameValuePair>();

có một số dữ liệu được lưu trữ. Tôi không thể tìm cách thêm dữ liệu này ArrayListvào HttpURLConnectionđây:

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

Lý do cho sự kết hợp https và http khó xử đó là nhu cầu không xác minh chứng chỉ. Đó không phải là một vấn đề, mặc dù, nó đăng máy chủ tốt. Nhưng tôi cần nó để đăng với các đối số.

Có ý kiến ​​gì không?


Tuyên bố từ chối trách nhiệm:

Quay trở lại năm 2012, tôi không biết làm thế nào các tham số được chèn vào yêu cầu POST HTTP . Tôi đã bị treo NameValuePairbởi vì nó là trong một hướng dẫn. Câu hỏi này có vẻ giống như một bản sao, tuy nhiên, năm 2012 tôi tự đọc câu hỏi khác đó và nó KHÔNG được sử dụng NameValuePair. Trên thực tế, nó không giải quyết được vấn đề của tôi.


2
Nếu bạn có vấn đề với việc đăng thông số thì liên kết dưới đây có thể giúp bạn. stackoverflow.com/questions/2793150/ cường
Hitendra

1
Chuỗi url = " example.com "; Chuỗi ký tự = "UTF-8"; Chuỗi param1 = "value1"; Chuỗi param2 = "value2"; // ... Truy vấn chuỗi = String.format ("param1 =% s & param2 =% s", URLEncoder.encode (param1, bộ ký tự), URLEncoder.encode (param2, bộ ký tự)); bạn có thể tạo một chuỗi truy vấn thay vì sử dụng Danh sách NameValuePair.
Hitendra

"Tôi cần sử dụng nó theo cách này, không thể sử dụng HttpPost" đó là lý do tại sao tôi đã đề xuất câu trả lời khác được đăng bởi Manikandan hoạt động tốt.
Hitendra


1
Đó là bởi vì "nhiều câu trả lời" ở đây giống như câu trả lời cho câu hỏi đó. Nhưng bây giờ tôi thấy đó là một câu hỏi khác, cảm ơn vì đã làm rõ :)
rogerdpack

Câu trả lời:


362

Bạn có thể nhận được luồng đầu ra cho kết nối và viết chuỗi truy vấn tham số cho nó.

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

25
NameValuePair cũng có thể được thay thế bằng SimpleEntry của AbstractMap. Xem trang này: stackoverflow.com/questions/2973041/a-keyvaluepair-in-java

Dưới đây là hàng nhập khẩu nếu bạn không chắc chắn. nhập org.apache.http.NameValuePair; nhập org.apache.http.message.BasicNameValuePair;
WoodKitty

9
Để có hiệu suất tốt nhất, bạn nên gọi setFixedL wavelStreamingMode (int) khi chiều dài cơ thể được biết trước hoặc setChunkedStreamingMode (int) khi không. Nếu không, kết nối httpURLC sẽ bị buộc phải đệm phần thân yêu cầu hoàn chỉnh trong bộ nhớ trước khi nó được truyền đi, gây lãng phí (và có thể làm cạn kiệt) đống và tăng độ trễ.
Muhammad Babar

11
NameValuePair không được dùng nữa trong Api 22, hãy kiểm tra câu trả lời của tôi stackoverflow.com/a/29561084/4552938
Fahim

1
Có lẽ bạn có thể sử dụng chế độ thô khi xây dựng đối tượng URL, đại loại như thế này: URL url = new URL("http://yoururl.com?k1=v1&k2=v2&···&kn=vn");sau đó khi đặt liên kết để sử dụng phương thức POST, bạn không cần phải viết chúng.
alexscmar

184

Vì NameValuePair không được dùng nữa. Nghĩ đến việc chia sẻ mã của tôi

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

10
Cảm ơn bạn đã cập nhật Fahim :-)
Michal

3
Nếu compileSdkVersion của bạn là 23 (Marshmallow), bạn không còn có thể sử dụng NameValuePair vì họ đã xóa thư viện. Tôi đã sợ rằng di cư sẽ là một nỗi đau nhưng giải pháp của bạn đã tiết kiệm cho tôi rất nhiều thời gian. Cảm ơn bạn.
Thử thách Được chấp nhận vào

Điều đó làm việc tuyệt vời, nhưng tại sao các phản ứng có dấu ngoặc kép, như thế ""result""nào?
Tông đồ

1
Có ai trong các bạn gặp vấn đề với dòng này OutputStream os = conn.getOutputStream();trên thạch đậu liên quan đến việc không có địa chỉ liên quan đến tên máy chủ không?
Ricardo

1
Cảm ơn đã chia sẻ mã của bạn. Ngay cả trang web của nhà phát triển Android cũng không cung cấp giải pháp.
Ahsan

153

Nếu bạn không cần các ArrayList<NameValuePair>tham số, đây là một giải pháp ngắn hơn để xây dựng chuỗi truy vấn bằng cách sử dụng Uri.Builderlớp:

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

7
đây phải là một câu trả lời, vì không phải phát minh lại bánh xe!
tiêm chích

làm cách nào để tải lên tệp người dùng trong phần phụ lục cho hình ảnh và tất cả
Harsha

2
giải pháp thỏa mãn hơn
PYPL

@mpolci, tôi có một câu hỏi / nghi ngờ về loại tham số phức tạp. Tôi có các tham số và tôi không biết làm thế nào để vượt qua các tham số đó. {"key1": "value1", "key2": "value2", "key3": {"Internal key1": "Internal value1", "Internal key2": "bên trong 2"}}. Tôi đã được cung cấp loại tham số giá trị khóa phức tạp này và tôi muốn biết làm thế nào tôi có thể vượt qua các tham số này trong dịch vụ web?
Krups

1
@Krups Tôi nghĩ vấn đề của bạn khác với vấn đề này, hãy thử tìm cách gửi đối tượng JSON bằng POST
mpolci

25

Một giải pháp là tạo chuỗi params của riêng bạn.

Đây là phương pháp thực tế tôi đã sử dụng cho dự án mới nhất của mình. Bạn cần thay đổi đối số từ hashtable sang 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();
}

BÀI ĐĂNG thông số:

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

3
Chắc chắn bạn nên mã hóa các cặp khóa-giá trị
Max Nanasy

14

Tôi nghĩ rằng tôi đã tìm thấy chính xác những gì bạn cần. Nó có thể giúp đỡ người khác.

Bạn có thể sử dụng phương thức UrlEncodingFormEntity.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) {}
}

14

Câu trả lời được chấp nhận đưa ra Giao thức ngoại lệ tại:

OutputStream os = conn.getOutputStream();

bởi vì nó không cho phép đầu ra cho đối tượng URLConnection. Giải pháp nên bao gồm:

conn.setDoOutput(true);

Để làm cho nó hoạt động.


13

Nếu không quá muộn, tôi muốn chia sẻ mã của mình

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

@Srinivasan như bạn thấy trong mã của tôi: "if (urlConnection.getResponseCode () == HttpURLConnection.HTTP_OK) {...} khác {...}"
BNK

Tôi đã có nhưng điều tôi hỏi là biến nào sẽ có toàn bộ phản hồi từ url đã cho
iSrinivasan27

1
@Srinivasan chi tiết hơn bạn có thể thử InputStream inputStream = null; if (urlConnection.getResponseCode () == httpURLConnection.HTTP_OK) {inputStream = urlConnection.getInputStream (); } other {inputStream = urlConnection.getErrorStream (); }
BNK

@Srinivasan thực sự, nếu mã resp <400 (Yêu cầu xấu), bạn sử dụng getInputStream, nếu> = 400, getErrorStream
BNK

1
Super Stuff Bro Ví dụ hay
Điều gì sẽ xảy ra vào ngày

10

Có một cách tiếp cận dễ dàng hơn nhiều bằng PrintWriter (xem tại đây )

Về cơ bản tất cả những gì bạn cần là:

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

4

AsyncTaskđể gửi dữ liệu JSONObectqua POSTPhương thức

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

3

Thử cái này:

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

Bạn có thể thêm bao nhiêu nameValuePairstùy ý. Và đừng quên đề cập đến số lượng trong danh sách.


tham khảo liên kết này. xyzws.com/Javafaq/
Manikandan

1
Điều này không trả lời câu hỏi có tiêu đề How to add parameters to HttpURLConnection using POST- Nó sai.
dùng3

2
Đây không phải là một câu trả lời thích hợp cho câu hỏi này.
Skynet

1
NameValuePair không được dùng nữa trong Api 22, hãy kiểm tra câu trả lời của tôi stackoverflow.com/a/29561084/4552938
Fahim

2

Để gọi các phương thức POST / PUT / DELETE / GET Restful với dữ liệu tiêu đề hoặc json tùy chỉnh, có thể sử dụng lớp Async sau đây

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

Và cách sử dụng là

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

1

Bằng cách sử dụng org.apache.http.client.HttpClient, bạn cũng có thể dễ dàng thực hiện việc này với cách dễ đọc hơn như dưới đây.

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

Trong thử bắt bạn có thể chèn

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

1
Cảm ơn bạn đã phản hồi! Tôi không thể sử dụng nó theo cách này mặc dù (được nêu trong câu hỏi, dòng đầu tiên).
Michal

7
Đây không phải là một câu trả lời thích hợp cho câu hỏi này.
Skynet

3
NameValuePair không được dùng nữa trong Api 22, hãy kiểm tra câu trả lời của tôi stackoverflow.com/a/29561084/4552938
Fahim

1
Ngay cả HTTP Client cũng không dùng nữa và bị xóa trong api 23
RevanthKrishnaKumar V.

0

Trong trường hợp của tôi, tôi đã tạo chức năng như thế này để thực hiện yêu cầu Đăng bài lấy url Chuỗi và hàm băm của các tham số

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

0

Tôi sử dụng một cái gì đó như thế này:

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

-1
JSONObject params = new JSONObject();
try {
   params.put(key, val);
}catch (JSONException e){
   e.printStackTrace();
}

đây là cách tôi chuyển "params" (JSONObject) thông qua POST

connection.getOutputStream().write(params.toString().getBytes("UTF-8"));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.