วิธีเพิ่มพารามิเตอร์ใน HttpURLConnection โดยใช้ POST โดยใช้ NameValuePair


257

ฉันกำลังพยายามทำPOSTด้วยHttpURLConnection(ฉันต้องใช้วิธีนี้ใช้ไม่ได้HttpPost) และฉันต้องการเพิ่มพารามิเตอร์ให้กับการเชื่อมต่อนั้นเช่น

post.setEntity(new UrlEncodedFormEntity(nvp));

ที่ไหน

nvp = new ArrayList<NameValuePair>();

มีข้อมูลบางส่วนเก็บไว้ฉันไม่สามารถหาวิธีเพิ่มสิ่งนี้ในสิ่งArrayListที่ฉันHttpURLConnectionอยู่ที่นี่:

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

เหตุผลสำหรับชุดค่าผสม https และ http ที่น่าอึดอัดใจนั้นไม่จำเป็นต้องตรวจสอบใบรับรอง นั่นไม่ใช่ปัญหา แต่จะโพสต์เซิร์ฟเวอร์ได้ดี แต่ฉันต้องการมันเพื่อโพสต์ด้วยข้อโต้แย้ง

ความคิดใด ๆ


ข้อจำกัดความรับผิดชอบซ้ำซ้อน:

ย้อนกลับไปในปี 2012 ฉันไม่รู้เลยว่าพารามิเตอร์ถูกแทรกลงในคำขอHTTP POSTได้อย่างไร ฉันถูกแขวนไว้NameValuePairเพราะมันอยู่ในการกวดวิชา คำถามนี้อาจจะดูเหมือนเป็นซ้ำ แต่ 2012 ตัวฉันอ่านที่อื่น ๆคำถามและมันก็ไม่ได้NameValuePairใช้ ในความเป็นจริงมันไม่ได้แก้ปัญหาของฉัน


2
หากคุณมีปัญหาเกี่ยวกับการโพสต์ params ลิงค์ด้านล่างอาจช่วยคุณได้ stackoverflow.com/questions/2793150/…
Hitendra

1
String url = " example.com "; String charset = "UTF-8"; String param1 = "value1"; String param2 = "value2"; // ... สตริงการสืบค้น = String.format ("param1 =% s & param2 =% s", URLEncoder.encode (param1, ชุดอักขระ), URLEncoder.encode (param2, ชุดอักขระ)); คุณสามารถสร้างสตริงแบบสอบถามแทนการใช้รายชื่อ NameValuePair
Hitendra

"ฉันจำเป็นต้องใช้วิธีนี้ไม่สามารถใช้ HttpPost" ได้นั่นเป็นสาเหตุที่ฉันได้แนะนำคำตอบอื่นที่โพสต์โดย Manikandan ทำงานได้ดี
Hitendra


1
เป็นเพราะ "คำตอบหลายคำ" ที่นี่เหมือนกันกับคำตอบของคำถามนั้น แต่ตอนนี้ผมเห็นว่ามันเป็นคำถามที่แตกต่างกัน, ขอบคุณสำหรับการชี้แจง :)
rogerdpack

คำตอบ:


362

คุณสามารถรับเอาต์พุตสตรีมสำหรับการเชื่อมต่อและเขียนสตริงเคียวรีพารามิเตอร์ลงไป

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 สามารถทดแทนได้ด้วย SimpleEntry ของ AbstractMap เช่นกัน ดูหน้านี้: stackoverflow.com/questions/2973041/a-keyvaluepair-in-java

นี่คือการนำเข้าหากคุณไม่แน่ใจ นำเข้า org.apache.http.NameValuePair; นำเข้า org.apache.http.message.BasicNameValuePair;
WoodenKitty

9
เพื่อประสิทธิภาพที่ดีที่สุดคุณควรเรียกใช้ setFixedLengthStreamingMode (int) อย่างใดอย่างหนึ่งเมื่อทราบถึงความยาวของร่างกายล่วงหน้าหรือ setChunkedStreamingMode (int) เมื่อไม่มี มิฉะนั้น HttpURLConnection จะถูกบังคับให้บัฟเฟอร์เนื้อหาคำร้องขอทั้งหมดในหน่วยความจำก่อนที่จะถูกส่งส่งกองขยะ (และอาจหมดไป) และเพิ่มเวลาแฝงที่เพิ่มขึ้น
Muhammad Babar

