Java - การส่งพารามิเตอร์ HTTP ผ่านวิธี POST ได้อย่างง่ายดาย


319

ฉันใช้รหัสนี้ในการส่งHTTPคำขอพร้อมพารามิเตอร์บางอย่างผ่านGETวิธีการเรียบร้อยแล้ว

void sendRequest(String request)
{
    // i.e.: request = "http://example.com/index.php?param1=a&param2=b&param3=c";
    URL url = new URL(request); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();           
    connection.setDoOutput(true); 
    connection.setInstanceFollowRedirects(false); 
    connection.setRequestMethod("GET"); 
    connection.setRequestProperty("Content-Type", "text/plain"); 
    connection.setRequestProperty("charset", "utf-8");
    connection.connect();
}

ตอนนี้ฉันอาจต้องส่งพารามิเตอร์ (เช่น param1, param2, param3) ผ่านPOSTmethod เพราะมันยาวมาก ฉันคิดว่าจะเพิ่มพารามิเตอร์พิเศษให้กับวิธีการนั้น (เช่น String httpMethod)

ฉันจะเปลี่ยนรหัสด้านบนให้น้อยที่สุดเพื่อให้สามารถส่งพารามิเตอร์ผ่านGETหรือได้POSTอย่างไร

ฉันหวังว่าการเปลี่ยนแปลง

connection.setRequestMethod("GET");

ถึง

connection.setRequestMethod("POST");

จะได้ทำเคล็ดลับ แต่พารามิเตอร์ยังคงถูกส่งผ่านวิธีการ GET

มีHttpURLConnectionวิธีใดบ้างที่จะช่วยได้บ้าง? มีการสร้าง Java ที่เป็นประโยชน์หรือไม่?

ความช่วยเหลือใด ๆ จะได้รับการชื่นชมอย่างมาก


พารามิเตอร์โพสต์จะถูกส่งภายในส่วนหัว http ไม่ได้อยู่ใน URL (โพสต์ URL ของคุณจะเป็นhttp://example.com/index.php)
dacwe

2
ไม่มีเมธอด setRequestMethod ใน Java 1.6 ที่กำหนดไว้: docs.oracle.com/javase/6/docs/api/java/net/URLConnection.html
ante.sabo

2
ส่งไปที่ UrlConnection Http ....
Peter Kriens

ขยายคำถาม! ไม่มีใครมีเบาะแสใด ๆ วิธีการส่งสิ่งที่แนบมาเป็นพารามิเตอร์โพสต์ ...
therealprashant

1
เหตุใดข้อมูลโค้ดแรกจึงเริ่มต้นด้วยคำหลัก "ฟังก์ชั่น"
Llew Vallis

คำตอบ:


470

ในคำขอ GET พารามิเตอร์จะถูกส่งเป็นส่วนหนึ่งของ URL

ในคำขอ POST พารามิเตอร์จะถูกส่งเป็นเนื้อความของคำขอหลังจากส่วนหัว

ในการทำ POST ด้วย HttpURLConnection คุณต้องเขียนพารามิเตอร์ไปยังการเชื่อมต่อหลังจากที่คุณเปิดการเชื่อมต่อ

รหัสนี้ควรให้คุณเริ่มต้น:

String urlParameters  = "param1=a&param2=b&param3=c";
byte[] postData       = urlParameters.getBytes( StandardCharsets.UTF_8 );
int    postDataLength = postData.length;
String request        = "http://example.com/index.php";
URL    url            = new URL( request );
HttpURLConnection conn= (HttpURLConnection) url.openConnection();           
conn.setDoOutput( true );
conn.setInstanceFollowRedirects( false );
conn.setRequestMethod( "POST" );
conn.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded"); 
conn.setRequestProperty( "charset", "utf-8");
conn.setRequestProperty( "Content-Length", Integer.toString( postDataLength ));
conn.setUseCaches( false );
try( DataOutputStream wr = new DataOutputStream( conn.getOutputStream())) {
   wr.write( postData );
}

40
@Alan Geleynse: 'url.openconnection ()' ไม่ได้เปิดการเชื่อมต่อ ในกรณีที่คุณไม่ได้ระบุคำสั่งการเชื่อมต่อ () การเชื่อมต่อจะเปิดขึ้นเมื่อคุณเขียนไปยังเนื้อหาคำขอ http / ได้ยินและส่ง ฉันได้ลองกับใบรับรอง ssl handshake เกิดขึ้นเฉพาะหลังจากที่คุณโทรเชื่อมต่อหรือเมื่อคุณส่งข้อมูลไปยังเซิร์ฟเวอร์
Ashwin

14
getBytes () ใช้ charaset เริ่มต้นของสภาพแวดล้อมไม่ใช่ UTF-8 charset = utf-8 จะต้องตามประเภทเนื้อหา: application / x-www-form-urlencoded; charset = utf-8 คุณทำการแปลงไบต์สองครั้งในตัวอย่าง ควรทำ: byte [] data = urlParameters.getData ("UTF-8"); connection.getOutputStream () เขียนข้อมูล (). ไม่มีประโยชน์ในการปิดและล้างและตัดการเชื่อมต่อ
Peter Kriens

8
@ PeterKriens ขอบคุณสำหรับการเพิ่มของคุณ - ฉันเชื่อว่าคุณหมายถึงbyte[] data = urlParameters.getBytes(Charset.forName("UTF-8")):)
gerrytan

