webentwicklung-frage-antwort-db.com.de

HTTP POST mit JSON in Java

Ich möchte ein einfaches HTTP POST mit JSON in Java erstellen.

Angenommen, die URL lautet www.site.com

und es nimmt den Wert {"name":"myname","age":"20"} an, der beispielsweise als 'details' bezeichnet ist.

Wie würde ich vorgehen, um die Syntax für den POST zu erstellen?

Ich kann auch keine POST -Methode in den JSON-Javadocs finden.

171
asdf007

Folgendes müssen Sie tun:

  1. Holen Sie sich den Apache HttpClient, damit Sie die erforderliche Anfrage stellen können
  2. Erstellen Sie damit eine HttpPost-Anfrage und fügen Sie den Header "application/x-www-form-urlencoded" hinzu
  3. Erstellen Sie eine StringEntity, an die Sie JSON übergeben
  4. Führen Sie den Anruf aus

Der Code sieht ungefähr so ​​aus (Sie müssen ihn noch debuggen und zum Laufen bringen)

//Deprecated
//HttpClient httpClient = new DefaultHttpClient(); 

HttpClient httpClient = HttpClientBuilder.create().build(); //Use this instead 

try {

    HttpPost request = new HttpPost("http://yoururl");
    StringEntity params =new StringEntity("details={\"name\":\"myname\",\"age\":\"20\"} ");
    request.addHeader("content-type", "application/x-www-form-urlencoded");
    request.setEntity(params);
    HttpResponse response = httpClient.execute(request);

    //handle response here...

}catch (Exception ex) {

    //handle exception here

} finally {
    //Deprecated
    //httpClient.getConnectionManager().shutdown(); 
}
156
momo

Sie können die Gson-Bibliothek verwenden, um Ihre Klassen Java in JSON-Objekte zu konvertieren.

Erstellen Sie eine Pojo-Klasse für Variablen, die Sie wie oben beschrieben senden möchten. Beispiel

{"name":"myname","age":"20"}

wird

class pojo1
{
   String name;
   String age;
   //generate setter and getters
}

sobald Sie die Variablen in der Klasse pojo1 festgelegt haben, können Sie diese mit dem folgenden Code senden

String       postUrl       = "www.site.com";// put in your url
Gson         gson          = new Gson();
HttpClient   httpClient    = HttpClientBuilder.create().build();
HttpPost     post          = new HttpPost(postUrl);
StringEntity postingString = new StringEntity(gson.toJson(pojo1));//gson.tojson() converts your pojo to json
post.setEntity(postingString);
post.setHeader("Content-type", "application/json");
HttpResponse  response = httpClient.execute(post);

und das sind die Importe

import org.Apache.http.HttpEntity;
import org.Apache.http.HttpResponse;
import org.Apache.http.client.HttpClient;
import org.Apache.http.client.methods.HttpPost;
import org.Apache.http.entity.StringEntity;
import org.Apache.http.impl.client.HttpClientBuilder;

und für GSON

import com.google.gson.Gson;
86
Prakash

@ Momos Antwort für Apache HttpClient, Version 4.3.1 oder höher. Ich verwende JSON-Java, um mein JSON-Objekt zu erstellen:

JSONObject json = new JSONObject();
json.put("someKey", "someValue");    

CloseableHttpClient httpClient = HttpClientBuilder.create().build();

try {
    HttpPost request = new HttpPost("http://yoururl");
    StringEntity params = new StringEntity(json.toString());
    request.addHeader("content-type", "application/json");
    request.setEntity(params);
    httpClient.execute(request);
// handle response here...
} catch (Exception ex) {
    // handle exception here
} finally {
    httpClient.close();
}

Es ist wahrscheinlich am einfachsten, HttpURLConnection zu verwenden.

http://www.xyzws.com/Javafaq/how-to-use-httpurlconnection-post-data-to-web-server/139

Sie verwenden JSONObject oder was auch immer, um JSON zu erstellen, aber nicht, um das Netzwerk zu verwalten. Sie müssen es serialisieren und dann an eine HttpURLConnection an POST übergeben.