11
NameValuePair เลิกใช้แล้วใน Api 22, ตรวจสอบคำตอบของฉันstackoverflow.com/a/29561084/4552938
Fahim

1
บางทีคุณสามารถใช้โหมด raw เมื่อสร้างวัตถุ URL สิ่งนี้: URL url = new URL("http://yoururl.com?k1=v1&k2=v2&···&kn=vn");แล้วเมื่อตั้งค่าเชื่อมต่อเพื่อใช้วิธีการ POST ไม่จำเป็นต้องเขียนพวกเขา
alexscmar

184

เนื่องจาก NameValuePair เลิกใช้แล้ว คิดว่าจะแบ่งปันรหัสของฉัน

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
ขอบคุณสำหรับการปรับปรุงให้เป็นปัจจุบัน Fahim :-)
มิคาล

3
หาก compileSdkVersion ของคุณคือ 23 (Marshmallow) คุณจะไม่สามารถใช้ NameValuePair ได้อีกต่อไปเพราะพวกเขานำห้องสมุดออก ฉันกลัวว่าการย้ายถิ่นจะเป็นความเจ็บปวด แต่ทางออกของคุณช่วยฉันได้มาก ขอบคุณ.
ChallengeAccepted

ที่ใช้งานได้ดี แต่ทำไมไม่ตอบสนองมีราคาคู่เช่น""result""?
Apostrofix

1
มีใครในคุณมีปัญหากับสายนี้OutputStream os = conn.getOutputStream();ใน Jelly Bean เกี่ยวกับที่อยู่ที่ไม่เกี่ยวข้องกับชื่อโฮสต์?
Ricardo

1
ขอบคุณที่แบ่งปันรหัสของคุณ แม้แต่เว็บไซต์ผู้พัฒนา Android ก็ยังไม่มีวิธีแก้ปัญหา
Ahsan

153

หากคุณไม่ต้องการArrayList<NameValuePair>พารามิเตอร์ for นี่เป็นวิธีแก้ปัญหาที่สั้นกว่าที่สร้างสตริงการสืบค้นโดยใช้Uri.Builderคลาส:

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
นี่ควรเป็นคำตอบเนื่องจากไม่ต้องทำล้ออีกครั้ง!
injecteer

วิธีการอัพโหลด filebody ในภาคผนวกพารามิเตอร์สำหรับรูปภาพและทั้งหมด
Harsha

2
วิธีการแก้ปัญหาที่น่าพอใจมากขึ้น
PYPL

@mpolci ฉันมีคำถาม / ข้อสงสัยเกี่ยวกับชนิดของพารามิเตอร์ที่ซับซ้อน ฉันมีพารามิเตอร์และฉันไม่รู้วิธีส่งพารามิเตอร์เหล่านั้น {"key1": "value1", "key2": "value2", "key3": {"Inner key1": "Inner value1", "Inner key2": "Inner value 2"}} ฉันได้รับพารามิเตอร์คีย์คีย์ที่ซับซ้อนประเภทนี้แล้วและฉันต้องการทราบว่าฉันจะส่งผ่านพารามิเตอร์เหล่านี้ในเว็บเซอร์เวอร์ได้อย่างไร
Krups

1
@Krups ฉันคิดว่าปัญหาของคุณแตกต่างจากนี้ลองมองหาการส่งวัตถุ JSON โดยใช้ POST
mpolci

25

ทางออกหนึ่งคือการสร้างสตริงพารามิเตอร์ของคุณเอง

นี่เป็นวิธีการจริงที่ฉันใช้สำหรับโครงการล่าสุดของฉัน คุณต้องเปลี่ยน args จาก hashtable เป็น namevaluepair's:

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

การโพสต์ params:

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

3
แน่นอนคุณควรเข้ารหัสคู่ค่าคีย์
Max Nanasy

14

ฉันคิดว่าฉันพบสิ่งที่คุณต้องการ มันอาจช่วยคนอื่น