7
@AlanGeleynse คุณไม่ควรพลาด wr.flush (); และ wr.close (); ในตอนท้าย?
confile

9
ทำไมมันถึงมี upvotes มากมายถ้ามันไม่ทำงาน? คุณต้องโทรconn.getResponseCode()หรือไม่conn.getInputStream()เช่นนั้นจะไม่ส่งข้อมูลใด ๆ
Imaskar

229

System.outนี่เป็นตัวอย่างง่ายๆที่กรอกแบบฟอร์มแล้วทิ้งหน้าผลให้ เปลี่ยน URL และ POST params ตามความเหมาะสมแน่นอน:

import java.io.*;
import java.net.*;
import java.util.*;

class Test {
    public static void main(String[] args) throws Exception {
        URL url = new URL("http://example.net/new-message.php");
        Map<String,Object> params = new LinkedHashMap<>();
        params.put("name", "Freddie the Fish");
        params.put("email", "fishie@seamail.example.com");
        params.put("reply_to_thread", 10394);
        params.put("message", "Shark attacks in Botany Bay have gotten out of control. We need more defensive dolphins to protect the schools here, but Mayor Porpoise is too busy stuffing his snout with lobsters. He's so shellfish.");

        StringBuilder postData = new StringBuilder();
        for (Map.Entry<String,Object> param : params.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"));

        for (int c; (c = in.read()) >= 0;)
            System.out.print((char)c);
    }
}

หากคุณต้องการผลลัพธ์ที่เป็นStringแทนที่จะพิมพ์โดยตรงทำ:

        StringBuilder sb = new StringBuilder();
        for (int c; (c = in.read()) >= 0;)
            sb.append((char)c);
        String response = sb.toString();

นี่คือคำตอบที่ดีที่สุดเนื่องจากมีการเข้ารหัสพารามิเตอร์และการใช้แผนที่
Airy

4
น่าเสียดายที่รหัสนี้ถือว่าการเข้ารหัสของเนื้อหา UTF-8นั้นไม่ได้เป็นเช่นนั้นเสมอไป ในการดึงชุดอักขระคุณควรรับส่วนหัวContent-Typeและแยกชุดอักขระของชุดนั้น เมื่อส่วนหัวที่ไม่สามารถใช้ http ISO-8859-1มาตรฐาน:
engineercoding

@Aprel IFTFY ... การใช้นิพจน์ที่มีผลข้างเคียงในการประเมินนั้นน่าเกลียดแน่นอน

1
@engineercoding น่าเสียดายที่ HTML นั้นยากกว่าการทำอย่างถูกต้องเนื่องจากอาจมี Unicode BOM <meta charset="...">หรือ<meta http-equiv="Content-Type" content="...">ส่วนหัวภายในเอกสารที่จำเป็นต้องแยกวิเคราะห์
Boann

1
@Nepster อย่าทำอย่างนั้น response += line;ช้ามากและกินเส้นแบ่ง ฉันได้เพิ่มคำตอบตัวอย่างของการรับการตอบกลับสตริง
Boann

63

ฉันไม่ได้รับตัวอย่างของอลันที่จะทำโพสต์จริงดังนั้นฉันลงเอยด้วยสิ่งนี้

String urlParameters = "param1=a&param2=b&param3=c";
URL url = new URL("http://example.com/index.php");
URLConnection conn = url.openConnection();

conn.setDoOutput(true);

OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());

writer.write(urlParameters);
writer.flush();

String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

while ((line = reader.readLine()) != null) {
    System.out.println(line);
}
writer.close();
reader.close();         

