Java - mengirim parameter HTTP melalui metode POST dengan mudah

319

Saya berhasil menggunakan kode ini untuk mengirim HTTPpermintaan dengan beberapa parameter melalui GETmetode

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

Sekarang saya mungkin perlu mengirim parameter (yaitu param1, param2, param3) melalui POSTmetode karena sangat panjang. Saya berpikir untuk menambahkan parameter tambahan untuk metode itu (yaitu String httpMethod).

Bagaimana saya bisa mengubah kode di atas sesedikit mungkin agar dapat mengirim parameter baik melalui GETatau POST?

Saya berharap perubahan itu

connection.setRequestMethod("GET");

untuk

connection.setRequestMethod("POST");

akan melakukan trik, tetapi parameternya masih dikirim melalui metode GET.

Apakah HttpURLConnectionada metode yang akan membantu? Apakah ada konstruksi Java yang membantu?

Bantuan apa pun akan sangat dihargai.

dan
sumber
Parameter posting dikirim di dalam bagian header http tidak di URL. (url posting Anda akan http://example.com/index.php)
dacwe
2
tidak ada metode setRequestMethod di Java 1.6 yang ditentukan: docs.oracle.com/javase/6/docs/api/java/net/URLConnection.html
ante.sabo
2
Serahkan ke Http (s) UrlConnection ....
Peter Kriens
memperluas pertanyaan! Adakah yang tahu cara mengirim lampiran sebagai parameter posting ...
therealprashant
1
Mengapa cuplikan kode pertama dimulai dengan kata kunci "fungsi"?
Llew Vallis

Jawaban:

470

Dalam permintaan GET, parameter dikirim sebagai bagian dari URL.

Dalam permintaan POST, parameter dikirim sebagai badan permintaan, setelah header.

Untuk melakukan POST dengan HttpURLConnection, Anda perlu menulis parameter ke koneksi setelah Anda membuka koneksi.

Kode ini harus membantu Anda memulai:

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 );
}
Alan Geleynse
sumber
40
@Lan Geleynse: 'url.openconnection ()' tidak membuka koneksi. Jika Anda tidak menentukan pernyataan connect (), koneksi dibuka ketika Anda menulis ke badan permintaan http / didengar dan mengirimkannya. Saya sudah mencoba ini dengan sertifikat. Jabat tangan ssl terjadi hanya setelah Anda menelepon terhubung atau ketika Anda mengirim data ke server.
Ashwin
14
getBytes () menggunakan karakter standar lingkungan, BUKAN charset UTF-8 = utf-8 harus mengikuti tipe konten: application / x-www-form-urlencoded; charset = utf-8 Anda melakukan konversi byte dua kali dalam contoh. Harus dilakukan: byte [] data = urlParameters.getData ("UTF-8"); connection.getOutputStream (). write (data); tidak ada gunanya untuk menutup DAN menyiram DAN lepaskan
Peter Kriens
8
@PeterKriens Terima kasih untuk penambahan Anda - Saya yakin Anda maksudnya byte[] data = urlParameters.getBytes(Charset.forName("UTF-8")):)
gerrytan
7
@AlanGeleynse Jangan lewatkan wr.flush (); dan wr.close (); pada akhirnya?
confile
9
Kenapa ini memiliki begitu banyak upvotes, jika tidak berhasil? Anda perlu menelepon salah satu conn.getResponseCode()atau conn.getInputStream()sebaliknya itu tidak akan mengirim data apa pun.
Imaskar
229

Berikut adalah contoh sederhana yang mengirimkan formulir lalu membuang halaman hasil System.out. Ubah URL dan params POST yang sesuai, tentu saja:

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", "[email protected]");
        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);
    }
}

Jika Anda ingin hasilnya sebagai Stringganti dicetak langsung lakukan:

        StringBuilder sb = new StringBuilder();
        for (int c; (c = in.read()) >= 0;)
            sb.append((char)c);
        String response = sb.toString();
