2016-08-08 34 views
2

ich die folgende Situation:Vorwärts JSON-POST-Anfrage von einem REST-API auf einem anderen

Mein REST-API ein:

@RestController 
@RequestMapping("/controller1") 
Public Class Controller1{ 
    @RequestMapping(method = RequestMethod.POST) 
    public void process(@RequestBody String jsonString) throws InterruptedException, ExecutionException 
    { 
     ............ 
    } 
} 

JSON-POST-Anfrage, Anfrage1, für die REST-API (Controller1):

{ 
    "key1":"value1", 
    "key2":"value2" 
} 

Meine REST API zwei:

@RestController 
@RequestMapping("/controller2") 
Public Class Controller2{ 
    @RequestMapping(method = RequestMethod.POST) 
    public void process(@RequestBody String jsonString) throws InterruptedException, ExecutionException 
    { 
     ............ 
    } 
} 

JSON Anfrage, request2, für die REST-API (Controller2):

{ 
    "key1":"value1", 
    "key2":"value2", 
    "key3":"value3" 
} 

ich mehrere solcher "primitive" Wünsche haben. Nun, ich bin ein JSON-Anfrage erwartet, nennen wir es request3, die eine Kombination von solchen „primitiven“ queries- ist etwas, das wie unten aussieht:

{ 
    { 
     "requestType":"requestType1", 
     "request":"[{"key1":"value1","key2":"value2"}]" 
    }, 
    { 
     "requestType":"requestType2", 
     "request":"[{"key1":"value1","key2":"value2","key3":"value3"}]" 
    } 
} 

Hier, ich brauche die entsprechende API (eine auslösen oder zwei) nach Identifizierung des Abfragetyps. Ich möchte wissen, wie ich die Anfrage an die entsprechende REST-API weiterleiten kann. Ich schrieb die REST API für request3 wie folgt:

@RestController 
@RequestMapping("/controller3") 
Public Class Controller3{ 
    @RequestMapping(method = RequestMethod.POST) 
    public void process(@RequestBody String jsonString) throws InterruptedException, ExecutionException 
    { 
     .................. 
     .................. 

     switch(request){ 
     case request1: //how to call REST API 1? 
     case request2: //how to call REST API 2? 
     } 
    } 
} 

Antwort

2

Sie können eine Hilfsmethode aufrufen, die eine Anfrage an den Controller sendet, indem Sie Restvorlage wie unten verwenden. Da Sie die POST-Methode verwenden, können Sie Parameter einfach mit der Restvorlage senden. Möglicherweise müssen Sie diesen Code ein wenig bearbeiten, um in Ihrer Umgebung mit exakter Syntax zu arbeiten.

@RequestMapping(value= "/controller3" method = RequestMethod.POST) 
public @ResponseBody void process(@RequestBody String jsonString){ 

    String request = requestType //Get the request type from request 
    String url = ""; 
    MultiValueMap<String, String> params= null; 
    switch(request){ 
     case request1: //how to call REST API 1? 
      url = "/controller1"; 
      params = request1param //Get the parameter map from request 
     case request2: //how to call REST API 2? 
      url = "/controller2"; 
      params = request2Param //Get the parameter map from request 
     } 

     //Now call the method with parameters 
     getRESTResponse(url, params); 

    } 

    private String getRESTResponse(String url, MultiValueMap<String, String> params){ 
    RestTemplate template = new RestTemplate(); 
    HttpEntity<MultiValueMap<String, String>> requestEntity= 
      new HttpEntity<MultiValueMap<String, String>>(params); 
    String response = ""; 
    try{ 
     String responseEntity = template.exchange(url, HttpMethod.POST, requestEntity, String.class); 
     response = responseEntity.getBody(); 
    } 
    catch(Exception e){ 
     response = e.getMessage(); 
    } 
    return response; 
    } 

Redirect from one controller method to another controller method

Alternativ können Sie auch den Rest Methode aufrufen Rast Vorlage mit Spring MVC - Calling a rest service from inside another rest service

Sie können feststellen, wie POST-Anfrage mit params in diesem Beitrag https://techie-mixture.blogspot.com/2016/07/spring-rest-template-sending-post.html

+0

Vielen Dank für die schicken antworte @TharsanSivakumar. Aber wie sende ich nur die erforderliche Anforderungszeichenfolge in der sendRedirect-Methode an die Ziel-REST-API, nachdem sie aus der Gesamtanforderung extrahiert wurde? Bitte beachten Sie, dass die REST-API-Zielmethode die folgende Signatur hat: @RequestMapping (method = RequestMethod.POST) public void process (@RequestBody String jsonString) –

+0

Ich habe meine Antwort bearbeitet, anstatt nur umzuleiten, Sie können die Spring's Rest-Vorlage verwenden die Anfrage mit Parametern leicht –