Rails에서 수락 헤더 처리 변경과의 거꾸로 호환성을 지원하는 방법 2.3.4

StackOverflow https://stackoverflow.com/questions/1612633

  •  06-07-2019
  •  | 
  •  

문제

레일 2.3.4에서 Accept 헤더가 처리되었습니다.

http://github.com/rails/rails/commit/1310231c15742BF7D99E2F143D88B383C32782D3

우리는 그것을 받아들이지 않을 것입니다

레일이 들어오는 수락 헤더를 처리하는 방식이 업데이트되었습니다. 이것은 주로 웹 브라우저가 항상 원하는 것을 알고있는 것 같지 않기 때문입니다. 일관되게 표현할 수는 없습니다. 따라서 승인 헤더는 이제 XHR 요청 또는 단일 항목 헤더에만 사용됩니다. 즉, 모든 것을 요청하지 않습니다. 그것이 실패하면, 우리는 params [: format]를 사용하는 것으로 돌아갑니다.

또한 XML 템플릿 만 선언 한 조치에 대한 요청은 더 이상 HTML 요청 (브라우저 요청)에 대해 자동으로 렌더링되지 않습니다. 이것은 이전에 디자인에 의해 반드시 작동하지 않았지만 대부분의 브라우저는 캐치 alc/".

나는 모두를 모두 보내는 많은 고객이 사용하는 활성 API를 가지고 있습니다. Content-Type 그리고 Accept 헤더, 둘 다 설정합니다 application/xml. 이것은 잘 작동하지만 Rails 2.3.4에서 테스트는 이것이 더 이상 작동하지 않음을 보여줍니다. 403 무단 응답을 얻습니다. 제거하십시오 Accept 헤더와 그냥 보내는 것 Content-Type 작동하지만 모든 고객이 응용 프로그램을 다시 코딩해야하기 때문에 이것은 허용되는 솔루션이 아닙니다.

Rails 2.3.4에 배포되면 API를 사용하는 모든 클라이언트 응용 프로그램이 중단됩니다. 클라이언트가 코드를 변경하지 않고도 Rails 2.3.4에서 기존 API 요청을 계속 제공 할 수 있도록 Rails 앱을 어떻게 수정할 수 있습니까?

도움이 되었습니까?

해결책 2

당황스럽게도, 이것은 실제로 Apache 구성 문제로 판명되었습니다. 내가 이것을 해결하면 모든 것이 예상대로 작동했습니다. 미안합니다.

Coderjoe가 올바르게 지적했듯이 Content-Type 헤더는 전혀 필요하지 않습니다 Accept 헤더.

다른 팁

내가 올바르게 이해하면 문제는 요청 헤더에 있습니다. 교정하는 사용자 정의 랙 미들웨어를 추가 할 수 있습니다.

빠른 아이디어 :

class AcceptCompatibility
  def initialize(app)
    @app = app
  end

  def call(env)
    if env['Accept'] == "application/xml" && env['Content-Type'] == "application/xml"
      # Probably an API call
      env.delete('Accept')
    end
    @app.call(env)
  end
end

그리고 당신의 환경에서 .rb

require 'accept_compatibility'
config.middleware.use AcceptCompatibility
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top