2013-05-22 50 views
44

Tôi đang cố gắng theo dõi trên một url chuyển hướng tôi đến một trang khác bằng cách sử dụng các nút bấm số request module.Làm cách nào để nhận được url được chuyển hướng từ mô-đun yêu cầu nodejs?

Kết hợp thông qua tài liệu, tôi không thể tìm thấy bất kỳ thứ gì cho phép tôi truy xuất url sau khi chuyển hướng.

Mã của tôi là như sau:

var request = require("request"), 
    options = { 
     uri: 'http://www.someredirect.com/somepage.asp', 
     timeout: 2000, 
     followAllRedirects: true 
    }; 

request(options, function(error, response, body) { 

    console.log(response); 

}); 

Trả lời

46

Có hai cách rất dễ dàng để giữ url cuối cùng trong chuỗi chuyển hướng.

var r = request(url, function (e, response) { 
    r.uri 
    response.request.uri 
}) 

Uri là một đối tượng. uri.href chứa url, với tham số truy vấn, dưới dạng chuỗi.

Mã này xuất phát từ một nhận xét về vấn đề github bởi tác giả yêu cầu của: https://github.com/mikeal/request/pull/220#issuecomment-5012579

Ví dụ:

var request = require('request'); 
var r = request.get('http://google.com?q=foo', function (err, res, body) { 
    console.log(r.uri.href); 
    console.log(res.request.uri.href); 

    // Mikael doesn't mention getting the uri using 'this' so maybe it's best to avoid it 
    // please add a comment if you know why this might be bad 
    console.log(this.uri.href); 
}); 

này sẽ in http://www.google.com/?q=foo ba lần (lưu ý rằng chúng tôi đã chuyển đến một địa chỉ với www từ một cái không có).

+0

Bạn đã nói rằng mã trên chuyển hướng ba lần, làm thế nào để tôi biết chạy là lần lặp cuối cùng? – hitautodestruct

+1

Nó không chuyển hướng ba lần. Nó in URL bạn đã được chuyển hướng đến theo ba cách khác nhau. Xin lỗi nếu điều đó không rõ ràng. – gabrielf

+1

@gabrielf, Không có 'this', bởi vì chúng ta có thể sử dụng 'es6'. –

5

request được đổi hướng theo mặc định, nó có thể nhận được thông qua 10 trang đổi hướng theo mặc định. Bạn có thể kiểm tra điều này trong docs. Nhược điểm của điều này là bạn sẽ không biết nếu url bạn nhận được là một chuyển hướng hoặc một bản gốc theo tùy chọn mặc định.

Ví dụ:

request('http://www.google.com', function (error, response, body) { 
    console.log(response.headers) 
    console.log(body) // Print the google web page. 
}) 

cho sản lượng

> { date: 'Wed, 22 May 2013 15:11:58 GMT', 
    expires: '-1', 
    'cache-control': 'private, max-age=0', 
    'content-type': 'text/html; charset=ISO-8859-1', 
    server: 'gws', 
    'x-xss-protection': '1; mode=block', 
    'x-frame-options': 'SAMEORIGIN', 
    'transfer-encoding': 'chunked' } 

nhưng nếu bạn đưa ra lựa chọn followRedirect như sai

request({url:'http://www.google.com',followRedirect :false}, function (error, response, body) { 
    console.log(response.headers) 
    console.log(body) 
}); 

nó mang lại cho

> { location: 'http://www.google.co.in/', 
    'cache-control': 'private', 
    'content-type': 'text/html; charset=UTF-8', 
    date: 'Wed, 22 May 2013 15:12:27 GMT', 
    server: 'gws', 
    'content-length': '221', 
    'x-xss-protection': '1; mode=block', 
    'x-frame-options': 'SAMEORIGIN' } 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> 
<TITLE>302 Moved</TITLE></HEAD><BODY> 
<H1>302 Moved</H1> 
The document has moved 
<A HREF="http://www.google.co.in/">here</A>. 
</BODY></HTML> 

Vì vậy, đừng lo lắng về việc nhận được nội dung được chuyển hướng. Nhưng nếu bạn muốn biết liệu nó có được chuyển hướng hay không được đặt followRedirect sai và kiểm tra tiêu đề location trong phản hồi.

+0

Tôi không hiểu câu cuối cùng của bạn "Nếu bạn muốn biết nếu nó được chuyển hướng đặt 'followRedirect' thành' false' "? Nó sẽ không dừng quá trình chuyển hướng? – hitautodestruct

+0

Theo mặc định, bạn sẽ không nhận được phản hồi 3xx vì chuyển hướng tự động. Vì vậy, nếu bạn muốn biết bạn đã được chuyển hướng/không muốn chuyển hướng, bạn phải cho nó là sai. Nó chỉ là để tìm ra chuyển hướng. – user568109

+0

Hãy tự hỏi mình điều này, bạn đã được chuyển hướng hay chưa (như trong khi thành lập)? bạn cần phải biết những gì bạn đang nhận được là một chuyển hướng (aka dreamworld) hoặc trang trực tiếp (hoặc thực tế). Đó là số của bạn;) – user568109

22

Để tìm Url chuyển hướng thử điều này:

var url = 'http://www.google.com'; 
request({ url: url, followRedirect: false }, function (err, res, body) { 
    console.log(res.headers.location); 
}); 
+0

Đã kết thúc tại đây sau khi tìm kiếm "không theo dõi chuyển hướng theo yêu cầu trong nút", vì vậy cảm ơn! Không chắc chắn cách bao gồm tùy chọn đó. – araneae

+5

'res.headers.location' đã thực hiện công việc cho tôi. – Felix

+2

Có thể không hoạt động như mong đợi nếu có nhiều chuyển hướng tham gia, đưa ra chuyển hướng đầu tiên thay vì chuyển hướng cuối cùng. – Crazometer

0

Bạn có thể sử dụng mẫu hàm cho followRedirects, như thế này:

options.followRedirects = function(response) { 
    var url = require('url'); 
    var from = response.request.href; 
    var to = url.resolve(response.headers.location, response.request.href); 
    return true; 
}; 

request(options, function(error, response, body) { 
    // normal code 
}); 
+0

Điều này có vẻ không hoạt động đúng trong 'yêu cầu 2.75.0' – loretoparisi

Các vấn đề liên quan