Java - gửi các tham số HTTP thông qua phương thức POST một cách dễ dàng


319

Tôi đang sử dụng thành công mã này để gửi HTTPyêu cầu với một số tham số thông qua GETphương thức

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

Bây giờ tôi có thể cần gửi các tham số (ví dụ param1, param2, param3) qua POSTphương thức vì chúng rất dài. Tôi đã suy nghĩ để thêm một tham số phụ cho phương thức đó (tức là Chuỗi httpMethod).

Làm cách nào tôi có thể thay đổi mã ở trên ít nhất có thể để có thể gửi tham số thông qua GEThoặc POST?

Tôi đã hy vọng rằng việc thay đổi

connection.setRequestMethod("GET");

đến

connection.setRequestMethod("POST");

sẽ thực hiện thủ thuật, nhưng các tham số vẫn được gửi qua phương thức GET.

HttpURLConnectionphương pháp nào có thể giúp được không? Có bất kỳ cấu trúc Java hữu ích nào không?

Bất kỳ trợ giúp sẽ được rất nhiều đánh giá cao.


Thông số bài viết được gửi bên trong phần tiêu đề http không có trong URL. (url bài đăng của bạn sẽ là http://example.com/index.php)
dacwe

2
không có phương thức setRequestMethod trong Java 1.6 được xác định: docs.oracle.com/javase/6/docs/api/java/net/URLConnection.html
ante.sabo

2
Truyền nó tới UrlConnection ....
Peter Kriens

mở rộng câu hỏi! Liệu có ai có bất kỳ đầu mối làm thế nào để gửi một tập tin đính kèm như bài tham số ...
therealprashant

1
Tại sao đoạn mã đầu tiên bắt đầu bằng từ khóa "hàm"?
Llew Vallis

Câu trả lời:


470

Trong yêu cầu GET, các tham số được gửi dưới dạng một phần của URL.

Trong một yêu cầu POST, các tham số được gửi dưới dạng phần thân của yêu cầu, sau các tiêu đề.

Để thực hiện POST với kết nối httpURLC, bạn cần ghi các tham số vào kết nối sau khi bạn đã mở kết nối.

Mã này sẽ giúp bạn bắt đầu:

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 ()' không mở kết nối. Trong trường hợp bạn không chỉ định câu lệnh kết nối (), kết nối sẽ được mở khi bạn ghi vào phần thân yêu cầu http / nghe và gửi nó. Tôi đã thử điều này với giấy chứng nhận. Bắt tay ssl chỉ diễn ra sau khi bạn gọi kết nối hoặc khi bạn gửi dữ liệu đến máy chủ.
Ashwin

14
getBytes () sử dụng charaset mặc định của môi trường, KHÔNG phải UTF-8 charset = utf-8 phải theo kiểu nội dung: application / x-www-form-urlencoding; charset = utf-8 Bạn thực hiện chuyển đổi byte hai lần trong ví dụ. Nên làm: byte [] data = urlParameter.getData ("UTF-8"); Connection.getOutputStream (). write (dữ liệu); không sử dụng để đóng VÀ xả và ngắt kết nối
Peter Kriens

8
@PeterKriens Cảm ơn bạn đã bổ sung - Tôi tin bạn có nghĩa là byte[] data = urlParameters.getBytes(Charset.forName("UTF-8")):).
gerrytan

7
@AlanGeleynse Đừng bỏ lỡ wr.flush (); và wr.close (); cuối cùng?
confile

9
Tại sao điều này có rất nhiều upvote, nếu nó không hoạt động? Bạn cần gọi một trong hai conn.getResponseCode()hoặc conn.getInputStream()nếu không nó sẽ không gửi bất kỳ dữ liệu.
Imaskar

229

Dưới đây là một ví dụ đơn giản gửi một biểu mẫu sau đó kết xuất trang kết quả System.out. Tất nhiên, thay đổi URL và các thông số POST phù hợp:

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

Nếu bạn muốn kết quả Stringthay vì được in trực tiếp, hãy làm:

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

Đây là câu trả lời tốt nhất vì nó bao gồm mã hóa tham số và sử dụng Bản đồ.
Thoáng mát

