後端透傳代理實作
參數設計
- 增加的一個target參數,用于表明需要代理的目标位址
- 其他query參數透傳
- header參數透傳
代碼實作
@RestController
public class HomeController {
@GetMapping("/backend/proxy")
public ResponseEntity<?> proxy(@RequestParam MultiValueMap<String, String> params, @RequestHeader MultiValueMap<String, String> heads) {
if (!params.containsKey("target")) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("{\"message\": \"target param is required\"}");
}
String url = params.remove("target").get(0);
System.out.println("url: " + url);
URI uri;
try {
uri = new URI(url);
} catch (URISyntaxException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("{\"message\": \"target value invalid\"}");
}
String result = WebClient.create().get().uri(uriBuilder -> uriBuilder.scheme(uri.getScheme())
.host(uri.getHost()).path(uri.getPath()).queryParams(params).build())
.headers(headers -> headers.addAll(heads)).retrieve()
.bodyToMono(String.class).block();
return ResponseEntity.ok(result);
}
}