Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTP GET Method RFC7231 Compliance Request #557

Closed
jeonghun-app opened this issue Dec 20, 2021 · 7 comments
Closed

HTTP GET Method RFC7231 Compliance Request #557

jeonghun-app opened this issue Dec 20, 2021 · 7 comments
Labels
API enhancement New feature or request

Comments

@jeonghun-app
Copy link

What would you like to be enhanced
: http get 요청 시 ConnectionName등을 body로 제공하는데, 이 부분을 Query Parameter로 변경 요청 드립니다.

Why is this needed
: RFC7231 준수 웹 어플리키이션의 경우 Get 요청 시 Body 삽입 할 수 없습니다.

Proposed solution
: CCMRest.go 부분 중
var req struct {
ConnectionName string
}

==> ConnectionName := c.QueryParam("connectionName")

으로 변경

@jeonghun-app jeonghun-app added the enhancement New feature or request label Dec 20, 2021
@jeonghun-app jeonghun-app changed the title HTTP GET Method RFC7231 준수 요청 HTTP GET Method RFC7231 Compliance Request Dec 20, 2021
@powerkimhub
Copy link
Member

powerkimhub commented Dec 20, 2021

@Jeong-hunSIM (@seokho-son @jihoon-seo @hermitkim1 @sykim-etri )

  • 이슈 감사드립니다.

  • 음... 제안 주신 형식(Query Param)은 초기 버전에서 제공했었던 규격이었습니다만,

  • REST 인자 전달 방식 관련하여 커뮤니티 전체 차원에서 관련된 협의가 있었으며,
    그 후 결정된 사항(GET-Body)으로 수정 및 제공 중에 있습니다.

    • RFC7231 및 그 시점 여러가지 상황을 반영하여 결정된 사항이었습니다만,
    • 올려주신 이슈를 기회로 다시 한번 점검해볼 필요가 있어 보이네요.
  • 혹시, 직접적으로 겪고 계시는 GET-Body 처리가 불가한 사례(환경)을 좀더 설명 해주시면

    • 재 논의 시에 도움이 될 것 같습니다.
    • 가능하시다면 간단 설명 부탁 드리겠습니다.
      ※ 커뮤니티에서는 Swagger 처리시 GET-Body 불가한 사례를 겪었던 사례가 있습니다.

@yunkon-kim
Copy link
Member

yunkon-kim commented Dec 20, 2021

커뮤니티 전체 논의 당시에 없었던 사람으로써 호기심에 간단히 스터디한 내용을 공유드립니다. 😃
(매우 많이 부족한 내용이겠습니다 😅 )

표준 내용을 바탕으로한 제 생각은 🤔, "GET method에서 body 활용하는 것은 선택적"이라고 생각했습니다.
이유는 표준에 "보내지 않아야한다(MUST NOT send xxx)"로 명시되어 있지 않아서 입니다.

A payload within a GET request message has no defined semantics;
sending a payload body on a GET request might cause some existing
implementations to reject the request. - Section 4.3.1 in RFC 7231 (JUNE 2014)

또한, "정의된(Defined) 시멘틱스를 갖지 않음", "몇몇(some) 기존 구현체가 a payload body를 가지 GET 요청을 거절할 가능성(might)이 있다." 정도로 해석되기에 필요시에는 Body를 활용 가능하지 않을까?라고 생각하여 조금 더 찾아보니 아래와 같은 내용을 찾을 수 있었습니다.

"Body는 구현할 수 없음으로 정의하면 오히려 규격을 위반하는 것일 수 있고, 일라스틱서치를 포함한 다양한 애플리케이션에서 GET method에 body값을 포함하는 경우를 볼 수 있다"는 글이 있고요. HTTP GET 메소드와 body

Golang Resty package의 경우 Default는 Disable 이지만, 사용자가 선택할 수 있도록 옵션을 제공하고 있었습니다.
Allow GET request with Payload in Go Resty GitHub