19
Alex Churchill
protected void sendJson(final String play, final String prop) {
     Thread t = new Thread() {
     public void run() {
        Looper.prepare(); //For Preparing Message Pool for the childThread
        HttpClient client = new DefaultHttpClient();
        HttpConnectionParams.setConnectionTimeout(client.getParams(), 1000); //Timeout Limit
        HttpResponse response;
        JSONObject json = new JSONObject();

            try {
                HttpPost post = new HttpPost("http://192.168.0.44:80");
                json.put("play", play);
                json.put("Properties", prop);
                StringEntity se = new StringEntity(json.toString());
                se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
                post.setEntity(se);
                response = client.execute(post);

                /*Checking response */
                if (response != null) {
                    InputStream in = response.getEntity().getContent(); //Get the data in the entity
                }

            } catch (Exception e) {
                e.printStackTrace();
                showMessage("Error", "Cannot Estabilish Connection");
            }

            Looper.loop(); //Loop in the message queue
        }
    };
    t.start();
}
14
Medo

Versuchen Sie diesen Code:

HttpClient httpClient = new DefaultHttpClient();

try {
    HttpPost request = new HttpPost("http://yoururl");
    StringEntity params =new StringEntity("details={\"name\":\"myname\",\"age\":\"20\"} ");
    request.addHeader("content-type", "application/json");
    request.addHeader("Accept","application/json");
    request.setEntity(params);
    HttpResponse response = httpClient.execute(request);

    // handle response here...
}catch (Exception ex) {
    // handle exception here
} finally {
    httpClient.getConnectionManager().shutdown();
}
14
Sonu Dhakar

Ich fand diese Frage auf der Suche nach einer Lösung zum Senden einer Post-Anfrage vom Java -Client an Google Endpoints. Die obigen Antworten sind sehr wahrscheinlich korrekt, funktionieren jedoch bei Google Endpoints nicht.

Lösung für Google Endpoints.

  1. Der Anforderungshauptteil darf nur eine JSON-Zeichenfolge und kein Paar aus Name und Wert enthalten.
  2. Der Inhaltstyp-Header muss auf "application/json" gesetzt sein.

    post("http://localhost:8888/_ah/api/langapi/v1/createLanguage",
                       "{\"language\":\"russian\", \"description\":\"dsfsdfsdfsdfsd\"}");
    
    
    
    public static void post(String url, String param ) throws Exception{
      String charset = "UTF-8"; 
      URLConnection connection = new URL(url).openConnection();
      connection.setDoOutput(true); // Triggers POST.
      connection.setRequestProperty("Accept-Charset", charset);
      connection.setRequestProperty("Content-Type", "application/json;charset=" + charset);
    
      try (OutputStream output = connection.getOutputStream()) {
        output.write(param.getBytes(charset));
      }
    
      InputStream response = connection.getInputStream();
    }
    

    Dies kann natürlich auch mit HttpClient durchgeführt werden.

9
yurin

Sie können den folgenden Code mit Apache HTTP verwenden:

String payload = "{\"name\": \"myname\", \"age\": \"20\"}";
post.setEntity(new StringEntity(payload, ContentType.APPLICATION_JSON));

response = client.execute(request);

Zusätzlich können Sie ein json-Objekt erstellen und so Felder in das Objekt einfügen

HttpPost post = new HttpPost(URL);
JSONObject payload = new JSONObject();
payload.put("name", "myName");
payload.put("age", "20");
post.setEntity(new StringEntity(payload.toString(), ContentType.APPLICATION_JSON));
5
TMO

Für Java 11 können Sie new HTTP client verwenden:

 HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("http://localhost/api"))
        .header("Content-Type", "application/json")
        .POST(ofInputStream(() -> getClass().getResourceAsStream(
            "/some-data.json")))
        .build();

    client.sendAsync(request, BodyHandlers.ofString())
        .thenApply(HttpResponse::body)
        .thenAccept(System.out::println)
        .join();

Sie können Publisher aus InputStream, String, File verwenden. Das Konvertieren von JSON in den String oder IS ist mit Jackson möglich.

1
user3359592

Ich empfehle http-request auf Apache http api gebaut.

HttpRequest<String> httpRequest = HttpRequestBuilder.createPost(yourUri, String.class)
    .responseDeserializer(ResponseDeserializer.ignorableDeserializer()).build();

public void send(){
   ResponseHandler<String> responseHandler = httpRequest.execute("details", yourJsonData);

   int statusCode = responseHandler.getStatusCode();
   String responseContent = responseHandler.orElse(null); // returns Content from response. If content isn't present returns null. 
}

Wenn Sie JSON als Anfragetext senden möchten, können Sie:

  ResponseHandler<String> responseHandler = httpRequest.executeWithBody(yourJsonData);

Ich empfehle dringend, die Dokumentation vor der Verwendung zu lesen.

0
Beno Arakelyan