1
น่าเสียดายที่รหัสนี้ไม่ได้อ่านคำตอบ มันอ่านรูปแบบ HTML ที่ว่างเปล่า
Kovács Imre

สิ่งที่ฉันต้องเพิ่มในตัวอย่างของอลันคือการเปิดสตรีมการตอบกลับ ก่อนที่ฉันจะทำมันไม่มีไบต์ถูกส่งจริง
เลี้ยงแกะ

1
การลบการเรียก writer.close () ทำเพื่อฉัน
Maxime T

23

ฉันพบว่ามันHttpURLConnectionยุ่งยากในการใช้ และคุณต้องเขียนจำนวนมากสำเร็จรูปรหัสผิดพลาด ผมจำเป็นต้องมีเสื้อคลุมที่มีน้ำหนักเบาสำหรับโครงการ Android ของฉันและออกมาพร้อมกับห้องสมุดซึ่งคุณสามารถใช้เป็นอย่างดี: DavidWebb

ตัวอย่างด้านบนสามารถเขียนได้ดังนี้:

Webb webb = Webb.create();
webb.post("http://example.com/index.php")
        .param("param1", "a")
        .param("param2", "b")
        .param("param3", "c")
        .ensureSuccess()
        .asVoid();

คุณสามารถค้นหารายชื่อห้องสมุดทางเลือกได้จากลิงค์ที่ให้ไว้


1
ฉันจะไม่ลงคะแนนเพราะโพสต์ของคุณมีคำตอบน้อยและมีโฆษณามากกว่า ... แต่ฉันเล่นกับห้องสมุดของคุณแล้วก็ชอบ รวบรัดมาก น้ำตาลทรายจำนวนมาก ถ้าคุณใช้ Java เป็นภาษาสคริปต์แบบที่ฉันทำมันเป็นห้องสมุดที่ยอดเยี่ยมสำหรับการเพิ่มปฏิสัมพันธ์ HTTP อย่างรวดเร็วและมีประสิทธิภาพ Zeroplate มีค่าในบางครั้งและอาจเป็นประโยชน์ต่อ OP
คณบดี

3
ฉันจะโหวต ฉันใช้ DavidWebb อย่างประสบความสำเร็จในหนึ่งในแอพของฉันและจะทำอีกสองครั้งฉันจะพัฒนาในไม่ช้า ใช้งานง่ายมาก
William T. Mallard

ขอขอบคุณการใช้ DefaultHttpClient กับ https บน Android ล้มเหลวด้วย SSLPeerUnverifiedException: ไม่มีใบรับรองเพียร์ (แม้ในใบรับรอง https ที่ลงชื่ออย่างถูกต้อง) การใช้ URL นั้นยุ่งยาก (พารามิเตอร์การเข้ารหัสและการตรวจสอบผลลัพธ์) การใช้ DavidWebb ช่วยฉันได้ไหม
Martin Vysny

ไม่รองรับ AsyncTask? ดังนั้นการล็อคเธรด UI โดยค่าเริ่มต้น ... ไม่ดี
slinden77

มันเป็นห้องสมุดขั้นพื้นฐานมาก โปรแกรมเมอร์ต้องเรียกมันจาก background-thread ใน AsyncTask ใน IntentService ใน Synchronization Handler และอื่น ๆ และไม่ได้ขึ้นอยู่กับ Android -> สามารถใช้ใน Java SE และ EE ได้เช่นกัน
hgoebl

12

ฉันได้อ่านคำตอบข้างต้นและได้สร้างคลาสยูทิลิตี้เพื่อลดความซับซ้อนของคำขอ HTTP ฉันหวังว่ามันจะช่วยคุณ

วิธีการโทร

  // send params with Hash Map
    HashMap<String, String> params = new HashMap<String, String>();
    params.put("email","me@example.com");
    params.put("password","12345");

    //server url
    String url = "http://www.example.com";

    // static class "HttpUtility" with static method "newRequest(url,method,callback)"
    HttpUtility.newRequest(url,HttpUtility.METHOD_POST,params, new HttpUtility.Callback() {
        @Override
        public void OnSuccess(String response) {
        // on success
           System.out.println("Server OnSuccess response="+response);
        }
        @Override
        public void OnError(int status_code, String message) {
        // on error
              System.out.println("Server OnError status_code="+status_code+" message="+message);
        }
    });

ยูทิลิตี้คลาส

