Spring REST 컨트롤러에서 HTTP 헤더 읽기
Spring 기반 REST API에서 HTTP 헤더를 읽으려고 합니다.이거 따라했어요.하지만 이런 오류가 발생합니다.
클래스 java.lang에 대한 메시지 본문 판독기를 찾을 수 없습니다. 문자열,
【종류 :】 : 응용프로그램옥텟스트림/유형용
저는 자바와 스프링이 처음이라 잘 모르겠어요.
통화 내용은 이렇습니다.
@WebService(serviceName = "common")
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public interface CommonApiService {
@GET
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
@Path("/data")
public ResponseEntity<Data> getData(@RequestHeader(value="User-Agent") String userAgent, @DefaultValue ("") @QueryParam("ID") String id);
}
는 를 .@Context
: HTTPEader는null
이 경우에는
HTTP 헤더에서 값을 가져오는 방법?
오류가 발생한 경우 요청과 관련이 없는 것 같습니다.머리말.
그리고 당신은 JAX-RS와 Spring REST 서비스를 혼동하고 있는 것 같습니다. 당신의 메소드 서명은 다음과 같습니다.
@RequestMapping(produces = "application/json", method = RequestMethod.GET, value = "data")
@ResponseBody
public ResponseEntity<Data> getData(@RequestHeader(value="User-Agent") String userAgent, @RequestParam(value = "ID", defaultValue = "") String id) {
// your code goes here
}
그리고 REST 클래스에는 다음과 같은 주석이 있어야 합니다.
@Controller
@RequestMapping("/rest/")
실제 질문과 관련하여 HTTP 헤더를 얻는 또 다른 방법은 HttpServletRequest를 메서드에 삽입한 후 원하는 헤더를 가져오는 것입니다.
예:
@RequestMapping(produces = "application/json", method = RequestMethod.GET, value = "data")
@ResponseBody
public ResponseEntity<Data> getData(HttpServletRequest request, @RequestParam(value = "ID", defaultValue = "") String id) {
String userAgent = request.getHeader("user-agent");
}
Spring이 당신을 위해 마법을 부리기 때문에 HttpServletRequest 주입에 대해 걱정하지 마세요.
컨트롤러의 REST 헤더를 읽는 방법을 예로 들어 보겠습니다.컨트롤러는 읽을 필요가 있는 데이터가 있는 경우에만 application/json을 요청 유형으로 승인합니다.Spring이 어떻게 처리해야 할지 모르는 애플리케이션/옥텟 스트림이 당신에게 있다는 것이 당신의 문제라고 생각합니다.
일반적으로 컨트롤러는 다음과 같습니다.
@Controller
public class FooController {
@Autowired
private DataService dataService;
@RequestMapping(value="/foo/", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<Data> getData(@RequestHeader String dataId){
return ResponseEntity.newInstance(dataService.getData(dataId);
}
지금 여기 배경에 많은 코드들이 있어서 제가 그것을 분해해 드리겠습니다.
ResponseEntity는 모든 컨트롤러가 반환하는 사용자 지정 개체입니다.새 인스턴스를 만들 수 있는 정적 팩토리가 포함되어 있습니다.My Data Service는 표준 서비스 클래스입니다.
마법은 JSON과 함께 작업하기 때문에 Spring에게 HttpRequest 개체를 매핑하기 위해 Jackson을 사용하도록 지시해야 사용자가 무엇을 다루고 있는지 알 수 있습니다.
당신은 이것을 당신의 내부에 지정함으로써 이것을 합니다.<mvc:annotation-driven>
의 블록
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="objectMapper" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
는 ObjectMapper의 일 뿐입니다.com.fasterxml.jackson.databind.ObjectMapper
잭슨이 JSON의 요청을 객체에 매핑하는 데 사용하는 방법입니다.
Octet-Stream을 개체로 읽을 수 있는 맵퍼나 Spring이 처리할 수 있는 맵퍼를 지정하지 않았기 때문에 예외가 발생하는 것 같습니다.만약 당신이 파일 업로드를 하려고 한다면, 그것은 완전히 다른 것입니다.
그래서 내 컨트롤러로 전송되는 내 요청은 단순히 이와 같은 것처럼 보이는 것입니다.dataId
.
이를 요청 매개 변수로 변경하여 사용하려는 경우@RequestParam String dataId
요청에서 ID를 읽는다면 다음과 유사합니다.
contactId : {"fooId"}
이 요청 매개변수는 원하는 만큼 복잡할 수 있습니다.전체 개체를 JSON으로 직렬화하여 요청 매개 변수로 전송하면 Spring이 JSON을 사용할 수 있는 Java Object로 다시 직렬화합니다.
컨트롤러에서의 예:
@RequestMapping(value = "/penguin Details/", method = RequestMethod.GET)
@ResponseBody
public DataProcessingResponseDTO<Pengin> getPenguinDetailsFromList(
@RequestParam DataProcessingRequestDTO jsonPenguinRequestDTO)
보낸 요청:
jsonPengiunRequestDTO: {
"draw": 1,
"columns": [
{
"data": {
"_": "toAddress",
"header": "toAddress"
},
"name": "toAddress",
"searchable": true,
"orderable": true,
"search": {
"value": "",
"regex": false
}
},
{
"data": {
"_": "fromAddress",
"header": "fromAddress"
},
"name": "fromAddress",
"searchable": true,
"orderable": true,
"search": {
"value": "",
"regex": false
}
},
{
"data": {
"_": "customerCampaignId",
"header": "customerCampaignId"
},
"name": "customerCampaignId",
"searchable": true,
"orderable": true,
"search": {
"value": "",
"regex": false
}
},
{
"data": {
"_": "penguinId",
"header": "penguinId"
},
"name": "penguinId",
"searchable": false,
"orderable": true,
"search": {
"value": "",
"regex": false
}
},
{
"data": {
"_": "validpenguin",
"header": "validpenguin"
},
"name": "validpenguin",
"searchable": true,
"orderable": true,
"search": {
"value": "",
"regex": false
}
},
{
"data": {
"_": "",
"header": ""
},
"name": "",
"searchable": false,
"orderable": false,
"search": {
"value": "",
"regex": false
}
}
],
"order": [
{
"column": 0,
"dir": "asc"
}
],
"start": 0,
"length": 10,
"search": {
"value": "",
"regex": false
},
"objectId": "30"
}
데이터 처리 요청에 자동으로 다시 직렬화됩니다.컨트롤러에 제공되기 전에 사용할 수 있는 DTO 개체입니다.
보다시피, 코드를 한 줄도 쓸 필요 없이 JSON에서 객체로 데이터를 직렬화할 수 있는 강력한 기능을 제공합니다.이렇게 하면 됩니다.@RequestParam
그리고.@RequestBody
이를 통해 매개 변수 내부의 JSON에 액세스하거나 각각 본문을 요청할 수 있습니다.
이제 구체적인 예시가 나왔으니 요청 유형을 다음으로 변경하면 문제가 없을 것입니다.application/json
.
대신에.HttpServletRequest
객체는 모든 메소드에서 생성자를 통해 자동 입력되어 컨트롤러의 컨텍스트에 유지됩니다.그러면 컨트롤러의 모든 방법에서 액세스할 수 있습니다.
public class OAuth2ClientController {
@Autowired
private OAuth2ClientService oAuth2ClientService;
private HttpServletRequest request;
@Autowired
public OAuth2ClientController(HttpServletRequest request) {
this.request = request;
}
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<String> createClient(@RequestBody OAuth2Client client) {
System.out.println(request.getRequestURI());
System.out.println(request.getHeader("Content-Type"));
return ResponseEntity.ok();
}
}
언급URL : https://stackoverflow.com/questions/28209242/reading-http-headers-in-a-spring-rest-controller
'programing' 카테고리의 다른 글
javascript 작성 날짜(년, 월, 일) (0) | 2023.09.18 |
---|---|
Google 차트에서 패딩 또는 여백 제거 (0) | 2023.09.18 |
MariaDB: 세미콜론으로 구분된 문자열을 분할하여 평균값 계산 (0) | 2023.09.18 |
make (Linux)와 nmake (Windows)에 동일한 make 파일 사용 (0) | 2023.09.18 |
연락처 양식 7 - php 실행 불가 (0) | 2023.09.18 |