[Rails 소재 습득] HTML 폼이 정말 GET와 POST에 의해 제한되었나요?

계기


서적 웹을 지탱하는 기술을 읽은 후 p98에 다음과 같은 기록이 있다.
しかし、現実に一番よく利用されているのはGETとPOSTの2つです。
これはHTMLのフォームで指定できるメソッドがGETとPOSTだけという制限に起因します。
이것을 읽었습니다. "그럼, 업데이트 동작(PATCH 방법)은 어떻게 이루어졌나요?"
그렇게 생각하지만 바로 옆 페이지에 적혀 있어요.
Rails는 _method 매개변수로 이루어진 것으로 보입니다.

실제로 확인해 볼게요.


공지라는 모드가 있으면 공지를 게시할 수 있습니다.

라우팅 선택


(물론) 업데이트 동작은 PATCH 또는 PUT 발동된 것이다.
$ rails routes|grep notice
     notices GET      /notices(.:format)                                                                  notices#index
             POST     /notices(.:format)                                                                  notices#create
  new_notice GET      /notices/new(.:format)                                                              notices#new
 edit_notice GET      /notices/:id/edit(.:format)                                                         notices#edit
      notice PATCH    /notices/:id(.:format)                                                              notices#update
             PUT      /notices/:id(.:format)                                                              notices#update
             DELETE   /notices/:id(.:format)                                                              notices#destroy

HTML


편집 페이지의form右クリック→ページのソースを表示에서 보십시오.
<form class="edit_notice" id="edit_notice_18" action="/notices/18" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" />
  <input type="hidden" name="_method" value="patch" /><input type="hidden" name="authenticity_token" value="lGc0ypr/fV1WxhHZm6OS1ehZMpPj9IIgKF/8S5pm3FglyNHWxFgGLGt25AjoFb9BAINs4iRwg7VXn8eLjv9QGQ==" />
  <label>お知らせ</label>
  <textarea name="notice[body]" id="notice_body">test</textarea>
  <input type="submit" name="commit" value="登録" data-disable-with="登録中…" />
</form>
확실히form 라벨을 보면 method="put"또는 method="patch"가 아니라 method="post" 입니다.
그리고 숨겨진 매개 변수 (hidden) 에 _method 매개 변수가 준비되어 있는지 확인할 수 있습니다.↓<input type="hidden" name="_method" value="patch" />

제가 Wireshark에서 가방을 하나 잡았어요.


실제 http 패키지를 보고 싶어서 해봤어요.
wireshark에서 인터페이스를localhost로 지정하면localhost:3000과의 그룹 통신을 포착할 수 있습니다.
그림은 편집 페이지에서submit할 때의 http 패키지입니다.
POST 메서드에 대한 HTTP 요청이 전송되었는지 확인할 수 있습니다.
또한 HTML Form URL Encoded: application/x-www-form-urlencodedForm item: "_method" = "patch"의 매개변수를 확인할 수 있습니다.
이 파라미터"patch"를 보고 처리 방법을 보냈다고 생각했을 수도 있다.

디버깅


업데이트 동작 내 binding.pry를 설치하고 디버깅합니다.
[1] pry(#<NoticesController>)> request
=> #<ActionDispatch::Request:0x00007fd6cb6156d0
 @env=
  {"CONTENT_LENGTH"=>"210",
   "CONTENT_TYPE"=>"application/x-www-form-urlencoded",
   "GATEWAY_INTERFACE"=>"CGI/1.1",
   "PATH_INFO"=>"/notices/15",
   "QUERY_STRING"=>"",
   "REMOTE_ADDR"=>"::1",
   "REMOTE_HOST"=>"::1",
   "REQUEST_METHOD"=>"PATCH",
   "REQUEST_URI"=>"http://localhost:3000/notices/15",
   "SCRIPT_NAME"=>"",
   "SERVER_NAME"=>"localhost",
   "SERVER_PORT"=>"3000",

실제 발송된 HTTP 요청은 전원 켜기 자체 검사 방법이지만 Rails에서는 PATCH 방법을 받고 처리했다고 생각하는 것 같습니다.
( "REQUEST_METHOD"=>"PATCH" )

의문의 일


이번 확인에서_method에서patch가 맞혔습니다.put는 어떤 조건하에서 나타났을까요??
(어떤 조건에서put모드,patch모드가 있습니까?)

좋은 웹페이지 즐겨찾기