2017-10-16 8 views
0

Je suis nouveau à Spring framework et j'ai essayé de créer une API pour que d'autres puissent l'utiliser.Notification pour HTTP POST

C'est dans ma classe de contrôleur

méthode POST

// -------------------Create a Report------------------------------------------- 

@RequestMapping(value = "/report/", method = RequestMethod.POST) 
public ResponseEntity<?> createReport(@RequestBody Report report, UriComponentsBuilder ucBuilder) { 
    logger.info("Creating Report : {}", report); 

    if (reportRepository.isReportExist(report)) { 
     logger.error("Unable to create. A report with name {} already exist", report.getCrisisID()); 
     return new ResponseEntity(new CustomErrorType("Unable to create. A Report with crisisID " + 
     report.getCrisisID() + " already exist."),HttpStatus.CONFLICT); 
    } 
    reportRepository.saveReport(report); 

    HttpHeaders headers = new HttpHeaders(); 
    headers.setLocation(ucBuilder.path("/api/report/{crisisID}").buildAndExpand(report.getCrisisID()).toUri()); 
    return new ResponseEntity<String>(headers, HttpStatus.CREATED); 
} 

méthode GET

// -------------------Retrieve All Reports--------------------------------------------- 

@RequestMapping(value = "/report/", method = RequestMethod.GET) 
public ResponseEntity<List<Report>> listAllReports() { 
    List<Report> reports = reportRepository.findAllReports(); 
    if (reports.isEmpty()) { 
     return new ResponseEntity(HttpStatus.NO_CONTENT); 
     // You many decide to return HttpStatus.NOT_FOUND 
    } 
    return new ResponseEntity<List<Report>>(reports, HttpStatus.OK); 
} 

Voici le code d'exemple pour d'autres pour créer l'objet du rapport et envoie-le à mon api.

// POST 
    private static void createReport() { 
    System.out.println("Testing create Report API----------"); 

    RestTemplate restTemplate = new RestTemplate(); 
    Report report = new Report(20, "General", 4, "AA1",10000,"crisis details", "1 hour", "COA1", "COA1"); 
    URI uri = restTemplate.postForLocation(REST_SERVICE_URI + "/report/", report, 
      Report.class);System.out.println("Location : "+uri.toASCIIString()); 
    } 

Je me demande si ce qui suit est possible ou s'il y a une façon d'aborder cette situation:

  • Quand quelqu'un crée un rapport et me l'envoie à via l'URL POST, ma méthode EMPLOI PERMANENT être capable de détecter automatiquement qu'une nouvelle entrée de rapport est créée, puis envoie une notification dans ma page HTML/JSP (comme une fenêtre pop-up).

Mise à jour

RestApiController.java

@RestController 
@RequestMapping("/api") 
public class RestApiController { 

    public static final Logger logger = LoggerFactory.getLogger(RestApiController.class); 

    @Autowired 
    ReportRepository reportRepository; //Service which will do all data retrieval/manipulation work 


    // -------------------Create a Report------------------------------------------- 
    @RequestMapping(value = "/report/", method = RequestMethod.POST) 
    @SendTo("/channel/publicreport") 
    public ResponseEntity<?> createReport(@RequestBody Report report, UriComponentsBuilder ucBuilder) { 
     logger.info("Creating Report : {}", report); 

     if (reportRepository.isReportExist(report)) { 
      logger.error("Unable to create. A report with name {} already exist", report.getCrisisID()); 
      return new ResponseEntity(new CustomErrorType("Unable to create. A Report with crisisID " + 
      report.getCrisisID() + " already exist."),HttpStatus.CONFLICT); 
     } 
     reportRepository.saveReport(report); 

     HttpHeaders headers = new HttpHeaders(); 
     headers.setLocation(ucBuilder.path("/api/report/{crisisID}").buildAndExpand(report.getCrisisID()).toUri()); 
     return new ResponseEntity<String>(headers, HttpStatus.CREATED); 
    } 
} 

WebSocketConfig.java

@Configuration 
    @EnableWebSocketMessageBroker 
    public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 

     @Override 
     public void registerStompEndpoints(StompEndpointRegistry registry) { 
      registry.addEndpoint("/chatservice"); 
     } 

     @Override 
     public void configureMessageBroker(MessageBrokerRegistry registry) { 
      registry.setApplicationDestinationPrefixes("/app"); 
      registry.enableSimpleBroker("/channel"); 
     } 
    } 

main.js

'use strict'; 

var stompClient = null; 
var username = null; 

function connectReport(event) { 
    username = "myname"; 

    if(username) { 

     //var socket = new SockJS('/ws'); 
     //stompClient = Stomp.over(socket); 
     stompClient = Stomp.client('ws://localhost:8080/chatservice'); 

     stompClient.connect({}, onConnectedReport, onError); 
    } 
    event.preventDefault(); 
} 

function onConnectedReport() { 
    // Subscribe to the Public Channel 
    stompClient.subscribe('/channel/publicreport',onReportMessageReceived); 
} 
function onError(error) { 
    connectingElement.textContent = 'Could not connect to WebSocket server. Please refresh this page to try again!'; 
    connectingElement.style.color = 'red'; 
} 
function onReportMessageReceived(payload) { 
//Code for pop up window 
} 
window.addEventListener("load", connectReport, true) 
+0

Fist vous devez choisir une approche. Chacun avec des avantages/inconvénients: Option1. HTML conserve la mise en commun des résultats. Option 2. Utilisez des Websockets. – Rafa

+0

Si websocket est utilisé, la notification sera en temps réel mais ce n'est pas le cas pour un rite de pool continu? –

+0

correct. La mise en commun est également plus simple à mettre en œuvre mais peut ajouter une charge supplémentaire au niveau du serveur. – Rafa

Répondre

0

En général, les tâches de ce type sont déléguées au client. C'est à dire. le client interroge le serveur sur les changements qui l'intéressent et, une fois détecté, le client réagit en conséquence. La façon la plus ancienne (qui est maintenant absolue) était d'ajouter une balise en HTML qui oblige la page entière à rafraîchir avec une certaine fréquence ce qui signifie que la page envoie une requête au serveur et reçoit une page mise à jour à afficher. De nos jours, il existe toutes sortes de cadres qui font des mises à jour partielles de la page. L'un des premiers était Ajax, puis DHTML et ainsi de suite. Je ne suis pas un programmeur côté client. Mais dans la mesure où le concept va une telle tâche est généralement donnée au client