Boann
sumber
Ini adalah jawaban terbaik karena mencakup pengodean parameter dan penggunaan Peta.
Airy
4
Sayangnya kode ini mengasumsikan bahwa pengkodean konten adalah UTF-8, yang tidak selalu terjadi. Untuk mengambil charset, seseorang harus mendapatkan header Content-Typedan mengurai charset itu. Ketika itu header tidak tersedia, gunakan salah satu http standar: ISO-8859-1.
engineercoding
@Aprel IFTFY ... menggunakan ekspresi dengan efek samping dalam evaluasi memang jelek.
1
@engineercoding Sayangnya untuk HTML bahkan lebih sulit untuk melakukannya dengan benar, karena mungkin juga ada BOM Unicode, <meta charset="...">atau <meta http-equiv="Content-Type" content="...">header di dalam dokumen yang perlu diuraikan.
Boann
1
@Nepster Jangan lakukan itu. response += line;sangat lambat, dan itu memakan jeda baris. Saya telah menambahkan ke jawaban contoh untuk mendapatkan respons string.
Boann
63

Saya tidak bisa mendapatkan contoh Alan untuk benar-benar melakukan posting, jadi saya berakhir dengan ini:

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();         
Craigo
sumber
1
Sayangnya, kode ini tidak membaca responsnya. Bunyinya berupa html kosong.
Kovács Imre
apa yang saya harus tambahkan ke contoh Alan adalah membuka aliran respons. sebelum saya melakukannya, tidak ada byte yang benar-benar dikirim.
beefeather
1
Menghapus panggilan writer.close () melakukannya untuk saya.
Maxime T
23

Saya merasa HttpURLConnectionsangat tidak praktis untuk digunakan. Dan Anda harus menulis banyak boilerplate, kode rawan kesalahan. Saya membutuhkan pembungkus ringan untuk proyek Android saya dan keluar dengan perpustakaan yang dapat Anda gunakan juga: DavidWebb .

Contoh di atas dapat ditulis seperti ini:

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

Anda dapat menemukan daftar pustaka alternatif pada tautan yang disediakan.

hgoebl
sumber
1
Saya tidak akan memilih karena posting Anda kurang dari jawaban dan lebih dari sebuah iklan ... tapi, saya bermain dengan perpustakaan Anda dan saya menyukainya. Sangat singkat; banyak gula sintaksis; jika Anda menggunakan Java sebagai sedikit bahasa scripting seperti yang saya lakukan maka itu adalah perpustakaan yang bagus untuk menambahkan interaksi http dengan sangat cepat dan efisien. Nol boilerplate berharga pada waktu dan mungkin bermanfaat bagi OP.
Dekan
3
Saya akan menang. Saya telah berhasil menggunakan DavidWebb di salah satu aplikasi saya, dan akan melakukannya untuk dua lagi saya akan segera mengembangkan. Sangat mudah digunakan.
William T. Mallard
Terima kasih, menggunakan DefaultHttpClient dengan https di Android gagal dengan SSLPeerUnverifiedException: Tidak ada sertifikat rekan (bahkan pada sertifikat https yang ditandatangani dengan benar), menggunakan URL itu rumit (parameter pengkodean, memeriksa hasil). Menggunakan DavidWebb bekerja untuk saya, terima kasih.
Martin Vysny
tidak ada dukungan AsyncTask? Jadi mengunci utas UI secara default ... itu buruk
slinden77
Ini perpustakaan yang sangat mendasar. Pemrogram harus memanggilnya dari background-thread, di AsyncTask, di IntentService, di Synchronization Handler dan sejenisnya. Dan itu tidak tergantung pada Android -> dapat digunakan di Java SE dan EE juga.
hgoebl
12

saya telah membaca jawaban di atas dan telah membuat kelas utilitas untuk menyederhanakan permintaan HTTP. Saya harap ini akan membantu Anda.

Metode Panggilan

  // send params with Hash Map
    HashMap<String, String> params = new HashMap<String, String>();
    params.put("email","[email protected]");
    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);
        }
    });

Kelas Utilitas

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
 }
}
Pankaj Kant Patel
sumber
10

Saya melihat beberapa jawaban lain telah memberikan alternatif, saya pribadi berpikir bahwa secara intuitif Anda melakukan hal yang benar;). Maaf, di devoxx di mana beberapa pembicara telah mengomel tentang hal semacam ini.

Itu sebabnya saya secara pribadi menggunakan pustaka HTTPClient / HttpCore Apache untuk melakukan pekerjaan semacam ini, saya menemukan API mereka lebih mudah digunakan daripada dukungan HTTP asli Java. YMMV tentu saja!