import java.io.*;
import java.net.*;
import java.util.HashMap;
import java.util.Map;
import static java.net.HttpURLConnection.HTTP_OK;

public class HttpUtility {

 public static final int METHOD_GET = 0; // METHOD GET
 public static final int METHOD_POST = 1; // METHOD POST

 // Callback interface
 public interface Callback {
  // abstract methods
  public void OnSuccess(String response);
  public void OnError(int status_code, String message);
 }
 // static method
 public static void newRequest(String web_url, int method, HashMap < String, String > params, Callback callback) {

  // thread for handling async task
  new Thread(new Runnable() {
   @Override
   public void run() {
    try {
     String url = web_url;
     // write GET params,append with url
     if (method == METHOD_GET && params != null) {
      for (Map.Entry < String, String > item: params.entrySet()) {
       String key = URLEncoder.encode(item.getKey(), "UTF-8");
       String value = URLEncoder.encode(item.getValue(), "UTF-8");
       if (!url.contains("?")) {
        url += "?" + key + "=" + value;
       } else {
        url += "&" + key + "=" + value;
       }
      }
     }

     HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
     urlConnection.setUseCaches(false);
     urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // handle url encoded form data
     urlConnection.setRequestProperty("charset", "utf-8");
     if (method == METHOD_GET) {
      urlConnection.setRequestMethod("GET");
     } else if (method == METHOD_POST) {
      urlConnection.setDoOutput(true); // write POST params
      urlConnection.setRequestMethod("POST");
     }

     //write POST data 
     if (method == METHOD_POST && params != null) {
      StringBuilder postData = new StringBuilder();
      for (Map.Entry < String, String > item: params.entrySet()) {
       if (postData.length() != 0) postData.append('&');
       postData.append(URLEncoder.encode(item.getKey(), "UTF-8"));
       postData.append('=');
       postData.append(URLEncoder.encode(String.valueOf(item.getValue()), "UTF-8"));
      }
      byte[] postDataBytes = postData.toString().getBytes("UTF-8");
      urlConnection.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
      urlConnection.getOutputStream().write(postDataBytes);

     }
     // server response code
     int responseCode = urlConnection.getResponseCode();
     if (responseCode == HTTP_OK && callback != null) {
      BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
      StringBuilder response = new StringBuilder();
      String line;
      while ((line = reader.readLine()) != null) {
       response.append(line);
      }
      // callback success
      callback.OnSuccess(response.toString());
      reader.close(); // close BufferReader
     } else if (callback != null) {
      // callback error
      callback.OnError(responseCode, urlConnection.getResponseMessage());
     }

     urlConnection.disconnect(); // disconnect connection
    } catch (IOException e) {
     e.printStackTrace();
     if (callback != null) {
      // callback error
      callback.OnError(500, e.getLocalizedMessage());
     }
    }
   }
  }).start(); // start thread
 }
}

10

ฉันเห็นคำตอบอื่น ๆ ที่ให้ทางเลือกโดยส่วนตัวฉันคิดว่าโดยสังหรณ์ใจคุณกำลังทำสิ่งที่ถูกต้อง;) ขออภัยที่ devoxx ซึ่งมีผู้พูดหลายคนกำลังคุยโวเกี่ยวกับเรื่องแบบนี้

นั่นเป็นเหตุผลที่ฉันใช้ไลบรารีHTTPClient / HttpCoreของ Apache เป็นการส่วนตัวเพื่อทำงานประเภทนี้ฉันพบว่า API ของพวกเขานั้นใช้งานง่ายกว่าการสนับสนุน HTTP ของ Java แน่นอน YMMV!


10
import java.net.*;

public class Demo{

  public static void main(){

       String data = "data=Hello+World!";
       URL url = new URL("http://localhost:8084/WebListenerServer/webListener");
       HttpURLConnection con = (HttpURLConnection) url.openConnection();
       con.setRequestMethod("POST");
       con.setDoOutput(true);
       con.getOutputStream().write(data.getBytes("UTF-8"));
       con.getInputStream();

    }

}

5
WTH import java.net.*;!
Yousha Aleayoub

4

ฉันมีปัญหาเดียวกัน ฉันต้องการส่งข้อมูลทาง POST ฉันใช้รหัสต่อไปนี้:

    URL url = new URL("http://example.com/getval.php");
    Map<String,Object> params = new LinkedHashMap<>();
    params.put("param1", param1);
    params.put("param2", param2);

    StringBuilder postData = new StringBuilder();
    for (Map.Entry<String,Object> param : params.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"));
    }
    String urlParameters = postData.toString();
    URLConnection conn = url.openConnection();

    conn.setDoOutput(true);

    OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());

    writer.write(urlParameters);
    writer.flush();

    String result = "";
    String line;
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

    while ((line = reader.readLine()) != null) {
        result += line;
    }
    writer.close();
    reader.close()
    System.out.println(result);

