วิธีรับรหัสสถานะการตอบกลับจาก jQuery.ajax


230

ในรหัสต่อไปนี้ทั้งหมดที่ฉันพยายามทำคือรับรหัสตอบกลับ HTTP จากการเรียก jQuery.ajax จากนั้นหากรหัสคือ 301 (ย้ายอย่างถาวร) ให้แสดงหัวข้อการตอบสนอง 'ตำแหน่ง':

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>jQuery 301 Trial</title>
  <script src="http://code.jquery.com/jquery-1.5.1.min.js"></script>

  <script type="text/javascript">
  function get_resp_status(url) {
    $.ajax({
      url: url,
      complete: function (jqxhr, txt_status) {
        console.log ("Complete: [ " + txt_status + " ] " + jqxhr);
        // if (response code is 301) {
        console.log ("Location: " + jqxhr.getResponseHeader("Location"));
        // }
      }
    });
  }
  </script>
  <script type="text/javascript">
  $(document).ready(function(){
    $('a').mouseenter(
      function () {
        get_resp_status(this.href);
      },
      function () {
      }
    );
  });
  </script>
</head>
<body>
  <a href="http://ow.ly/4etPl">Test 301 redirect</a>
  <a href="http://cnn.com/not_found">Test 404 not found</a>
</body>
</html>

ใครสามารถชี้ให้เห็นว่าฉันกำลังไปไหนผิด เมื่อฉันตรวจสอบวัตถุ 'jqxhr' ใน Firebug ฉันไม่พบรหัสสถานะหรือส่วนหัวการตอบสนอง 'ตำแหน่ง' ฉันตั้งเบรกพอยต์ในบรรทัดสุดท้ายของ 'สมบูรณ์'

ขอบคุณมาก.



ฉันรู้ว่านี่เก่า แต่ฉันคิดว่าฉันแก้ไขแล้ว (XHR.responseURL): stackoverflow.com/a/39416846/4946681
เนท

คำตอบ:


221

ฉันเห็นฟิลด์สถานะบนวัตถุ jqXhr นี่คือซอที่ทำงาน:

http://jsfiddle.net/magicaj/55HQq/3/

$.ajax({
    //...        
    success: function(data, textStatus, xhr) {
        console.log(xhr.status);
    },
    complete: function(xhr, textStatus) {
        console.log(xhr.status);
    } 
});

2
ดูเหมือนว่าจะทำงานใน jsFiddle ตามนั้นและเอกสาร jQuery, xhr.status ควรทำสิ่งที่ฉันต้องการ อย่างไรก็ตามเมื่อฉันลองเหมือนกันในรหัสเดิมของฉัน (txt_status ถูกแทนที่ด้วย jqxhr.status) ฉันจะได้รับ jqxhr.status เป็น 0 ต่อไปนี้เป็นภาพหน้าจอ: twitpic.com/4alsqj
Mahesh

10
ฉันเชื่อว่าปัญหาคือคุณไม่ได้ทำงานกับเว็บเซิร์ฟเวอร์ แต่อยู่ในพื้นที่จากระบบไฟล์ ฉันคิดว่าถ้าคุณใช้งานเว็บเซิร์ฟเวอร์ในท้องถิ่นสิ่งนี้จะทำงานได้อย่างถูกต้องนี่คือบทความบางส่วนในหัวข้อ: pearweb.com/javascript/XMLHttpRequest.html developer.mozilla.org/En/Using_XMLHttpRequest "สิ่งสำคัญที่ควรทราบคือ สถานะผลลัพธ์จะถูกเปรียบเทียบกับ 0 เพื่อความสำเร็จแทนที่จะเป็น 200 นี่เป็นเพราะรูปแบบไฟล์และ ftp ไม่ได้ใช้รหัสผลลัพธ์ HTTP "
Adam Ayres

มันเยี่ยมมาก โดยเฉพาะอย่างยิ่งเมื่อฉันสามารถให้แบ็กเอนด์ส่งรหัสสถานะ
thatmiddleway

โปรดทราบว่าหากการตอบกลับเป็นสถานะการเปลี่ยนเส้นทางเช่น 302 สิ่งนี้จะให้ 200
นักบัญชีเมื่อ

52

มาในการค้นหาหัวข้อนี้เก่าสำหรับการแก้ปัญหาที่คล้ายกันตัวเองและพบว่าคำตอบที่ได้รับการยอมรับที่จะใช้วิธีการ.complete() jquery ajaxฉันพูดถึงประกาศในเว็บไซต์ jqueryที่นี่:

jqXHR.success () jqXHR.error () และ jqXHR.complete ()เรียกกลับจะเลิกเป็นของ jQuery 1.8 ในการจัดเตรียมรหัสของคุณสำหรับการลบในที่สุดให้ใช้jqXHR.done (), jqXHR.fail () และ jqXHR.always ()แทน

หากต้องการทราบการstatus codeตอบสนองของ ajax เราสามารถใช้รหัสต่อไปนี้:

$.ajax( url [, settings ] )
.always(function (jqXHR) {
    console.log(jqXHR.status);
});

ทำงานเหมือนกันสำหรับ.done()และ.fail()


2
สิ่งนี้กำลังส่งคืน "undefined"
Pedro Joaquín

43

อาจเป็นไปได้มากว่า jQuery ที่ใช้คุณสมบัติ statusCode ของวัตถุพารามิเตอร์ที่ส่งผ่านไปยังฟังก์ชัน $ .ajax:

$.ajax({
  statusCode: {
    500: function(xhr) {
      if(window.console) console.log(xhr.responseText);
    }
  }
});

อย่างไรก็ตามดังที่Livingston Samuelกล่าวว่าเป็นไปไม่ได้ที่จะจับรหัสสถานะ 301 ในรูปแบบจาวาสคริปต์


41

เมื่อคำขอ XHR ของคุณส่งคืนการตอบกลับการเปลี่ยนเส้นทาง (สถานะ HTTP 301, 302, 303, 307) การXMLHttpRequest ติดตามจะเปลี่ยน URL โดยอัตโนมัติและส่งคืนรหัสสถานะของ URLนั้น

คุณสามารถรับรหัสสถานะที่ไม่เปลี่ยนเส้นทาง (200, 400, 500 ฯลฯ ) ผ่านstatusคุณสมบัติของวัตถุ xhr

ดังนั้นคุณไม่สามารถเปลี่ยนเส้นทางได้รับตำแหน่งจากส่วนหัวของการตอบสนองของ301, 302, 303หรือ307การร้องขอ

คุณอาจต้องเปลี่ยนลอจิกเซิร์ฟเวอร์เพื่อตอบสนองในแบบที่คุณสามารถจัดการการเปลี่ยนเส้นทางได้แทนที่จะปล่อยให้เบราว์เซอร์ทำ ใช้ตัวอย่าง


24

คุณสามารถตรวจสอบเนื้อหา respone ของคุณเพียงแค่ console.log มันและคุณจะเห็นคุณสมบัติ whitch มีรหัสสถานะ หากคุณไม่เข้าใจ jsons โปรดดูวิดีโอ: https://www.youtube.com/watch?v=Bv_5Zv5c-Ts

มันอธิบายความรู้พื้นฐานที่ทำให้คุณรู้สึกสบายใจกับจาวาสคริปต์

คุณสามารถทำได้ด้วยคำขอ ajax ที่สั้นลงโปรดดูรหัสด้านบน:

$.get("example.url.com", function(data) {
                console.log(data);
            }).done(function() {
               // TO DO ON DONE
            }).fail(function(data, textStatus, xhr) {
                 //This shows status code eg. 403
                 console.log("error", data.status);
                 //This shows status message eg. Forbidden
                 console.log("STATUS: "+xhr);
            }).always(function() {
                 //TO-DO after fail/done request.
                 console.log("ended");
            });

ตัวอย่างเอาต์พุตคอนโซล:

error 403 
STATUS: Forbidden 
ended

1
ขอขอบคุณที่ให้รหัสเต็มของวิธีการใช้การทำล้มเหลวและเสมอพร้อมกับพารามิเตอร์ฟังก์ชันแบบเต็ม
IvanD

4

jqxhr เป็นวัตถุ json:

ผลตอบแทนที่สมบูรณ์:
วัตถุ jqXHR (ใน jQuery 1.4.x, XMLHTTPRequest) และสตริงที่จัดหมวดหมู่สถานะของคำขอ ("สำเร็จ", "notmodified", "ข้อผิดพลาด", "หมดเวลา", "ยกเลิก" หรือ "parsererror") .

ดู: jQuery ajax

ดังนั้นคุณจะทำ:

jqxhr.status เพื่อรับสถานะ


2

NB: การใช้ jQuery 3.4.1

$.ajax({
  url: URL,
  success: function(data, textStatus, jqXHR){
    console.log(textStatus + ": " + jqXHR.status);
    // do something with data
  },
  error: function(jqXHR, textStatus, errorThrown){
    console.log(textStatus + ": " + jqXHR.status + " " + errorThrown);
  }
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.