4
Thật không may, mã này giả định rằng mã hóa nội dung UTF-8là không phải lúc nào cũng như vậy. Để lấy lại bộ ký tự, người ta phải lấy tiêu đề Content-Typevà phân tích bộ ký tự của nó. Khi tiêu đề đó không có sẵn, hãy sử dụng tiêu chuẩn http : ISO-8859-1.
chế tạo động cơ

@Aprel IFTFY ... sử dụng các biểu thức có tác dụng phụ trong các đánh giá thực sự là xấu xí.

1
@engineercoding Thật không may cho HTML nó thậm chí còn khó khăn hơn so với để làm điều đó hoàn toàn đúng, vì có cũng có thể là một BOM Unicode, hoặc một <meta charset="...">hoặc <meta http-equiv="Content-Type" content="...">tiêu đề bên trong tài liệu mà cần phải được phân tích cú pháp.
Boann

1
@Nepster Đừng làm vậy. response += line;là hiện tượng chậm, và nó ăn đứt dòng. Tôi đã thêm vào câu trả lời một ví dụ về việc nhận được phản hồi chuỗi.
Boann

63

Tôi không thể lấy ví dụ của Alan để thực sự làm bài, vì vậy tôi đã kết thúc việc này:

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
Thật không may, mã này không đọc phản hồi. Nó đọc dạng html trống.
Kovács Imre

những gì tôi đã phải thêm vào ví dụ của alan là mở luồng phản hồi. trước khi tôi thực hiện nó, không có byte nào thực sự được gửi.
coweather

1
Loại bỏ cuộc gọi wr.c.c () đã làm điều đó cho tôi.
Maxime T

23

Tôi thấy HttpURLConnectionthực sự cồng kềnh để sử dụng. Và bạn phải viết rất nhiều bản soạn sẵn, mã dễ bị lỗi. Tôi cần một trình bao bọc nhẹ cho các dự án Android của tôi và đi kèm với một thư viện mà bạn có thể sử dụng: DavidWebb .

Ví dụ trên có thể được viết như thế này:

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

Bạn có thể tìm thấy một danh sách các thư viện thay thế trên liên kết được cung cấp.


1
Tôi sẽ không upvote vì bài viết của bạn ít câu trả lời và nhiều quảng cáo hơn ... nhưng, tôi đã chơi với thư viện của bạn và tôi thích nó. Rất cô đọng; nhiều đường tổng hợp; nếu bạn sử dụng Java như một chút ngôn ngữ kịch bản như tôi thì đó là một thư viện tuyệt vời để thêm một số tương tác http rất nhanh chóng và hiệu quả. Không nồi hơi đôi khi có giá trị và nó có thể hữu ích cho OP.
Trưởng khoa

3
Tôi sẽ nâng cao. Tôi đã sử dụng DavidWebb trong một trong những ứng dụng của mình và sẽ làm như vậy cho hai lần nữa tôi sẽ sớm phát triển. Rất dễ sử dụng.
William T. Mallard

Cảm ơn bạn, sử dụng DefaultHttpClient với https trên Android không thành công với SSLPeerUnverifiedException: Không có chứng chỉ ngang hàng (ngay cả trên chứng chỉ https được ký chính xác), sử dụng URL rất cồng kềnh (tham số mã hóa, kiểm tra kết quả). Sử dụng DavidWebb làm việc cho tôi, cảm ơn.
Martin Vysny

không hỗ trợ AsyncTask? Vì vậy, khóa luồng UI theo mặc định ... thật tệ
slinden77

Đó là một thư viện rất cơ bản. Lập trình viên phải gọi nó từ luồng nền, trong AsyncTask, trong IntentService, trong Trình xử lý đồng bộ hóa và tương tự. Và nó không phụ thuộc vào Android -> cũng có thể được sử dụng trong Java SE và EE.
hgoebl

12

tôi đã đọc các câu trả lời ở trên và đã tạo ra một lớp tiện ích để đơn giản hóa yêu cầu HTTP. Tôi hy vọng nó sẽ giúp bạn.

Phương thức gọi

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

Lớp tiện ích

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

Tôi thấy một số câu trả lời khác đã đưa ra giải pháp thay thế, cá nhân tôi nghĩ rằng bằng trực giác bạn đang làm điều đúng đắn;). Xin lỗi, tại devoxx, nơi một số diễn giả đã phát cuồng về loại điều này.

