Wednesday, September 27, 2017

Java: How to make API call with data?

Leave a Comment

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.

How to find out specifics of 400 Http error in Java?

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 :

  1. Create a within your project and define module-info.java as:

    module http.trial {      requires jdk.incubator.httpclient; } 
  2. 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;  } 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment