Java - HTTP parametrelerini POST yöntemi ile kolayca gönderme


319

Başarıyla yöntemle HTTPbazı parametrelerle istek göndermek için bu kodu kullanıyorum 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();
}

Şimdi parametreleri (yani param1, param2, param3) POSTyöntemle göndermem gerekebilir çünkü çok uzunlar . Bu yöntem (yani Dize httpMethod) için ekstra bir parametre eklemek düşünüyordum.

Nasıl yoluyla ya paramters göndermek edebilmek için mümkün olduğunca az yukarıdaki kodu değiştirebilir GETveya POST?

Değişmeyi umuyordum

connection.setRequestMethod("GET");

için

connection.setRequestMethod("POST");

hile yapardı, ancak parametreler hala GET yöntemi ile gönderiliyor.

Yardımcı HttpURLConnectionolacak herhangi bir yöntem var mı? Yararlı Java yapısı var mı?

Herhangi bir yardım çok takdir edilecektir.


Gönderi parametreleri, URL'de değil http üstbilgisi bölümünde gönderilir. (posta URL'niz olurdu http://example.com/index.php)
Dacwe


2
Http (s) UrlConnection'a yayınlayın ....
Peter Kriens

soruyu genişletmek! Herkes nasıl eki sonrası parametre olarak göndermek için herhangi bir ipucu var mı?
therealprashant

1
İlk kod snippet'i neden "işlev" anahtar sözcüğüyle başlıyor?
Llew Vallis

Yanıtlar:


470

Bir GET isteğinde, parametreler URL'nin bir parçası olarak gönderilir.

Bir POST isteğinde, parametreler başlıklardan sonra isteğin gövdesi olarak gönderilir.

HttpURLConnection ile bir POST yapmak için, bağlantıyı açtıktan sonra parametreleri bağlantıya yazmanız gerekir.

Bu kodun başlatılması gerekir:

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 ()' bağlantısı açılmıyor. Bir connect () ifadesi belirtmemeniz durumunda, http istek gövdesine / heared'e yazıp gönderdiğinizde bağlantı açılır. Bunu sertifikalarla denedim. SSL el sıkışması yalnızca connect çağırıldıktan sonra veya sunucuya bir veri gönderdiğinizde gerçekleşir.
Ashwin

14
getBytes (), ortamın varsayılan charaset'ini kullanır, NOT UTF-8 charset = utf-8 içerik türünü doldurmamalıdır: application / x-www-form-urlencoded; charset = utf-8 Örnekte iki kez bayt dönüşümü yaparsınız. Yapılması gerekenler: byte [] data = urlParameters.getData ("UTF-8"); connection.getOutputStream () yazma (veri).; kapatmak VE yıkamak VE bağlantıyı kesmek için bir faydası yok
Peter Kriens

8
@PeterKriens Eklediğiniz için teşekkürler - demek istediğine inanıyorum byte[] data = urlParameters.getBytes(Charset.forName("UTF-8")):).
gerrytan

7
@AlanGeleynse Kaçırmayın wr.flush (); ve wr.close (); sonunda?
15'te

9
Bu işe yaramazsa, neden bu kadar çok oy var? Sen buna yapmalı ya conn.getResponseCode()ya conn.getInputStream()aksi takdirde herhangi bir veri göndermez.
Imaskar

229

Form gönderen ve sonuç sayfasını gönderen basit bir örnek System.out. URL'yi ve POST parametrelerini uygun şekilde değiştirin elbette:

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

Sonucu Stringdoğrudan çıktı almak yerine yapmak istiyorsanız:

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

Parametre kodlamasını ve Harita kullanımını içerdiğinden bu en iyi yanıttır.
Airy

4
Ne yazık ki bu kod, içeriğin kodlamasının UTF-8her zaman böyle olmadığı varsayılır . Karakter kümesini almak için, başlık alınmalı Content-Typeve karakter kümesi ayrıştırılmalıdır. Bu başlık mevcut değilse, standart http one: öğesini kullanın ISO-8859-1.
engineercoding

@Aprel IFTFY ... değerlendirmelerde yan etkileri olan ifadeleri kullanmak gerçekten çirkin.

1
@engineercoding Ne yazık ki HTML için bunu tamamen doğru yapmak bile daha zordur, çünkü Unicode BOM veya ayrıştırılması gereken belgenin içinde bir <meta charset="...">veya <meta http-equiv="Content-Type" content="...">başlık da olabilir.
Ekim 15:36

1
@Nepster Bunu yapma. response += line;olağanüstü yavaş ve satır sonları yer. Cevaba bir dize yanıtı alma örneği ekledim.
Boann

63

Alan örneği aslında yazı yapmak için alamadım , bu yüzden bu ile sona erdi:

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
Ne yazık ki, bu kod yanıtı okumuyor. Boş form html'yi okur.
Kovács Imre

alan örneğine eklemek zorunda kaldım yanıt akışını açmak oldu. bunu yapmadan önce, aslında hiçbir bayt gönderilmedi.
Beefeather

1
Writer.close () çağrısını kaldırmak benim için yaptı.
Maxime T

23

HttpURLConnectionKullanmak gerçekten hantal buluyorum . Ve çok sayıda kaynatma plakası, hata eğilimli kod yazmanız gerekiyor. Android projelerim için hafif bir sargıya ihtiyacım vardı ve kullanabileceğiniz bir kütüphane ile çıktım : DavidWebb .

Yukarıdaki örnek şöyle yazılabilir:

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

Sağlanan bağlantıda alternatif kitaplıkların bir listesini bulabilirsiniz.


