Ich verwende diesen Code erfolgreich, um HTTP
Anfragen mit einigen Parametern über die GET
Methode zu senden
void sendRequest(String request)
{
// i.e.: request = "http://example.com/index.php?param1=a¶m2=b¶m3=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 POST
Methode 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 GET
oder 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 HttpURLConnection
eine Methode, die helfen würde? Gibt es ein hilfreiches Java-Konstrukt?
Jede Hilfe wäre sehr dankbar.
http://example.com/index.php
)Antworten:
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:
quelle
byte[] data = urlParameters.getBytes(Charset.forName("UTF-8"))
:).conn.getResponseCode()
oderconn.getInputStream()
es werden keine Daten gesendet.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:Wenn Sie das Ergebnis
String
nicht direkt ausdrucken möchten, gehen Sie wie folgt vor:quelle
UTF-8
, was nicht immer der Fall ist. Um den Zeichensatz abzurufen, sollte man den Header abrufenContent-Type
und den Zeichensatz davon analysieren. Wenn dieser Header nicht verfügbar ist, verwenden Sie den Standard-http :ISO-8859-1
.<meta charset="...">
oder<meta http-equiv="Content-Type" content="...">
-Header im Dokument geben kann, der analysiert werden muss.response += line;
ist phänomenal langsam und frisst Zeilenumbrüche. Ich habe der Antwort ein Beispiel für das Erhalten einer Zeichenfolgenantwort hinzugefügt.Ich konnte Alans Beispiel nicht dazu bringen, den Beitrag tatsächlich zu schreiben, also kam ich zu folgendem Ergebnis:
quelle
Ich finde es
HttpURLConnection
sehr 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:
Eine Liste alternativer Bibliotheken finden Sie unter dem angegebenen Link.
quelle
Ich habe die obigen Antworten gelesen und eine Dienstprogrammklasse erstellt, um die HTTP-Anforderung zu vereinfachen. ich hoffe es hilft dir.
Methodenaufruf
Gebrauchsklasse
quelle
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!
quelle
quelle
import java.net.*;
!Ich hatte das gleiche Problem. Ich wollte Daten per POST senden. Ich habe den folgenden Code verwendet:
Ich habe Jsoup zum Parsen verwendet:
quelle
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.
quelle
Versuchen Sie dieses Muster:
quelle
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.
Für diejenigen, die Gradle verwenden, können Sie die folgenden verwenden
Andere verwendete Importe:
Jetzt können wir den von Apache bereitgestellten HttpPost verwenden
Der obige Code wird mit dem vom POST-Anruf empfangenen Antwortcode zurückgegeben
quelle
hier habe ich jsonobject als parameter // jsonobject = {"name": "lucifer", "pass": "abc"} // serverUrl = " http://192.168.100.12/testing " //host=192.168.100.12 gesendet
quelle
Ich kann eine http-Anfrage nur wärmstens empfehlen die auf apache http api .
Für Ihren Fall sehen Sie Beispiel:
Wenn Sie nicht an der Antwortstelle interessiert sind
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
quelle
Hallo, bitte benutze diese Klasse, um deine Post-Methode zu verbessern
quelle
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:
quelle
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
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
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:
und ziehen Sie es in PHP ohne $ _POST:
Hier finden Sie einen Beispielcode in Kotlin:
quelle
Es scheint, dass Sie auch
connection.getOutputStream()
"mindestens einmal" (sowiesetDoOutput(true)
) aufrufen müssen, damit es als POST behandelt wird.Der minimal erforderliche Code lautet also:
Überraschenderweise können Sie im urlString sogar "GET" -Stilparameter verwenden. Das könnte die Dinge jedoch verwirren.
Sie können anscheinend auch NameValuePair verwenden .
quelle