2017-10-16 5 views
0

私はSpringフレームワークには新しく、他の人が使用するためのAPIを作成しようとしました。HTTP POSTの通知

この私のコントローラクラスに

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); 
} 

を方法以下

// -------------------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); 
} 

レポートオブジェクトを作成するために、他のコード例でGETされそれを私のAPIに送ってください。

  • 誰かがレポートを作成し、POST URLを経由して私にそれを送信すると、私のPOSTメソッドは、します:次が可能かどうか、このような状況にアプローチする方法があるかどうか、私は疑問に思って

    // 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()); 
        } 
    

    新しいレポートエントリが作成されたことを自動的に検出できるようにして、HTML/JSPページ(ポップアップウィンドウなど)に通知を送信します。

更新

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

あなたはアプローチを選択する必要があります。それぞれ長所/短所:Option1。 HTMLは結果をプールし続けます。オプション2。ウェブソケットを使用してください。 – Rafa

+0

websocketが使用されている場合、通知はリアルタイムで行われますが、連続プーリング儀式の場合はそうではありませんか? –

+0

が正しい。また、プーリングする方が実装が簡単ですが、サーバー側に余分な負荷がかかる可能性があります – Rafa

答えて

0

一般に、このようなタクはクライアントに委任されます。私。クライアントは、関心のある変更をサーバーにポーリングし、検出されるとクライアントはそれに応じて反応します。最も古い方法は、ページ全体を強制的に特定の頻度でリフレッシュさせるタグをHTMLに追加することでした。これは、ページがサーバーに要求を送信し、表示する更新されたページを受け取ることを意味します。当時、ページの一部を更新するあらゆる種類のフレームワークがあります。最初のものの1つはAjax、次にDHTMLなどでした。私はクライアント側progrqammerではない。しかし、コンセプトがある限り、そのような仕事は通常クライアントに与えられます