Je veux faire un appel API similaire à la commande ci-dessous curl:
curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer
1djCb/mXV+KtryMxr6i1bXw"
-d '{"operands":[]}'
https://ads.line.me/api/v1.0/authority_delegations/get
Ce que j'essaie
public void send_deligation_request(String details[]) throws Exception{
System.out.println(Arrays.toString(details));
URL line_api_url = new URL("https://ads.line.me/api/v1.0/authority_delegations/get");
String payload = "{operands:[]}";
HttpURLConnection linec = (HttpURLConnection)line_api_url.openConnection();
linec.setDoInput(true);
linec.setDoOutput(true);
linec.setRequestMethod("POST");
linec.setRequestProperty("Content-Type", "application/json");
linec.setRequestProperty("Authorization", "Bearer "+access_token);
OutputStreamWriter writer = new OutputStreamWriter(linec.getOutputStream(), "UTF-8");
writer.write(payload);
BufferedReader in = new BufferedReader(
new InputStreamReader(
linec.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
Mais j'obtiens une erreur en dessous:
[[email protected], 5514]
Java.io.IOException: Server returned HTTP response code: 400 for URL: https://ads.line.me/api/v1.0/authority_delegations/get at Sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.Java:1840) at Sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.Java:1441) at Sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.Java:254) at AuthorityDelegation.send_deligation_request(AuthorityDelegation.Java:66) at AuthorityDelegation.read_csv(AuthorityDelegation.Java:36) at AuthorityDelegation.main(AuthorityDelegation.Java:20)
Quelqu'un pourrait-il m'aider s'il vous plaît?
Le code HTTP 400 signifie une mauvaise demande.
Je ne peux pas accéder au point de terminaison que vous avez partagé, mais voici une API REST en ligne gratuite que j'utilise pour illustrer ..
curl -X POST \
https://jsonplaceholder.typicode.com/posts \
-H 'cache-control: no-cache' \
-H 'postman-token: 907bbf75-73f5-703f-c8b6-3e1cd674ebf7' \
-d '{
"userId": 100,
"id": 100,
"title": "main title",
"body": "main body"
}'
-H
= en-têtes -d
= donnéesExemple de cycle:
[/c]$ curl -X POST \
> https://jsonplaceholder.typicode.com/posts \
> -H 'cache-control: no-cache' \
> -H 'postman-token: 907bbf75-73f5-703f-c8b6-3e1cd674ebf7' \
> -d '{
> "userId": 100,
> "id": 100,
> "title": "main title",
> "body": "main body"
> }'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 258 100 150 100 108 147 106 0:00:01 0:00:01 --:--:-- 192{
"{\n \"userId\": 100,\n \"id\": 100,\n \"title\": \"main title\",\n \"body\": \"main body\"\n }": "",
"id": 101
}
Le code Java pour le même est comme suit:
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/octet-stream");
RequestBody body = RequestBody.create(mediaType, "{\n \"userId\": 100,\n \"id\": 100,\n \"title\": \"main title\",\n \"body\": \"main body\"\n }");
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts")
.post(body)
.addHeader("cache-control", "no-cache")
.addHeader("postman-token", "e11ce033-931a-0419-4903-ab860261a91a")
.build();
Response response = client.newCall(request).execute();
Un autre exemple d’appel REST POST avec des données.
User user = new User();
user.setFirstName("john");
user.setLastName("Maclane");
ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget target = client.target("URL");
Response response = target.request().post(Entity.entity(user, <MEDIATYPE>));
//Read output in string format
System.out.println(response.getStatus());
response.close();
Voici à quoi ressemble votre code lorsque je le mets à jour avec mes points de terminaison et mes données utiles.
import Java.io.BufferedReader;
import Java.io.InputStreamReader;
import Java.io.OutputStreamWriter;
import Java.net.HttpURLConnection;
import Java.net.URL;
import Java.util.Arrays;
public class TestClass {
public static final String POST_URL = "https://jsonplaceholder.typicode.com/posts";
public static final String POST_DATA = "{\"userId\": 100,\"id\": 100,\"title\": \"main title\",\"body\": \"main body\"}";
public static void main(String[] args) throws Exception {
String[] details = {};
System.out.println(Arrays.toString(details));
URL line_api_url = new URL(POST_URL);
String payload = POST_DATA;
HttpURLConnection linec = (HttpURLConnection) line_api_url
.openConnection();
linec.setDoInput(true);
linec.setDoOutput(true);
linec.setRequestMethod("POST");
linec.setRequestProperty("Content-Type", "application/json");
linec.setRequestProperty("Authorization", "Bearer "
+ "1djCb/mXV+KtryMxr6i1bXw");
OutputStreamWriter writer = new OutputStreamWriter(
linec.getOutputStream(), "UTF-8");
writer.write(payload);
BufferedReader in = new BufferedReader(new InputStreamReader(
linec.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
En résumé, consultez la documentation de l'API et assurez-vous que le format de la charge de la demande est correct, car 400 signifie BAD REQUEST.
C’est une erreur 400, ce qui signifie Bad Request. S'il vous plaît vérifier ce lien ci-dessous.
Comment trouver les spécificités de l'erreur 400 Http en Java?
Merci à tous pour votre aide ... J'ai utilisé le code ci-dessous pour le faire fonctionner.
public JSONObject send_post() {
HttpClient httpClient = HttpClientBuilder.create().build();
JSONObject jsonObject = null;
try {
HttpPost request = new HttpPost(this.URL + this.object_type + this.request_type);
StringEntity params = null;
if (this.request_type.equals("/get")) {
params = new StringEntity("{\"accountId\":\"5514\"}");
} else if (this.request_type.equals("/set")) {
// params = new
// StringEntity("{\"accountId\":\"5514\",\"operands\":[{\"id\":40151,\"name\":\"ddddd\"}]}");
String output = String.format("{\"accountId\":\"5514\",\"operands\":[{\"id\":%s,\"name\":\"%s\"}]}",
this.params[0], this.params[1]);
if (this.params[1].equals("OptimizationOff")) {
output = String.format(
"{\"accountId\":\"5514\",\"operands\":[{\"id\":%s,\"bidOptimizationType\":\"%s\"}]}",
this.params[0], "NONE");
} else if (this.params[1].equals("OptimizationOn")) {
output = String.format(
"{\"accountId\":\"5514\",\"operands\":[{\"id\":%s,\"bidOptimizationType\":\"%s\",\"bidOptimizationGoal\":\"%s\"}]}",
this.params[0], this.params[2], this.params[3]);
}
if (object_type.equals("/ads")) {
output = String.format("{\"accountId\":\"5514\",\"operands\":[{\"id\":%s,\"bidAmount\":\"%s\"}]}",
this.params[0], this.params[1]);
}
params = new StringEntity(output);
}
request.addHeader("content-type", "application/json");
request.addHeader("Authorization", "Bearer " + this.Access_Token);
request.setEntity(params);
HttpResponse response = httpClient.execute(request);
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer result = new StringBuffer();
String line = "";
while ((line = rd.readLine()) != null) {
result.append(line);
}
System.out.println("API Resonse :"+result.toString());
jsonObject = new JSONObject(result.toString());
} catch (Exception ex) {
ex.printStackTrace();
} finally {
}
return jsonObject;
}
OutputStreamWriter mettra la sortie en mémoire tampon. Après cette ligne dans votre code:
writer.write(payload);
ajouter cette ligne
writer.flush();
Je m'attendrais à ce que cela règle votre problème.
Bien que cela ne vous aide peut-être pas précisément avec un appel HTTP existant utilisant la variable HttpURLConnection
traditionnelle. Un moyen intéressant d’y parvenir récemment consiste à utiliser HTTP/2 Client et à essayer le dernier module d’incubateur introduit jdk.incubator.http
de Java 9.
Un moyen facile (rapide) de se moquer d'un appel POST
en utilisant le même est le suivant:
Créez un Java-module dans votre projet et définissez module-info.Java
comme suit:
module http.trial {
requires jdk.incubator.httpclient;
}
Dans le module, créez un package et une classe nommée HttpPost
avec le contenu suivant:
import jdk.incubator.http.HttpRequest;
import jdk.incubator.http.HttpClient;
import jdk.incubator.http.HttpResponse;
import Java.io.IOException;
import Java.net.URI;
import Java.net.URISyntaxException;
public class HttpPost {
public static void main(String[] args) {
// Request builder
URI uri = null;
try {
uri = new URI("https://ads.line.me/api/v1.0/authority_delegations/get");
} catch (URISyntaxException e) {
e.printStackTrace();
}
HttpRequest.BodyProcessor bodyProcessor = HttpRequest.BodyProcessor.fromString("{\"operands\":[]}");
HttpRequest request = HttpRequest.newBuilder().uri(uri)
.header("Content-Type", "application/json")
.header("Authorization", "Bearer 1djCb/mXV+KtryMxr6i1bXw")
.POST(bodyProcessor)
.build();
// Client
HttpClient httpClient = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.ALWAYS).build();
System.out.println(httpClient.version());
// Response builder
HttpResponse response = null;
try {
response = httpClient.send(request, HttpResponse.BodyHandler.asString());
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
System.out.println("StatusCode = " + response.statusCode());
System.out.println("Response = " + response.body().toString());
}
}