Java - einfaches Senden von HTTP-Parametern über die POST-Methode

319

Ich verwende diesen Code erfolgreich, um HTTPAnfragen mit einigen Parametern über die GETMethode zu senden

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

Jetzt muss ich möglicherweise die Parameter (dh param1, param2, param3) über die POSTMethode senden, da sie sehr lang sind. Ich dachte daran, dieser Methode einen zusätzlichen Parameter hinzuzufügen (z. B. String httpMethod).

Wie kann ich den obigen Code so wenig wie möglich ändern, um Parameter entweder über GEToder senden zu können POST?

Ich hatte gehofft, dass sich das ändert

connection.setRequestMethod("GET");

zu

connection.setRequestMethod("POST");

hätte den Trick gemacht, aber die Parameter werden immer noch über die GET-Methode gesendet.

Hat HttpURLConnectioneine Methode, die helfen würde? Gibt es ein hilfreiches Java-Konstrukt?

Jede Hilfe wäre sehr dankbar.

Dan
quelle
Post-Parameter werden im http-Header-Bereich und nicht in der URL gesendet. (Ihre Post-URL wäre http://example.com/index.php)
Dacwe
2
In Java 1.6 ist keine Methode setRequestMethod definiert: docs.oracle.com/javase/6/docs/api/java/net/URLConnection.html
ante.sabo
2
Cast es zu Http (s) UrlConnection ....
Peter Kriens
die Frage erweitern! Hat jemand eine Ahnung, wie man einen Anhang als Post-Parameter
sendet
1
Warum beginnt das erste Code-Snippet mit dem Schlüsselwort "function"?
Llew Vallis

Antworten:

470

In einer GET-Anforderung werden die Parameter als Teil der URL gesendet.

In einer POST-Anforderung werden die Parameter als Hauptteil der Anforderung nach den Headern gesendet.

Um einen POST mit HttpURLConnection durchzuführen, müssen Sie die Parameter in die Verbindung schreiben, nachdem Sie die Verbindung geöffnet haben.

Mit diesem Code können Sie loslegen:

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
quelle
40
@ Alan Geleynse: 'url.openconnection ()' öffnet keine Verbindung. Wenn Sie keine connect () -Anweisung angeben, wird die Verbindung geöffnet, wenn Sie an den http-Anforderungshauptteil / Heared schreiben und ihn senden. Ich habe dies mit Zertifikaten versucht. Der SSL-Handshake findet erst statt, nachdem Sie connect aufgerufen haben oder wenn Sie Daten an den Server senden.
Ashwin
14
getBytes () verwendet das Standardzeichen der Umgebung, NICHT UTF-8 charset = utf-8 muss dem Inhaltstyp folgen: application / x-www-form-urlencoded; charset = utf-8 Im Beispiel führen Sie die Bytekonvertierung zweimal durch. Sollte tun: byte [] data = urlParameters.getData ("UTF-8"); connection.getOutputStream (). write (data); Keine Verwendung zum Schließen UND Spülen UND Trennen
Peter Kriens
8
@ PeterKriens Danke für deine Hinzufügung - ich glaube du meintest byte[] data = urlParameters.getBytes(Charset.forName("UTF-8")):).
Gerrytan
7
@AlanGeleynse Verpassen Sie nicht wr.flush (); und wr.close (); Am Ende?
Confile
9
Wie kommt es, dass dies so viele positive Stimmen hat, wenn es nicht funktioniert? Sie müssen entweder anrufen conn.getResponseCode()oder conn.getInputStream()es werden keine Daten gesendet.
Imaskar
229

Hier ist ein einfaches Beispiel, bei dem ein Formular gesendet und die Ergebnisseite an ausgegeben wird System.out. Ändern Sie natürlich die URL und die POST-Parameter entsprechend:

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

Wenn Sie das Ergebnis Stringnicht direkt ausdrucken möchten, gehen Sie wie folgt vor:

        StringBuilder sb = new StringBuilder();
        for (int c; (c = in.read()) >= 0;)
            sb.append((char)c);
        String response = sb.toString();
