JavaでJSONを使用して簡単なHTTP POSTを作成したいと思います。
URLがwww.site.com
だとしましょう
たとえば、{"name":"myname","age":"20"}
というラベルの付いた値'details'
を取ります。
POSTの構文をどのように作成しますか?
JSON JavadocにPOSTメソッドが見つからないようです。
これがあなたがする必要があることです:
コードはおおよそ次のようになります(それでもデバッグして動作させる必要があります)。
//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();
}
JavaクラスをJSONオブジェクトに変換するためにGsonライブラリを利用することができます。
上記のように送信したい変数のための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バージョン4.3.1以降に対する@ momoの回答。私は私のJSONオブジェクトを構築するためにJSON-Java
を使っています。
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();
}
HttpURLConnection を使用するのがおそらく最も簡単です。
http://www.xyzws.com/Javafaq/how-to-use-httpurlconnection-post-data-to-web-server/139
あなたはJSONObjectまたはあなたのJSONを構築するために何でも使用しますが、ネットワークを処理するためには使用しません。シリアル化してからPOSTのHttpURLConnectionに渡す必要があります。
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();
}
このコードを試してください:
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();
}
私は、JavaクライアントからGoogleエンドポイントに投稿要求を送信する方法についての解決策を探して、この質問を見つけました。上記の答えは、おそらく正しいですが、Googleエンドポイントの場合は機能しません。
Googleエンドポイント用のソリューション。
コンテンツタイプヘッダーは "application/json"に設定する必要があります。
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();
}
確かにHttpClientを使っても可能です。
Apache HTTPでは次のコードを使用できます。
String payload = "{\"name\": \"myname\", \"age\": \"20\"}";
post.setEntity(new StringEntity(payload, ContentType.APPLICATION_JSON));
response = client.execute(request);
さらに、あなたはJSONオブジェクトを作成し、このようにオブジェクトにフィールドを置くことができます
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));
http-request はApache http api上に構築されています。
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.
}
リクエストボディとしてJSON
を送信したい場合は、次のようにします。
ResponseHandler<String> responseHandler = httpRequest.executeWithBody(yourJsonData);
使用前に資料を読むことを強くお勧めします。
Java 11では、新しい HTTPクライアント :を使うことができます。
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();
あなたはInputStream、String、Fileから発行者を使うことができます。 JSONをStringまたはISに変換するには、Jacksonを使用します。