ฉันใช้ Jsoup เพื่อแยกวิเคราะห์:

    Document doc = Jsoup.parseBodyFragment(value);
    Iterator<Element> opts = doc.select("option").iterator();
    for (;opts.hasNext();) {
        Element item = opts.next();
        if (item.hasAttr("value")) {
            System.out.println(item.attr("value"));
        }
    }

4

ตั้งค่าวิธีการ GET และ POST ดังนี้ ... สองประเภทสำหรับ api การโทร 1) รับ () และ 2) โพสต์ () get () วิธีการรับค่าจาก api json array เพื่อรับ value & post () วิธีการใช้ในการโพสต์ข้อมูลของเราใน url และได้รับการตอบสนอง

 public class HttpClientForExample {

    private final String USER_AGENT = "Mozilla/5.0";

    public static void main(String[] args) throws Exception {

        HttpClientExample http = new HttpClientExample();

        System.out.println("Testing 1 - Send Http GET request");
        http.sendGet();

        System.out.println("\nTesting 2 - Send Http POST request");
        http.sendPost();

    }

    // HTTP GET request
    private void sendGet() throws Exception {

        String url = "http://www.google.com/search?q=developer";

        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(url);

        // add request header
        request.addHeader("User-Agent", USER_AGENT);

        HttpResponse response = client.execute(request);

        System.out.println("\nSending 'GET' request to URL : " + url);
        System.out.println("Response Code : " + 
                       response.getStatusLine().getStatusCode());

        BufferedReader rd = new BufferedReader(
                       new InputStreamReader(response.getEntity().getContent()));

        StringBuffer result = new StringBuffer();
        String line = "";
        while ((line = rd.readLine()) != null) {
            result.append(line);
        }

        System.out.println(result.toString());

    }

    // HTTP POST request
    private void sendPost() throws Exception {

        String url = "https://selfsolve.apple.com/wcResults.do";

        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(url);

        // add header
        post.setHeader("User-Agent", USER_AGENT);

        List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
        urlParameters.add(new BasicNameValuePair("sn", "C02G8416DRJM"));
        urlParameters.add(new BasicNameValuePair("cn", ""));
        urlParameters.add(new BasicNameValuePair("locale", ""));
        urlParameters.add(new BasicNameValuePair("caller", ""));
        urlParameters.add(new BasicNameValuePair("num", "12345"));

        post.setEntity(new UrlEncodedFormEntity(urlParameters));

        HttpResponse response = client.execute(post);
        System.out.println("\nSending 'POST' request to URL : " + url);
        System.out.println("Post parameters : " + post.getEntity());
        System.out.println("Response Code : " + 
                                    response.getStatusLine().getStatusCode());

        BufferedReader rd = new BufferedReader(
                        new InputStreamReader(response.getEntity().getContent()));

        StringBuffer result = new StringBuffer();
        String line = "";
        while ((line = rd.readLine()) != null) {
            result.append(line);
        }

        System.out.println(result.toString());

    }

}

3

ลองรูปแบบนี้:

