이런 머리 에 대해 HTTPX_HTTP_METHOD_OVERRIDE

5475 단어 override
어떻게 Flex 3.2 에서 Rails 2.3.2 의 Restful API 를 호출 합 니까?
Restful API 란 쉽게 말 하면 기 존의 네 개의 HTTP 동작 을 이용 하여 자원 에 대한 네 가지 조작 을 실현 하 는 것 이다.
  • GET 획득
  • POST 생 성
  • PUT 업데이트
  • DELETE 삭제
  • 여기 서 REST 에 대해 더 상세 한 설명 을 하지 않 습 니 다. 관련 자 료 는 인터넷 에 많 고 논란 이 많 습 니 다. 우 리 는 이런 논쟁 (작가 자신 도 논쟁 하고 있 습 니 다) 을 잠시 내 버 려 두 고 순수한 기술적 인 측면 에서 볼 때 이런 방식 은 우리 가 흔히 볼 수 있 는 CRUD 조작 에 더욱 편리 합 니 다.
    그러나 잠시 만 요. 만약 에 독립 된 클 라 이언 트 를 가지 고 있다 면 이 네 가지 동작 을 보 내 는 것 은 문제 가 되 지 않 습 니 다. 그러나 RIA 개발 (Flex 또는 Silverlight) 을 한다 면 현재 브 라 우 저 숙주 는 GET 와 POST 만 지원 할 수 있 습 니 다. 뒤의 두 가지 동작 은 어떻게 합 니까?
    주: Flex 의 HTTPService 구성 요 소 는 8 가지 동작 이 있 지만 효과 가 없습니다.
    아마도 당신 은 이미 많은 동적 사이트 시스템 이 사용 하 는 해결 방법 을 보 았 을 것 입 니 다. 그것 은 바로 URL 파 라 메 터 를 추가 하 는 것 입 니 다.http://www.example.com/admin.asp?action=newpost&title=abc
    이렇게 하 는 장점 은 직관 적 인 매개 변 수 를 통 해 서버 와 대 화 를 하 는 것 이다.
    물론 나 쁜 점도 적지 않다. HTTP 프로 토 콜 에 따 르 면 GET 동작 은 서버 에 부작용 을 일 으 킬 수 없다. GET 는 읽 기 전용 이기 때문이다. 또한 이러한 URL 이 검색엔진 에 수록 되 거나 사용자 가 즐겨 찾기 폴 더 에 가입 하면 치 명 적 인 문 제 는 아니 지만 결국은 HTTP 프로 토 콜 에 대한 오독 이기 때문이다.
    OK ~ 브 라 우 저가 지원 하지 않 는 이상 Restful 의 프레임 워 크 를 제창 하고 이러한 URL 매개 변수의 작업 방식 에 보편적으로 만족 하지 않 는 다 면 rails 는 어떻게 이 문 제 를 해결 합 니까?
    Rails 도 브 라 우 저의 문 제 를 해결 할 능력 이 없습니다. 그녀 역시 PUT 와 DELETE 동작 을 모 의 하 는 추가 적 인 방법 을 사용 해 야 합 니 다. 소스 코드 를 보면 POST 폼 의 hidden 도 메 인 을 읽 는 방법 을 사용 할 수 있 습 니 다.method
    html
    <input name="_method" type="hidden" value="put" /> 

    이러한 방법 을 사용 하 는 것 은 웹 페이지 의 양식 에 있어 서 적당 할 수도 있 지만 저 처럼 Flex 를 사용 하여 RIA 클 라 이언 트 프로그램 을 개발 하 는 사람 에 게 다음 과 같은 문제 가 존재 할 수 있 습 니 다.
    제 가 읽 은 문 서 는 이 럴 수 있 습 니 다.
    xml
    <user>     <name>  </name>     <age>20</age> </user> 

    그럼 나 는 왜 아래 와 같은 양식 으로 바 꾸 어 제출 해 야 합 니까?user[name]= &user[age]=20
    읽 을 수 있 는 것 도 xml 이 고 제출 도 xml 이 라면 생활 이 훨씬 간단 하지 않 습 니까?
    xml 제출 은method 는 다른 곳 에 두 어야 합 니 다 (xml 는 두 개의 요소 가 있 을 수 없습니다). rails 2.2.2 이전 버 전 (구체 적 으로 어느 버 전 까지 는 잘 모 르 겠 습 니 다). 서버 는 GET 인 자 를 받 아들 입 니 다. 즉, 이렇게 쓸 수 있 습 니 다./users/1?_method=PUT
    _method 는 안식 처가 생 겼 지만 잠시 만 요!이렇게 하면 안전 합 니까?정규 요?라 일 스 개발 자 들 도 이 물건 이 마음 에 들 지 않 는 다 고 생각 하기 때문에 라 일 스 2.3.2 에서 이런 방법 은 금지 되 었 다.
    상세 참조: lib/action_controller/vendor/rack-1.0/rack/methodoverride.rb새 버 전 은 POST 폼 에서 만 읽 기method, My God…
    다행히도, methodoverride. rb 이 파일 의 내용 은 나 에 게 다른 방향 을 가 리 켜 주 었 다.
    ruby
    def call(env)   if env["REQUEST_METHOD"] == "POST"     req = Request.new(env)     method = req.POST[METHOD_OVERRIDE_PARAM_KEY] ||       env[HTTP_METHOD_OVERRIDE_HEADER]     method = method.to_s.upcase     if HTTP_METHODS.include?(method)       env["rack.methodoverride.original_method"] = env["REQUEST_METHOD"]       env["REQUEST_METHOD"] = method     end   end end 

    이 파일 은 서버 가 받 아들 이 는 것 외 에method 숨 김 필드 외 에 도 "HTTP X HTTP METHOD OVERRIDE" 라 는 메시지 헤드 를 받 습 니 다. 정말 좋 습 니 다. 빛 을 향 해 계속 전진 합 니 다. 제출 한 메시지 헤드 를 볼 수 있 도록 applicationcontroller. rb 에 코드 를 추가 합 니 다. (Rails 2.2.2 이전 파일 이름 은 application. rb)
    ruby
    class ApplicationController < ActionController::Base   before_filter :print_headers   def print_headers     request.headers.each { |k,v| logger.info("#{k} #{v}") }   end end 

    이제 Flex 로 돌아 가서 클 라 이언 트 를 만들어 서 효 과 를 시험 해 봅 시다.
    actionscript
    var svc:HTTPService = new HTTPService(); svc.method = "POST"; svc.url = "/users/1"; svc.headers = { HTTP_X_HTTP_METHOD_OVERRIDE:"PUT", Accept:"application/xml" }; svc.request = { user:{ age:30 } }; svc.send(); 

    결 과 는 좀 길 었 습 니 다. 삭제 한 후에 다음 과 같은 내용 을 발견 할 수 있 습 니 다.Processing UsersController#create to xml (for 127.0.0.1 at 2009-03-22 11:02:04) [POST] SERVER_NAME ... ....... HTTP_HTTP_X_HTTP_METHOD_OVERRIDE PUT .......
    으.. 왜 HTTP 가 더 나 왔 을 까접 두 사 는 요?이 문 제 는 너 에 게 남 겨 두 고 풀 어 라, 나 도 정말 분명하게 말 할 수 없다.
    하지만 괜찮아, 문 제 는 이미 밝 아 졌 으 니 우리 의 소식 머리 를 다시 설계 하면 돼.
    actionscript
    //         ,        ,            Mxml. var svc:HTTPService = new HTTPService(); //     POST,             . svc.method = "POST"; //     ID   1       PUT    svc.url = "/users/1"; //            HTTP_   ,       5     . // Accept           url     .xml       format. svc.headers = { X_HTTP_METHOD_OVERRIDE:"PUT", Accept:"application/xml" }; //               ,        ,        xml. svc.request = { user:{ age:30 } }; //   !!! svc.send(); 

    `Processing UsersController#update to xml (for 127.0.0.1 at 2009-03-22 11:05:13 ) [PUT]
    Parameters: {"id"=>"1"} 

    ……. HTTP_X_HTTP_METHOD_OVERRIDE PUT …….
    User Load (0.0ms) SELECT * FROM "users" WHERE ("users"."id" = 1) User Update (2.0ms) UPDATE "users" SET "age" = 30, "updated_at" = '2009-03-22 03:05:13' WHERE "id" = 1 

    Completed in 164ms (View: 4, DB: 2) | 200 OK [http://192.168.0.1/users/1]`
    OK ~ 레일 스 는 이미 우리 의 신 호 를 받 았 고 우리 가 원 하 는 동작 [PUT] 을 정확하게 식별 한 것 같 습 니 다. 다른 유사 한 동작 은 우리 가 자 유 롭 게 발휘 할 수 있 습 니 다. 더 이상 을 받 지 않 아 도 됩 니 다.method 의 버 무리 기.
    음, 당신 도 나 처럼 기술 분야 에서 지루 한 완벽 주의 자라 면, 이 결과 가 당신 을 만족 시 킬 수 있 기 를 바 랍 니 다.
    http://coldtoto.heroku.com/2009/03/22/flex-put-xml-to-rails/

    좋은 웹페이지 즐겨찾기