이런 머리 에 대해 HTTPX_HTTP_METHOD_OVERRIDE
5475 단어 override
Restful API 란 쉽게 말 하면 기 존의 네 개의 HTTP 동작 을 이용 하여 자원 에 대한 네 가지 조작 을 실현 하 는 것 이다.
그러나 잠시 만 요. 만약 에 독립 된 클 라 이언 트 를 가지 고 있다 면 이 네 가지 동작 을 보 내 는 것 은 문제 가 되 지 않 습 니 다. 그러나 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/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA : @Override, super자식 클래스는 부모 클래스에서 상속받아, 부모 클래스의 있는 자원을 쓰도록 할 건데, 이 때, @Override를 통해 조상 클래스로 부터 대대손손 내려오는 내용을 재정의하도록 하겠습니다. 그 이후, 1번 Inher...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.