public static PricesResponse getResponse(EventRequestRaw request) {

    // String urlParameters  = "param1=a&param2=b&param3=c";
    String urlParameters = Piping.serialize(request);

    HttpURLConnection conn = RestClient.getPOSTConnection(endPoint, urlParameters);

    PricesResponse response = null;

    try {
        // POST
        OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
        writer.write(urlParameters);
        writer.flush();

        // RESPONSE
        BufferedReader reader = new BufferedReader(new InputStreamReader((conn.getInputStream()), StandardCharsets.UTF_8));
        String json = Buffering.getString(reader);
        response = (PricesResponse) Piping.deserialize(json, PricesResponse.class);

        writer.close();
        reader.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

    conn.disconnect();

    System.out.println("PricesClient: " + response.toString());

    return response;
}

public static HttpURLConnection getPOSTConnection(String endPoint, String urlParameters) {

    return RestClient.getConnection(endPoint, "POST", urlParameters);

}


public static HttpURLConnection getConnection(String endPoint, String method, String urlParameters) {

    System.out.println("ENDPOINT " + endPoint + " METHOD " + method);
    HttpURLConnection conn = null;

    try {
        URL url = new URL(endPoint);
        conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod(method);
        conn.setDoOutput(true);
        conn.setRequestProperty("Content-Type", "text/plain");

    } catch (IOException e) {
        e.printStackTrace();
    }

    return conn;
}

3

คำตอบนี้ครอบคลุมกรณีเฉพาะของการโทร POST โดยใช้ Java แบบกำหนดเอง POJO

การใช้ maven dependency สำหรับGsonเพื่อทำให้ Java Object ของเราเป็นอนุกรมกับ JSON

ติดตั้ง Gson โดยใช้การพึ่งพาด้านล่าง

<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.8.5</version>
  <scope>compile</scope>
</dependency>

สำหรับผู้ที่ใช้ gradle สามารถใช้ด้านล่าง

dependencies {
implementation 'com.google.code.gson:gson:2.8.5'
}

การนำเข้าอื่น ๆ ที่ใช้:

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.*;
import org.apache.http.impl.client.CloseableHttpClient;
import com.google.gson.Gson;

ตอนนี้เราสามารถไปข้างหน้าและใช้ HttpPost ที่จัดทำโดยApache

private CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost("https://example.com");

Product product = new Product(); //custom java object to be posted as Request Body
    Gson gson = new Gson();
    String client = gson.toJson(product);

    httppost.setEntity(new StringEntity(client, ContentType.APPLICATION_JSON));
    httppost.setHeader("RANDOM-HEADER", "headervalue");
    //Execute and get the response.
    HttpResponse response = null;
    try {
        response = httpclient.execute(httppost);
    } catch (IOException e) {
        throw new InternalServerErrorException("Post fails");
    }
    Response.Status responseStatus = Response.Status.fromStatusCode(response.getStatusLine().getStatusCode());
    return Response.status(responseStatus).build();

รหัสด้านบนจะกลับมาพร้อมรหัสตอบกลับที่ได้รับจากการโทร POST


2

ที่นี่ฉันส่ง jsonobject เป็นพารามิเตอร์ // jsonobject = {"ชื่อ": "lucifer", "pass": "abc"} // serverUrl = " http://192.168.100.12/testing " //host=192.168.100.12

  public static String getJson(String serverUrl,String host,String jsonobject){

    StringBuilder sb = new StringBuilder();

    String http = serverUrl;

    HttpURLConnection urlConnection = null;
    try {
        URL url = new URL(http);
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setDoOutput(true);
        urlConnection.setRequestMethod("POST");
        urlConnection.setUseCaches(false);
        urlConnection.setConnectTimeout(50000);
        urlConnection.setReadTimeout(50000);
        urlConnection.setRequestProperty("Content-Type", "application/json");
        urlConnection.setRequestProperty("Host", host);
        urlConnection.connect();
        //You Can also Create JSONObject here 
        OutputStreamWriter out = new OutputStreamWriter(urlConnection.getOutputStream());
        out.write(jsonobject);// here i sent the parameter
        out.close();
        int HttpResult = urlConnection.getResponseCode();
        if (HttpResult == HttpURLConnection.HTTP_OK) {
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    urlConnection.getInputStream(), "utf-8"));
            String line = null;
            while ((line = br.readLine()) != null) {
                sb.append(line + "\n");
            }
            br.close();
            Log.e("new Test", "" + sb.toString());
            return sb.toString();
        } else {
            Log.e(" ", "" + urlConnection.getResponseMessage());
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    } finally {
        if (urlConnection != null)
            urlConnection.disconnect();
    }
    return null;
}

2

ฉันขอแนะนำ http- คำขอที่สร้างขึ้นบน apache http api อีกครั้ง

สำหรับกรณีของคุณคุณสามารถดูตัวอย่าง:

private static final HttpRequest<String.class> HTTP_REQUEST = 
      HttpRequestBuilder.createPost("http://example.com/index.php", String.class)
           .responseDeserializer(ResponseDeserializer.ignorableDeserializer())
           .build();

public void sendRequest(String request){
     String parameters = request.split("\\?")[1];
     ResponseHandler<String> responseHandler = 
            HTTP_REQUEST.executeWithQuery(parameters);

   System.out.println(responseHandler.getStatusCode());
   System.out.println(responseHandler.get()); //prints response body
}

หากคุณไม่สนใจเนื้อหาการตอบสนอง

private static final HttpRequest<?> HTTP_REQUEST = 
     HttpRequestBuilder.createPost("http://example.com/index.php").build();

