1

I try to POST an Object to https://api.aftership.com/v4 but got a problem bellow:

org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:79) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:97) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:777) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:735) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:669) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:578) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
at api.aftership.tracking.TrackingController.addTracking(TrackingController.java:70) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_151]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_151]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_151]
at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_151]

My source code:

@Entity

@JsonIgnoreProperties(ignoreUnknown = true)
public class Trackings {
private String tracking_number;
public Trackings() {

}
public Trackings(String tracking_number) {
    super();
    this.tracking_number = tracking_number;
}

@HeaderConfig

public class HttpHeaderConfigs {
private static final HttpHeaders headers = new HttpHeaders();

public HttpHeaderConfigs() {

}

public static HttpHeaders HttpHeaderConfig() {
    headers.set("aftership-api-key", "e7f28250-889d-48ce-80a1-52f4d16XXXX");
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    return headers;
}

public HttpHeaders getHeaders() {
    return headers;
}
}

@Function to POST

@RequestMapping("/trackings/add")
public void addTracking() {
    final String uri = "https://api.aftership.com/v4/trackings";
    Trackings tracking = new Trackings();
    tracking.setTracking_number("783518514479");
    RestTemplate restTemplate = new RestTemplate();
    HttpEntity<Trackings> entity = new HttpEntity<Trackings>(tracking, HttpHeaderConfig());
    ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.POST, entity, String.class);
    System.out.println(response.getBody());
}

And my result I get when enter http://localhost:8080/trackings/add is:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Sat Nov 24 23:20:59 ICT 2018
There was an unexpected error (type=Internal Server Error, status=500).
400 Bad Request

I tried to solve it. Please help me fix it!!! <3

An Van Nguyen
  • 13
  • 1
  • 3
  • 10
  • Can you make Spring log what JSON it is sending? I think you are sending the wrong JSON. – Robin Green Nov 24 '18 at 16:54
  • How can I get Spring log? I send it by object. – An Van Nguyen Nov 24 '18 at 16:59
  • I try @PostMapping("/trackings/add") and get "java.util.NoSuchElementException: No value present" – An Van Nguyen Nov 24 '18 at 17:01
  • See https://stackoverflow.com/questions/7952154/spring-resttemplate-how-to-enable-full-debugging-logging-of-requests-responses – Robin Green Nov 24 '18 at 17:01
  • Then you can change your mapping something like this @RequestMapping(path="/trackings/add",method=RequestMethod.Post). you have miss-configured mapping – lucid Nov 24 '18 at 17:03
  • @PostMapping is available from spring 4.3 onwards so if you want to use post mapping upgrade your spring version to 4.3.+ or you can simply use the approach lucid suggested i.e @RequestMapping(path="/trackings/add",method=RequestMethod.Post) – Praveen Mulchandani Nov 24 '18 at 17:09
  • @RequestMapping(path="/trackings/add",method=RequestMethod.Post) return No value present – An Van Nguyen Nov 24 '18 at 17:15
  • I used LoggingRequestInterceptor() is refer by by Robin and I got this "I/O error on POST request for "https://api.aftership.com/v4/trackings": Server returned HTTP response code: 400 for URL: https://api.aftership.com/v4/trackings; nested exception is java.io.IOException: Server returned HTTP response code: 400 for URL: https://api.aftership.com/v4/trackings" – An Van Nguyen Nov 24 '18 at 17:17

1 Answers1

0

[Aftership API][1] You need to serialize Trackings JSON object and add its get and set methods:

@JsonIgnoreProperties(ignoreUnknown = true)
public class MainTracking implements Serializable {

    private Tracking Tracking;

    public String getTracking() {
        return tracking;
    }

    public void setTracking(Tracking tracking) {
        this.tracking = tracking;
    }
}



@JsonIgnoreProperties(ignoreUnknown = true)
public class Tracking implements Serializable {

    private String tracking_number;

    public Tracking() {
    }    

    public Tracking(String tracking_number) {
        setTracking_number(tracking_number);
    }    

    public String getTracking_number() {
        return tracking_number;
    }

    public void setTracking_number(String tracking_number) {
        this.tracking_number = tracking_number;
    }
}

And update on your Controller:

@RequestMapping("/trackings/add")
public void addTracking() {
    final String uri = "https://api.aftership.com/v4/trackings";
    MainTracking mainTracking = new MainTracking();
    Tracking tracking = new Tracking();
    tracking.setTracking_number("7835112328"); // Be careful with     this number has generated different every time.!!
    mainTracking.setTracking(tracking);

    RestTemplate restTemplate = new RestTemplate();
    HttpEntity<MainTracking> entity = new HttpEntity<MainTracking>(mainTracking, HttpHeaderConfig());

    ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.POST, entity, String.class);
    System.out.println(response.getBody());
 }
Jonathan JOhx
  • 5,784
  • 2
  • 17
  • 33