링크가 GET 대신 POST를 사용하도록하십시오


204

이것이 가능한지 확실하지 않습니다. 그러나 하이퍼 링크가 일부 변수를 전달하고 GET과는 달리 POST (양식과 같은)를 사용하는 방법을 아는 사람이 있는지 궁금합니다.


HTML은 그렇게 할 수 없습니다. JavaScript는 링크에서 클릭 이벤트를 포착 할 수 있으며 HTML을 변경할 수없는 경우 원하는 동작을 수행 할 수 있으며 CSS는 모양 만 관련이있는 링크와 같은 버튼 스타일을 지정할 수 있습니다.
실베인

답변:


98

게시 할 값을 보유하는 숨겨진 입력이있는 양식을 작성하고 양식의 조치 를 대상 url로 설정하고 양식 메소드를 post로 설정하십시오 . 그런 다음 링크를 클릭하면 양식을 제출하는 JS 함수를 트리거하십시오.

예를 보려면 여기를 참조 하십시오 . 이 예제는 jQuery없이 순수 JavaScript를 사용합니다. 이미 설치 한 것보다 더 많은 것을 설치하지 않으려는 경우이를 선택할 수 있습니다.

<form name="myform" action="handle-data.php" method="post">
  <label for="query">Search:</label>
  <input type="text" name="query" id="query"/>
  <button>Search</button>
</form>

<script>
var button = document.querySelector('form[name="myform"] > button');
button.addEventListener(function() {
  document.querySelector("form[name="myform"]").submit();
});
</script>

16
이것이 왜 대답입니까? 이 질문은 GET과 달리 POST (양식과 같은)사용 하도록 요청 하지만이 답변에는 " 대상 URL에 작업 설정 및 가져 오기 방법 "이 표시됩니다.
Majid Fouladpour

3
나는 그것을 얻는다. 내가 이해하지 못하는 것은 이것입니다 : 우리는 POST를 할 수 있도록 숨겨진 양식을 만드는 데 어려움을 겪습니다. 그러나 양식을 만든 후에는 메소드를 설정 GET하시겠습니까? 우리는 get형태가 없었습니다.
Majid Fouladpour

3
네 말이 맞아 그것은 오류 였지만 어떻게 든 OP는 여전히 올바른 결과를 얻었습니다 (아마도 포함 된 링크가 훨씬 더 명확하기 때문일 것입니다). 지적 해 주셔서 감사합니다. 나는 그것을 완전히 환호했다.
Palantir

3
더 현대적인 접근 방식을 사용하도록 답변을 업데이트했습니다. 동의하지 않으면이 편집을 롤백하십시오.
Michał Perłakowski

3
이 프로세스에 Javascript를 포함시킬 이유가 없습니다. 이것이 왜 대답입니까?
shacker

322

이를 위해 JavaScript가 필요하지 않습니다. 이 답변이 게시 된 시점 에서이 질문에 대한 모든 답변에는 어떤 식 으로든 JavaScript를 사용하는 것이 포함되어 있기 때문에 분명히하고 싶었습니다 .

제출하려는 데이터가 포함 된 숨겨진 필드가있는 양식을 작성한 다음 양식의 제출 단추를 링크처럼 보이게 하여 순수 HTML 및 CSS 로이를 쉽게 수행 할 수 있습니다 .

예를 들면 다음과 같습니다.

.inline {
  display: inline;
}

.link-button {
  background: none;
  border: none;
  color: blue;
  text-decoration: underline;
  cursor: pointer;
  font-size: 1em;
  font-family: serif;
}
.link-button:focus {
  outline: none;
}
.link-button:active {
  color:red;
}
<a href="some_page">This is a regular link</a>

<form method="post" action="some_page" class="inline">
  <input type="hidden" name="extra_submit_param" value="extra_submit_value">
  <button type="submit" name="submit_param" value="submit_value" class="link-button">
    This is a link that sends a POST request
  </button>
</form>