คุณสามารถใช้วิธีการ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) {}
}

14

คำตอบที่ยอมรับจะพ่น ProtocolException ที่:

OutputStream os = conn.getOutputStream();

เพราะมันไม่ได้เปิดใช้งานการส่งออกสำหรับวัตถุ URLConnection วิธีแก้ปัญหาควรรวมถึงสิ่งนี้:

conn.setDoOutput(true);

เพื่อให้มันทำงาน


13

หากยังไม่สายเกินไปฉันต้องการแชร์รหัสของฉัน

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 ตามที่คุณเห็นในรหัสของฉัน: "if (urlConnection.getResponseCode () == HttpURLConnection.HTTP_OK) {... } else {... }"
BNK

Ya ฉันได้แล้ว แต่สิ่งที่ฉันถามคือตัวแปรที่จะมีการตอบสนองทั้งหมดจาก url ที่กำหนด
iSrinivasan27 27

1
@Srinivasan รายละเอียดเพิ่มเติมคุณสามารถลอง InputStream inputStream = null; if (urlConnection.getResponseCode () == HttpURLConnection.HTTP_OK) {inputStream = urlConnection.getInputStream (); } else {inputStream = urlConnection.getErrorStream (); }
BNK

@Srinivasan จริง ๆ ถ้ารหัส resp <400 (คำขอแย่) คุณใช้ getInputStream ถ้า> = 400, getErrorStream
BNK

1
ตัวอย่างที่ดีของ Super Stuff
เกิดอะไรขึ้น

10

มีวิธีการที่ง่ายกว่ามากเมื่อใช้ PrintWriter (ดูที่นี่ )

โดยพื้นฐานแล้วสิ่งที่คุณต้องการคือ:

// 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เพื่อส่งข้อมูลJSONObectผ่านทางPOSTวิธีการ

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

ลองสิ่งนี้:

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

คุณสามารถเพิ่มได้มากnameValuePairsเท่าที่คุณต้องการ และอย่าลืมพูดถึงการนับในรายการ


อ้างอิงลิงค์นี้ xyzws.com/Javafaq/…
Manikandan

1
สิ่งนี้ไม่ตอบคำถามที่มีชื่อว่าHow to add parameters to HttpURLConnection using POST- มันทำให้เข้าใจผิด
User3

2
นี่ไม่ใช่คำตอบที่เหมาะสมสำหรับคำถามนี้
Skynet

1
NameValuePair เลิกใช้ใน Api 22, ตรวจสอบคำตอบของฉันstackoverflow.com/a/29561084/4552938
Fahim

2

วิธีเรียกใช้ POST / PUT / DELETE / GET วิธีการพักผ่อนที่มีส่วนหัวที่กำหนดเองหรือข้อมูล json สามารถใช้คลาส 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;
}   }

และการใช้งานคือ

    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

โดยใช้ org.apache.http.client.HttpClient นอกจากนี้คุณยังสามารถทำได้อย่างง่ายดายด้วยวิธีที่อ่านได้มากขึ้นดังต่อไปนี้

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

ภายในลองจับคุณสามารถแทรก

// 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
ขอบคุณสำหรับการตอบสนอง! ฉันไม่สามารถใช้วิธีนี้ได้ (ระบุไว้ในคำถามบรรทัดแรก)
Michal

7
นี่ไม่ใช่คำตอบที่เหมาะสมสำหรับคำถามนี้
Skynet

3
NameValuePair เลิกใช้ใน Api 22, ตรวจสอบคำตอบของฉันstackoverflow.com/a/29561084/4552938
Fahim

1
แม้แต่ไคลเอนต์ HTTP ก็เลิกใช้และลบออกใน api 23
RevanthKrishnaKumar V.

0

ในกรณีของฉันฉันได้สร้างฟังก์ชั่นเช่นนี้เพื่อให้คำขอลงรายการบัญชีซึ่งใช้ String url และ hashmap ของพารามิเตอร์

 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

ฉันใช้สิ่งนี้:

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

นี่คือวิธีที่ฉันผ่าน "params" (JSONObject) ผ่าน POST

connection.getOutputStream().write(params.toString().getBytes("UTF-8"));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.