Boann
quelle
Dies ist die beste Antwort, da sie die Parametercodierung und die Verwendung von Map umfasst.
Luftig
4
Leider geht dieser Code davon aus, dass die Codierung des Inhalts erfolgt UTF-8, was nicht immer der Fall ist. Um den Zeichensatz abzurufen, sollte man den Header abrufen Content-Typeund den Zeichensatz davon analysieren. Wenn dieser Header nicht verfügbar ist, verwenden Sie den Standard-http : ISO-8859-1.
Engineercoding
@Aprel IFTFY ... die Verwendung von Ausdrücken mit Nebenwirkungen in Bewertungen ist in der Tat hässlich.
1
@engineercoding Leider ist es für HTML noch schwieriger, dies vollständig korrekt durchzuführen, da es auch eine Unicode-Stückliste oder einen <meta charset="...">oder <meta http-equiv="Content-Type" content="...">-Header im Dokument geben kann, der analysiert werden muss.
Boann
1
@Nepster Tu das nicht. response += line;ist phänomenal langsam und frisst Zeilenumbrüche. Ich habe der Antwort ein Beispiel für das Erhalten einer Zeichenfolgenantwort hinzugefügt.
Boann
63

Ich konnte Alans Beispiel nicht dazu bringen, den Beitrag tatsächlich zu schreiben, also kam ich zu folgendem Ergebnis:

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
quelle
1
Leider liest dieser Code die Antwort nicht. Es liest das leere Formular HTML.
Kovács Imre
Was ich zu Alans Beispiel hinzufügen musste, war das Öffnen des Antwortstroms. bevor ich es getan hatte, wurden tatsächlich keine Bytes gesendet.
Beefeather
1
Das Entfernen des Aufrufs writer.close () hat es für mich getan.
Maxime T
23

Ich finde es HttpURLConnectionsehr umständlich zu bedienen. Und Sie müssen viel fehlerhaften Code schreiben. Ich brauchte einen leichten Wrapper für meine Android-Projekte und kam mit einer Bibliothek heraus, die Sie auch verwenden können: DavidWebb .

Das obige Beispiel könnte folgendermaßen geschrieben werden:

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

Eine Liste alternativer Bibliotheken finden Sie unter dem angegebenen Link.

hgoebl
quelle
1
Ich werde nicht upvoten, weil Ihr Beitrag weniger eine Antwort als eine Werbung war ... aber ich habe mit Ihrer Bibliothek gespielt und es gefällt mir. Sehr prägnant; viel syntaktischer Zucker; Wenn Sie Java wie ich als Skriptsprache verwenden, ist es eine großartige Bibliothek, um sehr schnell und effizient einige http-Interaktionen hinzuzufügen. Zero Boilerplate ist manchmal wertvoll und kann für das OP nützlich gewesen sein.
Dean
3
Ich werde abstimmen. Ich habe DavidWebb erfolgreich in einer meiner Apps verwendet und werde dies für zwei weitere tun, die ich bald entwickeln werde. Sehr einfach zu bedienen.
William T. Mallard
Vielen Dank, dass die Verwendung von DefaultHttpClient mit https unter Android mit SSLPeerUnverifiedException fehlschlägt: Kein Peer-Zertifikat (auch bei korrekt signierten https-Zertifikaten), die Verwendung der URL ist umständlich (Codierungsparameter, Überprüfung auf Ergebnisse). Die Verwendung von DavidWebb hat bei mir funktioniert, danke.
Martin Vysny
Keine AsyncTask-Unterstützung? Also den UI-Thread standardmäßig sperren ... das ist schlecht
slinden77
Es ist eine sehr einfache Bibliothek. Der Programmierer muss es vom Hintergrund-Thread in AsyncTask, IntentService, Synchronization Handler und dergleichen aufrufen. Und es hängt nicht von Android ab -> kann auch in Java SE und EE verwendet werden.
Hgoebl
12

Ich habe die obigen Antworten gelesen und eine Dienstprogrammklasse erstellt, um die HTTP-Anforderung zu vereinfachen. ich hoffe es hilft dir.

Methodenaufruf

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

Gebrauchsklasse

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
quelle
10

Ich sehe, dass einige andere Antworten die Alternative gegeben haben, ich persönlich denke, dass Sie intuitiv das Richtige tun;). Entschuldigung, bei devoxx, wo sich mehrere Redner über solche Dinge geärgert haben.

Aus diesem Grund verwende ich persönlich die HTTPClient / HttpCore- Bibliotheken von Apache , um diese Art von Arbeit zu erledigen. Ich finde, dass ihre API einfacher zu verwenden ist als die native HTTP-Unterstützung von Java. YMMV natürlich!