사용하는 정확한 CSS는 사이트의 일반 링크 스타일에 따라 다를 수 있습니다.


4
동의했다. 이메일 로이 작업을 수행 할 수있는 방법이 필요했기 때문에 JS는 나에게 많은 옵션이 없었습니다. 이것은 완벽하게 작동합니다
SynackSA

7
나는 이것을 한 번만 공표 할 수 있습니다. 모든 HTML 질문의 99.728 %가 자바 스크립트 또는 jQuery 문제와 혼동 될 수 있다는 사실만큼이나 슬픈 일입니다.
Rab

3
이것은 링크처럼 보이는 버튼을 사용하는 간단한 방법이지만 실제로는 하드 코딩입니다. 이 버튼이 작동 할 조건을 정확히 알고 모든 경우에 대해 명시 적으로 설정해야합니다. JS / JQuery를 기반으로 한 답변은 링크 요소 자체 (또는 어느 요소이든)를 사용하기 때문에 더 일반적이라고 생각합니다.
MakisH

2
@ Ajedi32 죄송합니다. 제 의견은 명확하지 않습니다. 주로이 버튼이 <a> 요소처럼 보이도록 스타일을 지정하려고합니다. 그러나 페이지의 다른 부분과 같이 다르게 스타일이 지정된 다른 <a> 요소 주위에 버튼을 배치하면 버튼에 대한 <a>의 모든 CSS 규칙을 복제하여 호버, 방문 등의 규칙을 만들어야합니다. 그렇지 않으면 물론 일을 할 것이지만 추악하게 보일 것입니다. 다른 솔루션을 사용하면 CSS를 변경할 필요가 없으며 기존의 다른 요소와 마찬가지로 <a> 요소 만 얻을 수 있습니다. 물론 순수한 HTML에는 몇 가지 장점이 있습니다.
MakisH

1
@Robert AFAIK, 다른 제안 된 솔루션 중 어느 것도 중간 클릭으로 작동하지 않습니다. 당신이 경우 정말 현학적되고 싶어요, 당신은 링크가 POST 요청을 제출하는 것은 불가능하다고 말할 수있다. 양식과 JavaScript가있는 POST 요청 만 제출할 수 있습니다.
Ajedi32

48

자바 스크립트 함수를 사용할 수 있습니다. JQuery에는 사용하기로 결정한 멋진 게시 기능이 내장되어 있습니다.

jQuery 포스트

<script language="javascript"> 

   function DoPost(){
      $.post("WhateverPage.php", { name: "John", time: "2pm" } );  //Your values here..
   }

</script>


<a href="javascript:DoPost()">Click Here</A> 

5
이렇게하면 POST 요청이 요청되지만 "Whatever.php"위치로 이동해야하므로이를 사용할 수 없습니다.
Chris