public void sendRequest(String request){
     ResponseHandler<String> responseHandler = 
           HTTP_REQUEST.executeWithQuery(parameters);
}

สำหรับทั่วไปส่งคำขอโพสต์กับhttp คำขอ : อ่านเอกสารและดูคำตอบของฉันHTTP POST คำขอกับ JSON String ใน JAVA , ส่ง HTTP POST ขอใน Java , HTTP POST ใช้ JSON ในชวา


1

สวัสดีกรุณาใช้คลาสนี้เพื่อปรับปรุงวิธีการโพสต์ของคุณ

public static JSONObject doPostRequest(HashMap<String, String> data, String url) {

    try {
        RequestBody requestBody;
        MultipartBuilder mBuilder = new MultipartBuilder().type(MultipartBuilder.FORM);

        if (data != null) {


            for (String key : data.keySet()) {
                String value = data.get(key);
                Utility.printLog("Key Values", key + "-----------------" + value);

                mBuilder.addFormDataPart(key, value);

            }
        } else {
            mBuilder.addFormDataPart("temp", "temp");
        }
        requestBody = mBuilder.build();


        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();

        OkHttpClient client = new OkHttpClient();
        Response response = client.newCall(request).execute();
        String responseBody = response.body().string();
        Utility.printLog("URL", url);
        Utility.printLog("Response", responseBody);
        return new JSONObject(responseBody);

    } catch (UnknownHostException | UnsupportedEncodingException e) {

        JSONObject jsonObject=new JSONObject();

        try {
            jsonObject.put("status","false");
            jsonObject.put("message",e.getLocalizedMessage());
        } catch (JSONException e1) {
            e1.printStackTrace();
        }
        Log.e(TAG, "Error: " + e.getLocalizedMessage());
    } catch (Exception e) {
        e.printStackTrace();
        JSONObject jsonObject=new JSONObject();

        try {
            jsonObject.put("status","false");
            jsonObject.put("message",e.getLocalizedMessage());
        } catch (JSONException e1) {
            e1.printStackTrace();
        }
        Log.e(TAG, "Other Error: " + e.getLocalizedMessage());
    }
    return null;
}

0

ฉันใช้คำตอบของ Boann และใช้มันเพื่อสร้างตัวสร้างสตริงข้อความค้นหาที่ยืดหยุ่นมากขึ้นซึ่งรองรับรายการและอาร์เรย์เช่นเดียวกับวิธี http_build_query ของ php:

public static byte[] httpBuildQueryString(Map<String, Object> postsData) throws UnsupportedEncodingException {
    StringBuilder postData = new StringBuilder();
    for (Map.Entry<String,Object> param : postsData.entrySet()) {
        if (postData.length() != 0) postData.append('&');

        Object value = param.getValue();
        String key = param.getKey();

        if(value instanceof Object[] || value instanceof List<?>)
        {
            int size = value instanceof Object[] ? ((Object[])value).length : ((List<?>)value).size();
            for(int i = 0; i < size; i++)
            {
                Object val = value instanceof Object[] ? ((Object[])value)[i] : ((List<?>)value).get(i);
                if(i>0) postData.append('&');
                postData.append(URLEncoder.encode(key + "[" + i + "]", "UTF-8"));
                postData.append('=');            
                postData.append(URLEncoder.encode(String.valueOf(val), "UTF-8"));
            }
        }
        else
        {
            postData.append(URLEncoder.encode(key, "UTF-8"));
            postData.append('=');            
            postData.append(URLEncoder.encode(String.valueOf(value), "UTF-8"));
        }
    }
    return postData.toString().getBytes("UTF-8");
}

0

สำหรับผู้ที่มีปัญหาในการรับคำขอบนหน้า php โดยใช้ $ _POST เพราะคุณคาดหวังว่าคู่คีย์ - ค่า:

ในขณะที่คำตอบทั้งหมดที่เป็นประโยชน์มากฉันขาดความเข้าใจพื้นฐานเกี่ยวกับสตริงที่จะโพสต์จริง ๆ เนื่องจากใน apache เก่า HttpClient ฉันใช้

new UrlEncodedFormEntity(nameValuePairs); (Java)

จากนั้นสามารถใช้ $ _POST ใน php เพื่อรับคู่คีย์ - ค่า

เพื่อความเข้าใจของฉันตอนนี้มีสตริงที่สร้างด้วยตนเองก่อนโพสต์ ดังนั้นสตริงต้องมีลักษณะ