Martijn Verburg
quelle
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
quelle
5
WTH import java.net.*;!
Yousha Aleayoub
4

Ich hatte das gleiche Problem. Ich wollte Daten per POST senden. Ich habe den folgenden Code verwendet:

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

Ich habe Jsoup zum Parsen verwendet:

    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
quelle
4

GET- und POST-Methode wie folgt eingestellt ... Zwei Typen für API-Aufrufe 1) get () und 2) post (). get () -Methode zum Abrufen des Werts aus dem API-JSON-Array zum Abrufen der value & post () -Methode, die in unserem Datenpost in der URL verwendet wird, und zum Abrufen der Antwort.

 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
quelle
3

Versuchen Sie dieses Muster:

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
quelle
3

Diese Antwort deckt den speziellen Fall des POST-Aufrufs mit einem benutzerdefinierten Java-POJO ab.

Verwenden der Maven-Abhängigkeit für Gson zum Serialisieren unseres Java-Objekts in JSON.

Installieren Sie Gson mithilfe der folgenden Abhängigkeit.

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

Für diejenigen, die Gradle verwenden, können Sie die folgenden verwenden

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

Andere verwendete Importe:

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;

Jetzt können wir den von Apache bereitgestellten HttpPost verwenden

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

Der obige Code wird mit dem vom POST-Anruf empfangenen Antwortcode zurückgegeben

Kaushalop
quelle
2

hier habe ich jsonobject als parameter // jsonobject = {"name": "lucifer", "pass": "abc"} // serverUrl = " http://192.168.100.12/testing " //host=192.168.100.12 gesendet

  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
quelle
2

Ich kann eine http-Anfrage nur wärmstens empfehlen die auf apache http api .

Für Ihren Fall sehen Sie Beispiel:

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
}

Wenn Sie nicht an der Antwortstelle interessiert sind

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

Allgemeines Senden einer Post-Anfrage mit http-Anfrage : Lesen Sie die Dokumentation und sehen Sie sich meine Antworten an. HTTP-POST-Anfrage mit JSON-Zeichenfolge in JAVA , Senden einer HTTP-POST-Anfrage In Java , HTTP-POST mit JSON in Java

Beno Arakelyan
quelle
1

Hallo, bitte benutze diese Klasse, um deine Post-Methode zu verbessern

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
quelle
0

Ich nahm Boanns Antwort und erstellte daraus einen flexibleren Builder für Abfragezeichenfolgen, der Listen und Arrays unterstützt, genau wie die http_build_query-Methode von 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
quelle
0

Für diejenigen, die Probleme haben, die Anfrage auf einer PHP-Seite mit $ _POST zu empfangen, weil Sie Schlüssel-Wert-Paare erwarten:

Obwohl alle Antworten sehr hilfreich waren, fehlte mir ein grundlegendes Verständnis dafür, welche Zeichenfolge tatsächlich gepostet werden sollte, da ich sie im alten Apache-HttpClient verwendet habe

new UrlEncodedFormEntity(nameValuePairs); (Java)

und dann könnte $ _POST in PHP verwendet werden, um die Schlüssel-Wert-Paare zu erhalten.

Nach meinem Verständnis hat man diese Zeichenfolge jetzt vor dem Posten manuell erstellt. Die Zeichenfolge muss also so aussehen

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

sondern fügen Sie es einfach der URL hinzu, die veröffentlicht wird (in der Kopfzeile).

Die Alternative wäre, stattdessen einen JSON-String zu verwenden:

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

und ziehen Sie es in PHP ohne $ _POST:

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

Hier finden Sie einen Beispielcode in 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
quelle
-3

Es scheint, dass Sie auch connection.getOutputStream()"mindestens einmal" (sowie setDoOutput(true)) aufrufen müssen, damit es als POST behandelt wird.

Der minimal erforderliche Code lautet also:

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

Überraschenderweise können Sie im urlString sogar "GET" -Stilparameter verwenden. Das könnte die Dinge jedoch verwirren.

Sie können anscheinend auch NameValuePair verwenden .

Rogerdpack
quelle
Wo sind POST-Parameter ...?
Yousha Aleayoub
Warum stimmen die Leute das ab? Es ist ein Hinweis, wie man POSTs überhaupt macht, allerdings ohne Parameter ... (dh keine Nutzlast0 ...
Rogerdpack