6
$.post('page.php', {param: 1}, function() { window.location.href = 'page'.php' });
JREAM

1
@mplungjan href는 링크가 참조하는 위치를 말하지만, 행동과 내용을 혼동하는 것이 잘못되었다는 것에 동의합니다.이 경우 javascript 참조입니다. 즉, "링크를 클릭하면 JavaScript를 사용하여 포스트 백을 수행합니다". 이것은 클릭 이벤트를 바인딩하는 것보다 더 의미가 있습니다. "href에서 자바 스크립트를 사용하지 마십시오"와 같은 어려운 규칙은 다른 나쁜 습관만큼이나 나쁩니다.
Menol

@ Menol 나는 말했다 : 권장하지 않습니다. - "사용하지 마십시오". 당신이 정말로 원한다면 할 수 <a href="whyjavascript.html" id="postIt">Click Here</a>있고$("#postIt").on("click",function(e) { e.preventDefault(); $.post("WhateverPage.php", { name: "John", time: "2pm" } ); });
mplungjan

1
@mplungjan 혼동하는 내용 / 행동을 피하기 위해 다른 권장 사항이 도입되었습니다. 의도 한 범위를 벗어나는 경우 권장 사항이 제시되면 하드 규칙으로 표시되기 시작합니다. 당신이 준 예제 는 "규칙"안전한 측면에 있기 위해 여분의 마일을 가지 므로 미래에 프로그래머를 비난 할 수 는 없지만이 안전 은 가독성과 의미를 희생시키면서 달성됩니다. 다른 실용 개발자에게 나타나는 방식 일 뿐이지 만 그 의미는 아닙니다.
Menol

24

이것은 오래된 질문이지만 요청 중 전체를 충족시키는 답변은 없습니다. 그래서 다른 대답을 추가하고 있습니다.

내가 이해 한 것처럼 요청 된 코드는 일반적인 하이퍼 링크 작동 방식을 한 번만 변경 POST해야합니다 GET. 대신 메소드를 사용해야합니다 . 즉각적인 영향은 다음과 같습니다.

  1. 링크를 클릭하면 탭을 URL에 다시로드해야합니다. href
  2. 메소드가 POST이므로로드 할 대상 페이지의 URL에 쿼리 문자열이 없어야합니다.
  3. 해당 페이지는 매개 변수 (이름 및 값)로 데이터를 수신해야합니다. POST

여기서 jquery를 사용하고 있지만 네이티브 API (물론 더 길고 길다)로 수행 할 수 있습니다.

<html>
<head>
    <script src="path/to/jquery.min.js" type="text/javascript"></script>
    <script>
        $(document).ready(function() {

            $("a.post").click(function(e) {
                e.stopPropagation();
                e.preventDefault();
                var href = this.href;
                var parts = href.split('?');
                var url = parts[0];
                var params = parts[1].split('&');
                var pp, inputs = '';
                for(var i = 0, n = params.length; i < n; i++) {
                    pp = params[i].split('=');
                    inputs += '<input type="hidden" name="' + pp[0] + '" value="' + pp[1] + '" />';
                }
                $("body").append('<form action="'+url+'" method="post" id="poster">'+inputs+'</form>');
                $("#poster").submit();
            });
        });
    </script>
</head>
<body>
    <a class="post" href="reflector.php?color=blue&weight=340&model=x-12&price=14.800">Post it!</a><br/>
    <a href="reflector.php?color=blue&weight=340&model=x-12&price=14.800">Normal link</a>
</body>
</html>

결과를 보려면 위의 저장 디렉토리와 같은 디렉토리에 reflector.php로 다음을 저장하십시오.

<h2>Get</h2>
<pre>
<?php print_r($_GET); ?>
</pre>

<h2>Post</h2>
<pre>
<?php print_r($_POST); ?>
</pre>

12

비슷한 접근 방식을 사용하여 게시 한 다른 작업 예제 : HTML 양식을 만들고 javascript를 사용하여 게시물을 시뮬레이션하십시오. 이것은 두 가지 작업을 수행합니다. 데이터를 새 페이지에 게시하고 새 창 / 탭에서 엽니 다.

HTML

<form name='myForm' target="_blank" action='newpage.html' method='post'>
<input type="hidden" name="thisIsTheParameterName" value="testDataToBePosted"/>
</form>

자바 스크립트

document.forms["myForm"].submit();

3

HTML + JQuery : POST를 사용하여 숨겨진 양식을 제출하는 링크입니다.

이 모든 답변을 이해하는 데 많은 시간을 보냈고 모든 흥미로운 세부 사항이 있으므로 여기에 마침내 효과가 있었고 단순성을 선호하는 결합 된 버전이 있습니다.

내 접근 방식은 숨겨진 양식을 만들고 페이지의 다른 곳에서 링크를 클릭하여 제출하는 것입니다. 페이지 본문에서 양식이 배치 될 위치는 중요하지 않습니다.

양식의 코드 :

<form id="myHiddenFormId" action="myAction.php" method="post" style="display: none">
  <input type="hidden" name="myParameterName" value="myParameterValue">
</form>

기술:

display: none양식을 숨 깁니다. 또는 div 또는 다른 요소에 넣고 요소를 설정할 수 있습니다 display: none.

type="hidden"도시되지 것이다 Fild입니다를 작성하지만 데이터는 작업 eitherways (송신한다 W3C 참조 ). 이것이 가장 간단한 입력 유형이라는 것을 알고 있습니다.

링크 코드 :

<a href="" onclick="$('#myHiddenFormId').submit(); return false;" title="My link title">My link text</a>

기술:

빈은 href단지 같은 페이지를 대상으로 . 그러나이 경우 return false브라우저가 링크를 따라가는 것을 막을 수 있으므로이 경우 실제로 중요하지 않습니다 . 물론이 동작을 변경하고 싶을 수도 있습니다. 필자의 경우에는 작업 끝에 리디렉션이 포함되었습니다.

onclick사용하지 않도록 하였다 href="javascript:..."으로 mplungjan 하였음 . 는 $('#myHiddenFormId').submit();(코드가 매우 작기 때문에, 대신에 함수를 정의) 양식을 제출 하였다.

이 링크는 다른 <a>요소 와 똑같이 보입니다 . 실제로 다른 요소 <a>(예 : a <span>또는 이미지) 대신 다른 요소를 사용할 수 있습니다 .


2

이 jQuery 함수를 사용할 수 있습니다

function makePostRequest(url, data) {
    var jForm = $('<form></form>');
    jForm.attr('action', url);
    jForm.attr('method', 'post');
    for (name in data) {
        var jInput = $("<input>");
        jInput.attr('name', name);
        jInput.attr('value', data[name]);
        jForm.append(jInput);
    }
    jForm.submit();
}

다음은 jsFiddle의 예제입니다 ( http://jsfiddle.net/S7zUm/ )


@DaoLam 코드가 실제로 작동합니다. 나는 대체 leserged.free.fr/phpinfo.php phpref의 값과이 값을 전달 해당 사이트에 양식을 게시했다.
JSWilson

2

많은 게시물에서 언급했듯이, 이것은 직접적으로 가능하지는 않지만 쉽고 성공적인 방법은 다음과 같습니다. 먼저 html 페이지 본문에 양식을 제출합니다. 여기에는 제출 버튼과 입력 내용이 없습니다. 숨겨져 있습니다. 그런 다음 자바 스크립트 함수를 사용하여 데이터를 가져 와서 양식을 보냅니다. 이 방법의 장점 중 하나는 서버 쪽 코드에 따라 다른 페이지로 리디렉션하는 것입니다. 코드는 다음과 같습니다. 이제 어디에서나 "POST"메소드에 있어야합니다.

<script type="text/javascript" language="javascript">
function post_link(data){

    $('#post_form').find('#form_input').val(data);
    $('#post_form').submit();
};
</script>

   <form id="post_form" action="anywhere/you/want/" method="POST">
 {% csrf_token %}
    <input id="form_input" type="hidden" value="" name="form_input">
</form>

<a href="javascript:{}" onclick="javascript:post_link('data');">post link is ready</a>

1

페이지에 HTML을 코딩하지 않고보다 역동적 인 접근법을 제안하십시오 .JS를 엄격하게 유지하십시오.

$("a.AS-POST").on('click', e => {
  e.preventDefault()
  let frm = document.createElement('FORM')
  frm.id='frm_'+Math.random()
  frm.method='POST'
  frm.action=e.target.href
  document.body.appendChild(frm)
  frm.submit()
})

0

대신 자바 스크립트를 사용하여 숨겨진 양식을 보내는 레이블을 사용할 수도 있습니다. 매우 간단하고 작은 솔루션. 라벨은 HTML 어디에서나 사용할 수 있습니다.

<form style="display: none" action="postUrl" method="post">
  <button type="submit" id="button_to_link"> </button>
</form>
<label style="text-decoration: underline" for="button_to_link">  link that posts </label>


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.