I want to make API call similar to below curl command:
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
What I am trying
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(); }
But I am getting below error:
[naofumi.haida@torchlight.co.jp, 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)
Could somebody please help me?
5 Answers
Answers 1
HTTP code 400 means a BAD REQUEST.
I can't access the endpoint you have shared but here is free online REST API which I am using for demonstrating ..
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
= headers-d
= data
Sample Run:
[/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 }
Java Code for the same is as follows:
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();
Another example of calling REST POST call with data ..
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();
Here is the what your code looks like when I update it with my endpoints and payload.
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(); } }
In nutshell, check the API documentation and ensure the request payload is of correct format as 400 means BAD REQUEST.
Answers 2
It’s a 400 error, which means Bad Request. Please check this link below.
Answers 3
OutputStreamWriter will buffer the output. After this line in your code:
writer.write(payload);
add this line
writer.flush();
I would expect that to fix your problem.
Answers 4
Though this may not help you with precisely an existing HTTP call using the traditional HttpURLConnection
. Yet an interesting way to achieve this in recent times is to use HTTP/2 Client and try out the latest introduced incubator module jdk.incubator.http
form Java 9.
An easy way(quick-start) of mocking a POST
call using the same is as follows :
Create a java-module within your project and define
module-info.java
as:module http.trial { requires jdk.incubator.httpclient; }
Within the module create a package and a class named
HttpPost
with following content: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()); } }
Answers 5
Thanks everyone for your help. I used below code to make it work.
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; }
0 comments:
Post a Comment