1
Yazınızı oylamayacağım çünkü yayınınız daha az cevap vermişti ve daha çok reklam vermişti ... ama kütüphanenizle oynadım ve beğendim. Çok özlü; çok sayıda sözdizimsel şeker; Java'yı bir komut dosyası dili olarak benim gibi kullanırsanız, bazı http etkileşimlerini çok hızlı ve verimli bir şekilde eklemek için harika bir kütüphanedir. Sıfır kazan plakası zaman zaman değerlidir ve OP için faydalı olabilir.
Dean

3
Ben oylayacağım. DavidWebb'i uygulamalarımdan birinde başarıyla kullandım ve yakında geliştireceğim iki tane daha yapacağım. Kullanımı çok kolay.
William T. Mallard

Android'de https ile DefaultHttpClient kullanmak SSLPeerUnverifiedException ile başarısız oluyor: Eş sertifika yok (doğru imzalanmış https sertifikalarında bile), URL kullanmak hantal (parametreleri kodlama, sonucu kontrol etme). DavidWebb kullanmak benim için çalıştı, teşekkürler.
Martin Vysny

AsyncTask desteği yok mu? Bu yüzden UI iş parçacığını varsayılan olarak kilitlemek ... bu kötü
slinden77

Çok temel bir kütüphane. Programcı, AsyncTask'ta, IntentService'de, Eşitleme İşleyicisinde ve benzerlerinde arka plan iş parçacığından çağırmalıdır. Ve Android'e bağlı değildir -> Java SE ve EE'de de kullanılabilir.
hgoebl

12

Yukarıdaki cevapları okudum ve HTTP isteğini basitleştirmek için bir yardımcı sınıf oluşturduk. Umarım bu sana yardımcı olur.

Yöntem Çağrısı

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

Yardımcı Sınıf

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

Diğer cevapların alternatifi verdiğini görüyorum, şahsen sezgisel olarak doğru şeyi yaptığınızı düşünüyorum;). Üzgünüm, devoxx'da bu tür şeyler hakkında birkaç konuşmacının bulunduğu yer.

Bu yüzden kişisel olarak Apache'nin HTTPClient / bu tür işleri yapmak için HttpCore kütüphanelerini kullanıyorum, API'lerinin Java'nın yerel HTTP desteğinden daha kolay kullanıldığını görüyorum. Tabii ki 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

Aynı sorunu yaşadım. POST yoluyla veri göndermek istedim. Aşağıdaki kodu kullandım:

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

Ayrıştırma için Jsoup kullandım:

    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 ve POST yöntemi şu şekilde ayarlanır ... Api çağrısı için iki tür 1) get () ve 2) post (). get () yöntemi, url'deki veri gönderimizde değer ve post () yöntemini kullanmak ve yanıt almak için api json dizisinden değer almak için kullanılır.

 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

Bu kalıbı deneyin:

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

Bu yanıt, Özel Java POJO kullanan POST Çağrısının özel durumunu kapsar.

Java Nesnemizi JSON'a serileştirmek için Gson için maven bağımlılığını kullanma .

Gson'u aşağıdaki bağımlılığı kullanarak yükleyin.

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

Gradle kullananlar için aşağıdakileri kullanabilirsiniz

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

Kullanılan diğer ithalatlar:

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;

Şimdi, Apache tarafından sağlanan HttpPost'u kullanabiliriz

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

Yukarıdaki kod, POST Çağrısından alınan yanıt koduyla birlikte dönecektir


2

burada jsonobject parametresini // jsonobject = {"name": "lucifer", "pass" olarak gönderdim: "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

Ben apache http api üzerine inşa http-istek tavsiye ederim .

Sizin durumunuz için örnek görebilirsiniz:

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
}

Yanıt organıyla ilgilenmiyorsanız

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

Genel gönderme sonrası ile isteği için http-istek : okuyun dokümantasyon ve benim yanıtları görmek HTTP JAVA JSON dize ile POST isteği , Java'da gönderme HTTP POST isteği , Java JSON kullanarak HTTP POST


1

Merhaba pls post yönteminizi geliştirmek için bu sınıfı kullanı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

Boann'ın cevabını aldım ve php'nin http_build_query yöntemi gibi listeleri ve dizileri destekleyen daha esnek bir sorgu dizesi oluşturucu oluşturmak için kullandım:

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

Anahtar / değer çiftlerini beklediğiniz için $ _POST kullanarak bir php sayfasında istek almada sorun yaşayanlar için:

Tüm cevaplar çok yararlı olsa da, ben aslında eski dize Aptt HttpClient kullandığım beri hangi dize göndermek için bazı temel anlayış yoktu

new UrlEncodedFormEntity(nameValuePairs); (Java)

ve sonra php $ _POST kullanabilirsiniz anahtar / değer çiftleri almak.

Anladığım kadarıyla, yayınlanmadan önce bu dizeyi manuel olarak oluşturduk. Dize şöyle görünmeli

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

bunun yerine sadece URL'ye eklenir (başlıkta).

Alternatif, bunun yerine json-string kullanmak olacaktır:

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

ve $ _POST olmadan php ile çekin:

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

Burada Kotlin'de bir örnek kod bulabilirsiniz:

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

Bir POST olarak değerlendirmek için connection.getOutputStream()"en az bir kez" (yanı sıra setDoOutput(true)) çağırmanız gerektiği anlaşılıyor.

Yani gereken minimum kod:

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

Şaşırtıcı bir şekilde urlString'de "GET" stil parametrelerini bile kullanabilirsiniz. Bu bir şeyleri şaşırtabilir.

Görünüşe göre NameValuePair'i de kullanabilirsiniz .


POST parametreleri nerede ...?
Yousha Aleayoub

İnsanlar bunu neden küçümsüyor? Bu, POST en hiç nasıl yapılacağı için bir not parametreler olmadan ... (yani hiçbir payload0 ... gerçi
rogerdpack
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.