Martijn Verburg
sumber
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();

    }

}
Manish Mistry
sumber
5
WTH import java.net.*;!
Yousha Aleayoub
4

Saya memiliki masalah yang sama. Saya ingin mengirim data melalui POST. Saya menggunakan kode berikut:

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

Saya menggunakan Jsoup untuk parse:

    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"));
        }
    }
SergeyUr
sumber
4

GET dan metode POST diatur seperti ini ... Dua jenis untuk panggilan api 1) get () dan 2) post (). metode get () untuk mendapatkan nilai dari array api json untuk mendapatkan metode nilai & post () yang digunakan dalam posting data kami di url dan mendapatkan respons.

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

    }

}
Chirag Patel
sumber
3

Coba pola ini:

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;
}
Pablo Rodriguez Bertorello
sumber
3

Jawaban ini mencakup kasus khusus Panggilan POST menggunakan POJO Java Kustom.

Menggunakan maven dependency untuk Gson untuk membuat serialisasi Java Object ke JSON.

Instal Gson menggunakan dependensi di bawah ini.

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

Bagi yang menggunakan gradle dapat menggunakan di bawah ini

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

Impor lain yang digunakan:

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;

Sekarang, kita dapat melanjutkan dan menggunakan HttpPost yang disediakan oleh 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();

Kode di atas akan kembali dengan kode respons yang diterima dari Panggilan POST

kaushalop
sumber
2

di sini saya mengirim jsonobject sebagai parameter // 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;
}
Abhisek
sumber
2

Saya sangat merekomendasikan http-request dibangun di atas apache http api.

Untuk kasus Anda, Anda dapat melihat contoh:

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
}

Jika Anda tidak tertarik dengan badan tanggapan

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

Untuk permintaan pengiriman pos umum dengan permintaan http : Baca dokumentasi dan lihat jawaban saya Permintaan HTTP POST dengan JSON String di JAVA , Mengirim Permintaan HTTP POST Di Jawa , HTTP POST menggunakan JSON di Java

Beno Arakelyan
sumber
1

Halo, tolong gunakan kelas ini untuk meningkatkan metode posting Anda

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;
}
Chirag RAmi
sumber
0

Saya mengambil jawaban Boann dan menggunakannya untuk membuat pembuat string kueri yang lebih fleksibel yang mendukung daftar dan array, seperti metode 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");
}
Curtis
sumber
0

Bagi mereka yang mengalami kesulitan menerima permintaan pada halaman php menggunakan $ _POST karena Anda mengharapkan pasangan nilai kunci:

Sementara semua jawaban yang sangat membantu, saya tidak memiliki beberapa pemahaman dasar tentang string yang sebenarnya untuk dikirim, karena di HttpClient apache lama saya menggunakan

new UrlEncodedFormEntity(nameValuePairs); (Java)

dan kemudian bisa menggunakan $ _POST di php jangan mendapatkan pasangan kunci-nilai.

Untuk pemahaman saya sekarang, seseorang telah membuat string itu secara manual sebelum memposting. Jadi string harus terlihat seperti

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

tetapi sebaliknya hanya menambahkannya ke url itu diposting (di header).

Alternatifnya adalah menggunakan json-string sebagai gantinya:

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

dan tarik dalam php tanpa $ _POST:

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

Di sini Anda menemukan kode sampel di 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
    }
}
Gunnar Bernstein
sumber
-3

Tampaknya Anda juga harus memanggil connection.getOutputStream()"setidaknya sekali" (dan juga setDoOutput(true)) agar dapat memperlakukannya sebagai POST.

Jadi kode minimum yang diperlukan adalah:

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

Anda bahkan dapat menggunakan parameter gaya "GET" di urlString, secara mengejutkan. Meskipun itu mungkin membingungkan banyak hal.

Anda juga dapat menggunakan NameValuePair .

rogerdpack
sumber
Di mana parameter POST ...?
Yousha Aleayoub
Mengapa orang downvoting ini? Ini catatan untuk bagaimana melakukan POST sama sekali, meskipun tanpa parameter ... (yaitu tidak ada payload0 ...
rogerdpack