Đó là lý do tại sao cá nhân tôi sử dụng các thư viện HTTPClient / HttpCore của Apache để thực hiện loại công việc này, tôi thấy API của họ dễ sử dụng hơn so với hỗ trợ HTTP gốc của Java. YMMV tất nhiên!


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

Tôi gặp vấn đề tương tự. Tôi muốn gửi dữ liệu qua POST. Tôi đã sử dụng mã sau đây:

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

Tôi đã sử dụng Jsoup cho phân tích cú pháp:

    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

Phương thức GET và POST được đặt như thế này ... Hai loại để gọi api 1) get () và 2) post (). Phương thức get () để nhận giá trị từ mảng api json để sử dụng phương thức value & post () trong bài đăng dữ liệu của chúng tôi trong url và nhận phản hồi.

 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

Hãy thử mẫu này:

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

Câu trả lời này bao gồm trường hợp cụ thể của Cuộc gọi POST bằng cách sử dụng POJO Java tùy chỉnh.

Sử dụng phụ thuộc maven cho Gson để tuần tự hóa Đối tượng Java của chúng tôi thành JSON.

Cài đặt Gson bằng cách sử dụng phụ thuộc bên dưới.

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

Đối với những người sử dụng gradle có thể sử dụng dưới đây

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

Nhập khẩu khác được sử dụng:

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;

Bây giờ, chúng ta có thể tiếp tục và sử dụng HttpPost do Apache cung cấp

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

Đoạn mã trên sẽ trở lại với mã phản hồi nhận được từ Cuộc gọi POST


2

ở đây tôi đã gửi jsonobject dưới dạng tham số // jsonobject = {"name": "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

Tôi rất muốn giới thiệu http-request được xây dựng trên apache http api.

Đối với trường hợp của bạn, bạn có thể xem ví dụ:

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
}

Nếu bạn không quan tâm đến cơ thể phản ứng

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

Đối với yêu cầu gửi bài chung với yêu cầu http : Đọc tài liệu và xem câu trả lời của tôi Yêu cầu POST HTTP với Chuỗi JSON trong JAVA , Gửi yêu cầu POST HTTP trong Java , HTTP POST bằng JSON trong Java


1

Xin chào, hãy sử dụng lớp này để cải thiện phương pháp bài viết của bạn

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

Tôi đã lấy câu trả lời của Boann và sử dụng nó để tạo một trình xây dựng chuỗi truy vấn linh hoạt hơn, hỗ trợ các danh sách và mảng, giống như phương thức http_build_query của 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

Đối với những người gặp khó khăn khi nhận yêu cầu trên trang php bằng $ _POST vì bạn mong đợi các cặp khóa-giá trị:

Trong khi tất cả các câu trả lời rất hữu ích, tôi thiếu một số hiểu biết cơ bản về chuỗi nào thực sự được đăng, vì trong apache cũ, httpClient tôi đã sử dụng

new UrlEncodedFormEntity(nameValuePairs); (Java)

và sau đó có thể sử dụng $ _POST trong php để lấy các cặp khóa-giá trị.

Theo hiểu biết của tôi bây giờ người ta đã xây dựng chuỗi đó bằng tay trước khi đăng. Vì vậy, chuỗi cần phải trông giống như

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

nhưng thay vào đó chỉ cần thêm nó vào url nó được đăng (trong tiêu đề).

Thay thế sẽ là sử dụng chuỗi json thay thế:

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

và kéo nó bằng php mà không có $ _POST:

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

Ở đây bạn tìm thấy một mã mẫu trong 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

Xuất hiện rằng bạn cũng phải gọi connection.getOutputStream()"ít nhất một lần" (cũng như setDoOutput(true)) cho nó để coi nó như là một POST.

Vì vậy, mã yêu cầu tối thiểu là:

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

Bạn thậm chí có thể sử dụng các tham số kiểu "GET" trong urlString, thật đáng ngạc nhiên. Mặc dù điều đó có thể gây nhầm lẫn mọi thứ.

Bạn cũng có thể sử dụng NameValuePair rõ ràng.


Tham số POST ở đâu ...?
Yousha Aleayoub

Tại sao mọi người lại hạ thấp điều này? Đó là một lưu ý về cách thực hiện POST, mặc dù không có tham số ... (nghĩa là không có payload0 ...
rogerdpack
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.