반면, [Wikipedia 메시지 포맷](https://ko.wikipedia.org/wiki/HTTP에서는 요청에 Body가 없음으로 표기되어 있습니다.

몇 가지 자료를 보니 실사례를 기다리는게 좋겠다는 생각이 들어 급하게 마무리하겠습니다 ^^;;;

짧은 소견을 읽어주셔서 감사드립니다!

@powerkimhub
Copy link
Member

@jeonghun-app
Copy link
Author

안녕하세요 답변 감사드립니다.
저의 케이스의 경우는 테스트를 위해 React web 위에서 Axios 모듈을 이용하여 Get요청시 Get Module 자체가 Body를 못 싫게 되어서
부득이하게 카페모카 버전에서 queryparameter로 변경하여 테스트한 경우가 있어서 제안요청 드렸습니다.

@powerkimhub
Copy link
Member

@Jeong-hunSIM

  • 공유 캄사드립니다.
  • 공유 주신 내용도 참고하여 협의 해보도록 하겠습니다.

@powerkimhub
Copy link
Member

@Jeong-hunSIM (@seokho-son @jihoon-seo @hermitkim1 @sykim-etri )

  • 협의 결과 Get-Query Param API 추가(또는 변경)하기로 하였습니다.
  • 제안에 감사드립니다.

[Plan]

  • Backward Compatibility 고려
  • Get-Query Param API 추가

@powerkimhub
Copy link
Member

@Jeong-hunSIM


  • Test Cases 추가 및 시험 완료(by Mock Driver)
    • 추가위치:
      curl -sX GET http://localhost:1024/spider/vpc?ConnectionName=${CONN_CONFIG} -H 'Content-Type: application/json' |json_pp
    • 참고: 자원별 Get-Body and Get-Query Param API 관련 시험 항목
      CONN_CONFIG=mock-config01
      
      curl -sX GET http://localhost:1024/spider/vpc -H 'Content-Type: application/json' -d '{ "ConnectionName": "'${CONN_CONFIG}'"}' |json_pp
      curl -sX GET http://localhost:1024/spider/vpc?ConnectionName=${CONN_CONFIG} -H 'Content-Type: application/json' |json_pp
      curl -sX GET http://localhost:1024/spider/vpc/vpc-01 -H 'Content-Type: application/json' -d '{ "ConnectionName": "'${CONN_CONFIG}'"}' |json_pp
      curl -sX GET http://localhost:1024/spider/vpc/vpc-01?ConnectionName=${CONN_CONFIG} -H 'Content-Type: application/json' |json_pp
      
      curl -sX GET http://localhost:1024/spider/securitygroup -H 'Content-Type: application/json' -d '{ "ConnectionName": "'${CONN_CONFIG}'"}' |json_pp
      curl -sX GET http://localhost:1024/spider/securitygroup?ConnectionName=${CONN_CONFIG} -H 'Content-Type: application/json' |json_pp
      curl -sX GET http://localhost:1024/spider/securitygroup/sg-01 -H 'Content-Type: application/json' -d '{ "ConnectionName": "'${CONN_CONFIG}'"}' |json_pp
      curl -sX GET http://localhost:1024/spider/securitygroup/sg-01?ConnectionName=${CONN_CONFIG} -H 'Content-Type: application/json' |json_pp
      
      curl -sX GET http://localhost:1024/spider/keypair -H 'Content-Type: application/json' -d '{ "ConnectionName": "'${CONN_CONFIG}'"}' |json_pp
      curl -sX GET http://localhost:1024/spider/keypair?ConnectionName=${CONN_CONFIG} -H 'Content-Type: application/json' |json_pp
      curl -sX GET http://localhost:1024/spider/keypair/keypair-01 -H 'Content-Type: application/json' -d '{ "ConnectionName": "'${CONN_CONFIG}'"}' |json_pp
      curl -sX GET http://localhost:1024/spider/keypair/keypair-01?ConnectionName=${CONN_CONFIG} -H 'Content-Type: application/json' |json_pp
      
      curl -sX GET http://localhost:1024/spider/vm -H 'Content-Type: application/json' -d '{ "ConnectionName": "'${CONN_CONFIG}'"}' |json_pp
      curl -sX GET http://localhost:1024/spider/vm?ConnectionName=${CONN_CONFIG} -H 'Content-Type: application/json' |json_pp
      curl -sX GET http://localhost:1024/spider/vm/vm-01 -H 'Content-Type: application/json' -d '{ "ConnectionName": "'${CONN_CONFIG}'"}' |json_pp
      curl -sX GET http://localhost:1024/spider/vm/vm-01?ConnectionName=${CONN_CONFIG} -H 'Content-Type: application/json' |json_pp
      
      curl -sX GET http://localhost:1024/spider/vmstatus -H 'Content-Type: application/json' -d '{ "ConnectionName": "'${CONN_CONFIG}'"}' |json_pp
      curl -sX GET http://localhost:1024/spider/vmstatus?ConnectionName=${CONN_CONFIG} -H 'Content-Type: application/json' |json_pp
      curl -sX GET http://localhost:1024/spider/vmstatus/vm-01 -H 'Content-Type: application/json' -d '{ "ConnectionName": "'${CONN_CONFIG}'"}' |json_pp
      curl -sX GET http://localhost:1024/spider/vmstatus/vm-01?ConnectionName=${CONN_CONFIG} -H 'Content-Type: application/json' |json_pp
      
      curl -sX GET http://localhost:1024/spider/controlvm/vm-01?action=suspend -H 'Content-Type: application/json' -d '{ "ConnectionName": "'${CONN_CONFIG}'"}' |json_pp
      curl -sX GET http://localhost:1024/spider/controlvm/vm-01?'ConnectionName='${CONN_CONFIG}'&action=suspend' -H 'Content-Type: application/json' |json_pp
      
      curl -sX GET http://localhost:1024/spider/controlvm/vm-01?action=resume -H 'Content-Type: application/json' -d '{ "ConnectionName": "'${CONN_CONFIG}'"}' |json_pp
      curl -sX GET http://localhost:1024/spider/controlvm/vm-01?'ConnectionName='${CONN_CONFIG}'&action=resume' -H 'Content-Type: application/json' |json_pp
      
      curl -sX GET http://localhost:1024/spider/controlvm/vm-01?action=reboot -H 'Content-Type: application/json' -d '{ "ConnectionName": "'${CONN_CONFIG}'"}' |json_pp
      curl -sX GET http://localhost:1024/spider/controlvm/vm-01?'ConnectionName='${CONN_CONFIG}'&action=reboot' -H 'Content-Type: application/json' |json_pp
      

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
API enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants