如何从 rest 客户端调用 Spring STOMP web socket 方法
How to invoke Spring STOMP web socket method from rest client
我的 Java 拦截所有调用的代码 URL /hello (Back) :
@Controller
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
Thread.sleep(3000); // simulated delay
return new Greeting("Hello, " + message.getName() + "!");
}
}
我的Java调用方法greeting()的脚本代码(前):
function sendName() {
var name = document.getElementById('name').value;
stompClient.send("/app/hello", {}, JSON.stringify({ 'name': name }));
}
有人可以告诉我如何从 Rest 客户端调用 @MessageMapping("/hello") 方法吗?我可以通过 Java 脚本代码进行连接,甚至可以得到响应并将其显示在 HTML 中。
但是我有一个要求,外部系统(通过 rest 调用)应该调用这个 @MessageMapping("/hello"),然后应用程序(后端)应该向 HTML 发送响应。
我尝试从 chrome rest 客户端插件调用 @MessageMapping("/hello") 方法但未成功。
请告诉我如何调用此方法?
提前致谢
由于这些不是通过 HTTP 的典型 REST 调用,而是通过 websocket 发送的 STOMP 消息,因此您应该使用 the dedicated STOMP client provided by Spring。
@RestController
@RequestMapping("/rest")
public class GreetingController {
private SimpMessagingTemplate template;
@Autowired
public GreetingController(SimpMessagingTemplate template) {
this.template = template;
}
@RequestMapping(value="/hello", method=RequestMethod.POST)
public String greeting(@RequestBody HelloMessage message) throws Exception {
this.template.convertAndSend("/topic/greetings", message.getName()+"asgdasd");
return "hello";
}
}
使用 SimpMessagingTemplate 我实现了这个和我的 javascript 代码使用 sockjs 将订阅 /topic/greetings 是
<script type="text/javascript">
var stompClient = null;
function setConnected(connected) {
document.getElementById('connect').disabled = connected;
document.getElementById('disconnect').disabled = !connected;
document.getElementById('conversationDiv').style.visibility = connected ? 'visible' : 'hidden';
document.getElementById('response').innerHTML = '';
}
function connect() {
var socket = new SockJS('/hello');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/greetings', function(greeting){
alert("inside subscribe");
alert(greeting);
showGreeting(JSON.parse(greeting.body).content);
});
});
}
function disconnect() {
if (stompClient != null) {
stompClient.disconnect();
}
setConnected(false);
console.log("Disconnected");
}
/* function sendName() {
var name = document.getElementById('name').value;
stompClient.send("/app/hello", {}, JSON.stringify({ 'name': name }));
} */
function showGreeting(message) {
var response = document.getElementById('response');
var p = document.createElement('p');
p.style.wordWrap = 'break-word';
p.appendChild(document.createTextNode(message));
response.appendChild(p);
}
</script>
我的 Java 拦截所有调用的代码 URL /hello (Back) :
@Controller
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
Thread.sleep(3000); // simulated delay
return new Greeting("Hello, " + message.getName() + "!");
}
}
我的Java调用方法greeting()的脚本代码(前):
function sendName() {
var name = document.getElementById('name').value;
stompClient.send("/app/hello", {}, JSON.stringify({ 'name': name }));
}
有人可以告诉我如何从 Rest 客户端调用 @MessageMapping("/hello") 方法吗?我可以通过 Java 脚本代码进行连接,甚至可以得到响应并将其显示在 HTML 中。 但是我有一个要求,外部系统(通过 rest 调用)应该调用这个 @MessageMapping("/hello"),然后应用程序(后端)应该向 HTML 发送响应。 我尝试从 chrome rest 客户端插件调用 @MessageMapping("/hello") 方法但未成功。
请告诉我如何调用此方法? 提前致谢
由于这些不是通过 HTTP 的典型 REST 调用,而是通过 websocket 发送的 STOMP 消息,因此您应该使用 the dedicated STOMP client provided by Spring。
@RestController
@RequestMapping("/rest")
public class GreetingController {
private SimpMessagingTemplate template;
@Autowired
public GreetingController(SimpMessagingTemplate template) {
this.template = template;
}
@RequestMapping(value="/hello", method=RequestMethod.POST)
public String greeting(@RequestBody HelloMessage message) throws Exception {
this.template.convertAndSend("/topic/greetings", message.getName()+"asgdasd");
return "hello";
}
}
使用 SimpMessagingTemplate 我实现了这个和我的 javascript 代码使用 sockjs 将订阅 /topic/greetings 是
<script type="text/javascript">
var stompClient = null;
function setConnected(connected) {
document.getElementById('connect').disabled = connected;
document.getElementById('disconnect').disabled = !connected;
document.getElementById('conversationDiv').style.visibility = connected ? 'visible' : 'hidden';
document.getElementById('response').innerHTML = '';
}
function connect() {
var socket = new SockJS('/hello');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/greetings', function(greeting){
alert("inside subscribe");
alert(greeting);
showGreeting(JSON.parse(greeting.body).content);
});
});
}
function disconnect() {
if (stompClient != null) {
stompClient.disconnect();
}
setConnected(false);
console.log("Disconnected");
}
/* function sendName() {
var name = document.getElementById('name').value;
stompClient.send("/app/hello", {}, JSON.stringify({ 'name': name }));
} */
function showGreeting(message) {
var response = document.getElementById('response');
var p = document.createElement('p');
p.style.wordWrap = 'break-word';
p.appendChild(document.createTextNode(message));
response.appendChild(p);
}
</script>