我想在Java中使用JSON制作一个简单的HTTP POST。

假设URL是www.site.com

它接收值{"name":"myname","age":"20"},例如标记为" details "。

我将如何着手创建POST的语法?

我似乎也找不到JSON Javadocs中的POST方法。


当前回答

您可以使用Gson库将java类转换为JSON对象。

为想要发送的变量创建一个pojo类 如上所述

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

就变成了

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

一旦在pojo1类中设置了变量,就可以使用下面的代码发送它

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

这些是进口

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;

和GSON

import com.google.gson.Gson;

其他回答

以下是你需要做的:

获取Apache HttpClient,这将使您能够发出所需的请求 用它创建一个HttpPost请求,并添加头应用程序/x-www-form-urlencoded 创建一个StringEntity,并将JSON传递给它 执行调用

代码大致如下(你仍然需要调试它并使它工作):

// @Deprecated HttpClient httpClient = new DefaultHttpClient();
HttpClient httpClient = HttpClientBuilder.create().build();
try {
    HttpPost request = new HttpPost("http://yoururl");
    StringEntity params = new StringEntity("details={\"name\":\"xyz\",\"age\":\"20\"} ");
    request.addHeader("content-type", "application/x-www-form-urlencoded");
    request.setEntity(params);
    HttpResponse response = httpClient.execute(request);
} catch (Exception ex) {
} finally {
    // @Deprecated httpClient.getConnectionManager().shutdown(); 
}

Java 8与apache httpClient 4

CloseableHttpClient client = HttpClientBuilder.create().build();
HttpPost httpPost = new HttpPost("www.site.com");


String json = "details={\"name\":\"myname\",\"age\":\"20\"} ";

        try {
            StringEntity entity = new StringEntity(json);
            httpPost.setEntity(entity);

            // set your POST request headers to accept json contents
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("Content-type", "application/json");

            try {
                // your closeablehttp response
                CloseableHttpResponse response = client.execute(httpPost);

                // print your status code from the response
                System.out.println(response.getStatusLine().getStatusCode());

                // take the response body as a json formatted string 
                String responseJSON = EntityUtils.toString(response.getEntity());

                // convert/parse the json formatted string to a json object
                JSONObject jobj = new JSONObject(responseJSON);

                //print your response body that formatted into json
                System.out.println(jobj);

            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {

                e.printStackTrace();
            }

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

Java 11标准的HTTP客户端API,实现了HTTP/2和Web Socket,可以在java.net.HTTP找到。*:

String payload = "{\"name\": \"myname\", \"age\": \"20\"}";
HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder(URI.create("www.site.com"))
            .header("content-type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(payload))
            .build();
    
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());

使用HttpURLConnection可能是最简单的。

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

你将使用JSONObject或其他东西来构造JSON,但不是用来处理网络;你需要序列化它,然后将它传递给一个HttpURLConnection到POST。

我发现这个问题寻找如何从java客户端发送post请求到谷歌端点的解决方案。以上答案,很可能是正确的,但在谷歌端点的情况下不工作。

谷歌端点的解决方案。

Request body must contains only JSON string, not name=value pair. Content type header must be set to "application/json". post("http://localhost:8888/_ah/api/langapi/v1/createLanguage", "{\"language\":\"russian\", \"description\":\"dsfsdfsdfsdfsd\"}"); public static void post(String url, String json ) 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(json.getBytes(charset)); } InputStream response = connection.getInputStream(); } It sure can be done using HttpClient as well.