programing

Spring REST 컨트롤러에서 HTTP 헤더 읽기

muds 2023. 9. 18. 22:45
반응형

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

반응형