development

jQuery와 AJAX 응답 헤더

big-blog 2020. 6. 9. 07:43
반응형

jQuery와 AJAX 응답 헤더


그래서이 jQuery AJAX 호출을 얻었고 응답은 302 리디렉션의 형태로 서버에서 나옵니다. 이 리디렉션을 가져 와서 iframe에로드하고 싶지만 자바 스크립트 경고로 헤더 정보를 보려고하면 firebug가 올바르게 인식하더라도 null이 나타납니다.

도움이된다면 코드는 다음과 같습니다.

$j.ajax({
    type: 'POST',
    url:'url.do',
    data: formData,
    complete: function(resp){
        alert(resp.getAllResponseHeaders());
    }
});

URL을 응답 본문으로 이동하기 위해 서버 측 항목에 실제로 액세스 할 수는 없습니다. 이는 가장 쉬운 솔루션 일 것이므로 헤더 구문 분석에 대한 도움이 환상적입니다.


이전 버전의 jquery를 사용하는 경우 cballou의 솔루션이 작동합니다. 최신 버전에서는 다음을 시도 할 수도 있습니다.

  $.ajax({
   type: 'POST',
   url:'url.do',
   data: formData,
   success: function(data, textStatus, request){
        alert(request.getResponseHeader('some_header'));
   },
   error: function (request, textStatus, errorThrown) {
        alert(request.getResponseHeader('some_header'));
   }
  });

문서에 따르면 XMLHttpRequest 객체는 jQuery 1.4부터 사용할 수 있습니다.


이것이 CORS 요청경우 디버그 도구 (예 : Chrome-> 요소 검사-> 네트워크)에 모든 헤더가 표시 될 수 있지만 xHR 객체는 간단한 응답 헤더 인 경우을 통해 헤더를 검색합니다 ( xhr.getResponseHeader('Header')) .

  • Content-Type
  • Last-modified
  • Content-Language
  • Cache-Control
  • Expires
  • Pragma

이 세트에 없으면 서버가 리턴 한 Access-Control-Expose-Headers 헤더에 있어야합니다.

해당 사례에 대해 CORS 요청 인 경우 아래 헤더가있는 경우에만 객체를 Location통해 헤더 를 검색 할 수 있습니다 XMLHttpRequest.

Access-Control-Expose-Headers: Location

CORS 요청이 아닌 경우 XMLHttpRequest검색에 문제가 없습니다.


 var geturl;
  geturl = $.ajax({
    type: "GET",
    url: 'http://....',
    success: function () {
      alert("done!"+ geturl.getAllResponseHeaders());
    }
  });

AJAX 및 302 리디렉션에 대한 불행한 사실은 브라우저가 XHR에 헤더를 제공하지 않기 때문에 반환에서 헤더를 가져올 수 없다는 것입니다. 브라우저에 302가 표시되면 리디렉션이 자동으로 적용됩니다. 이 경우 브라우저가 헤더를 얻었으므로 Firebug에 헤더가 표시되지만 브라우저가 헤더를 전달하지 않았기 때문에 ajax에 표시되지 않습니다. 이것이 성공 및 오류 처리기가 호출되지 않는 이유입니다. 완전한 핸들러 만 호출됩니다.

http://www.checkupdown.com/status/E302.html

The 302 response from the Web server should always include an alternative URL to which redirection should occur. If it does, a Web browser will immediately retry the alternative URL. So you never actually see a 302 error in a Web browser

다음은 주제에 대한 일부 스택 오버 플로우 게시물입니다. 일부 게시물은이 문제를 해결하기위한 해킹에 대해 설명합니다.

jQuery Ajax 호출 후 리디렉션 요청을 관리하는 방법

JavaScript에서 302 FOUND 잡기

HTTP 리디렉션 : 301 (영구) vs. 302 (임시)


The underlying XMLHttpRequest object used by jQuery will always silently follow redirects rather than return a 302 status code. Therefore, you can't use jQuery's AJAX request functionality to get the returned URL. Instead, you need to put all the data into a form and submit the form with the target attribute set to the value of the name attribute of the iframe:

$('#myIframe').attr('name', 'myIframe');

var form = $('<form method="POST" action="url.do"></form>').attr('target', 'myIframe');
$('<input type="hidden" />').attr({name: 'search', value: 'test'}).appendTo(form);

form.appendTo(document.body);
form.submit();

The server's url.do page will be loaded in the iframe, but when its 302 status arrives, the iframe will be redirected to the final destination.


try this:

type: "GET",
async: false,
complete: function (XMLHttpRequest, textStatus) {
    var headers = XMLHttpRequest.getAllResponseHeaders();
}

+1 to PleaseStand and here is my other hack:

after searching and found that the "cross ajax request" could not get response headers from XHR object, I gave up. and use iframe instead.

1. <iframe style="display:none"></iframe>
2. $("iframe").attr("src", "http://the_url_you_want_to_access")
//this is my aim!!!
3. $("iframe").contents().find('#someID').html()  

UPDATE 2018 FOR JQUERY 3 AND LATER

I know this is an old question but none of the above solutions worked for me. Here is the solution that worked:

//I only created this function as I am making many ajax calls with different urls and appending the result to different divs
function makeAjaxCall(requestType, urlTo, resultAreaId){
        var jqxhr = $.ajax({
            type: requestType,
            url: urlTo
        });
        //this section is executed when the server responds with no error 
        jqxhr.done(function(){

        });
        //this section is executed when the server responds with error
        jqxhr.fail(function(){

        })
        //this section is always executed
        jqxhr.always(function(){
            console.log("getting header " + jqxhr.getResponseHeader('testHeader'));
        });
    }

참고URL : https://stackoverflow.com/questions/1557602/jquery-and-ajax-response-header

반응형