Poste HTTP utilisant JSON en Java
je voudrais faire un simple POST HTTP en utilisant JSON en Java.
disons que l'URL est www.site.com
et il prend la valeur {"name":"myname","age":"20"}
marquée comme 'details'
par exemple.
comment créer la syntaxe pour le POST?
Je n'arrive pas non plus à trouver de méthode de POST dans les Javadocs JSON.
8 réponses
Voici ce que vous devez faire:
- Apache HttpClient, cela vous permettrait de faire la demande requis
- créer une requête HttpPost avec elle et ajouter l'en-tête "application / x-www-form-urlencoded "
- créer une entité de chaîne de caractères que vous passerez à JSON
- exécuter l'appel
le code ressemble à peu près (vous aurez encore besoin de déboguer il et de le faire fonctionner)
//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();
}
vous pouvez utiliser la bibliothèque Gson pour convertir vos classes java en objets JSON.
Créer une classe pojo pour les variables que vous souhaitez envoyer comme dans L'exemple ci-dessus
{"name":"myname","age":"20"}
devient
class pojo1
{
String name;
String age;
//generate setter and getters
}
une fois que vous avez défini les variables dans la classe pojo1 vous pouvez envoyer cela en utilisant le code suivant
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);
et ce sont les importations
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;
et pour GSON
import com.google.gson.Gson;
la réponse de @momo pour Apache HttpClient, version 4.3.1 ou ultérieure. J'utilise JSON-Java
pour construire mon objet JSON:
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();
}
il est probablement plus facile d'utiliser HttpURLConnection .
http://www.xyzws.com/Javafaq/how-to-use-httpurlconnection-post-data-to-web-server/139
vous utiliserez JSONObject ou n'importe quoi pour construire votre JSON, mais pas pour gérer le réseau; vous devez le sérialiser et ensuite le passer à une connexion HttpURLConnection pour le poster.
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();
}
essayez ce 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();
}
j'ai trouvé cette question à la recherche de solution sur la façon d'envoyer la demande de poste de java client à Google Endpoints. Réponses ci-dessus, très probablement correct, mais ne fonctionne pas dans le cas de Google Endpoints.
Solution pour Google Endpoints.
- du corps de la Requête doit contenir uniquement chaîne JSON, pas paire nom=valeur.
-
L'en-tête du type de contenu doit être réglé sur"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(); }
cela peut certainement être fait en utilisant HttpClient aussi.
je vous conseille http-request construit sur 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.
}
si vous voulez envoyer JSON
comme corps de requête vous pouvez:
ResponseHandler<String> responseHandler = httpRequest.executeWithBody(yourJsonData);
proche de la gare et je vous conseille de lire la documentation avant de l'utiliser.