val data = "key1=val1&key2=val2"

แต่แทนที่จะเพิ่มลงใน url แต่จะโพสต์ (ในส่วนหัว)

ทางเลือกอื่นคือใช้ json-string แทน:

val data = "{\"key1\":\"val1\",\"key2\":\"val2\"}" // {"key1":"val1","key2":"val2"}

และดึงมันใน PHP โดยไม่ต้อง $ _POST:

$json_params = file_get_contents('php://input');
// echo_p("Data: $json_params");
$data = json_decode($json_params, true);

ที่นี่คุณจะพบรหัสตัวอย่างใน Kotlin:

class TaskDownloadTest : AsyncTask<Void, Void, Void>() {
    override fun doInBackground(vararg params: Void): Void? {
        var urlConnection: HttpURLConnection? = null

        try {

            val postData = JsonObject()
            postData.addProperty("key1", "val1")
            postData.addProperty("key2", "val2")

            // reformat json to key1=value1&key2=value2
            // keeping json because I may change the php part to interpret json requests, could be a HashMap instead
            val keys = postData.keySet()
            var request = ""
            keys.forEach { key ->
                // Log.i("data", key)
                request += "$key=${postData.get(key)}&"
            }
            request = request.replace("\"", "").removeSuffix("&")
            val requestLength = request.toByteArray().size
            // Warning in Android 9 you need to add a line in the application part of the manifest: android:usesCleartextTraffic="true"
            // /programming/45940861/android-8-cleartext-http-traffic-not-permitted
            val url = URL("http://10.0.2.2/getdata.php")
            urlConnection = url.openConnection() as HttpURLConnection
            // urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded") // apparently default
            // Not sure what these are for, I do not use them
            // urlConnection.setRequestProperty("Content-Type", "application/json")
            // urlConnection.setRequestProperty("Key","Value")
            urlConnection.readTimeout = 5000
            urlConnection.connectTimeout = 5000
            urlConnection.requestMethod = "POST"
            urlConnection.doOutput = true
            // urlConnection.doInput = true
            urlConnection.useCaches = false
            urlConnection.setFixedLengthStreamingMode(requestLength)
            // urlConnection.setChunkedStreamingMode(0) // if you do not want to handle request length which is fine for small requests

            val out = urlConnection.outputStream
            val writer = BufferedWriter(
                OutputStreamWriter(
                    out, "UTF-8"
                )
            )
            writer.write(request)
            // writer.write("{\"key1\":\"val1\",\"key2\":\"val2\"}") // {"key1":"val1","key2":"val2"} JsonFormat or just postData.toString() for $json_params=file_get_contents('php://input'); json_decode($json_params, true); in php
            // writer.write("key1=val1&key2=val2") // key=value format for $_POST in php
            writer.flush()
            writer.close()
            out.close()

            val code = urlConnection.responseCode
            if (code != 200) {
                throw IOException("Invalid response from server: $code")
            }

            val rd = BufferedReader(
                InputStreamReader(
                    urlConnection.inputStream
                )
            )
            var line = rd.readLine()
            while (line != null) {
                Log.i("data", line)
                line = rd.readLine()
            }
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            urlConnection?.disconnect()
        }

        return null
    }
}

-3

ปรากฏว่าคุณต้องเรียกconnection.getOutputStream()"อย่างน้อยหนึ่งครั้ง" (รวมถึงsetDoOutput(true)) ด้วยเพื่อให้ถือว่าเป็น POST

ดังนั้นรหัสที่ต้องการขั้นต่ำคือ:

    URL url = new URL(urlString);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    //connection.setRequestMethod("POST"); this doesn't seem to do anything at all..so not useful
    connection.setDoOutput(true); // set it to POST...not enough by itself however, also need the getOutputStream call...
    connection.connect();
    connection.getOutputStream().close(); 

คุณสามารถใช้พารามิเตอร์สไตล์ "GET" ใน urlString ได้อย่างน่าประหลาดใจ แม้ว่านั่นอาจทำให้สับสน

คุณสามารถใช้NameValuePairได้เช่นกัน


พารามิเตอร์ POST อยู่ที่ไหน ... ?
Yousha Aleayoub

ทำไมผู้คนถึงลงคะแนนนี้ มันเป็นโน้ตสำหรับวิธีการทำ POST เลยถึงแม้ว่าจะไม่มีพารามิเตอร์ ... (เช่น no payload0 ...
rogerdpack
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.