node.js http 'get' yêu cầu với các tham số chuỗi truy vấn


83

Tôi có một ứng dụng Node.js là một ứng dụng khách http (tại thời điểm này). Vì vậy, tôi đang làm:

var query = require('querystring').stringify(propertiesObject);
http.get(url + query, function(res) {
   console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
    console.log("Got error: " + e.message);
});

Đây có vẻ như là một cách đủ tốt để thực hiện điều này. Tuy nhiên, tôi hơi bối rối rằng tôi phải làm url + querytừng bước. Điều này nên được đóng gói bởi một thư viện chung, nhưng tôi không thấy điều này tồn tại trong httpthư viện của nút và tôi không chắc gói npm tiêu chuẩn nào có thể thực hiện được nó. Có cách nào được sử dụng rộng rãi hợp lý tốt hơn không?

Phương thức url.format tiết kiệm công việc xây dựng URL riêng. Nhưng lý tưởng nhất là yêu cầu sẽ cao hơn mức này.



Câu trả lời:


158

Kiểm tra mô-đun yêu cầu .

Nó có đầy đủ tính năng hơn so với ứng dụng khách http được tích hợp sẵn của nút.

var request = require('request');

var propertiesObject = { field1:'test1', field2:'test2' };

request({url:url, qs:propertiesObject}, function(err, response, body) {
  if(err) { console.log(err); return; }
  console.log("Get response: " + response.statusCode);
});

Một thuộc tính điển hìnhObject sẽ trông như thế nào? Tôi không thể có được điều này để làm việc
user264230

3
Qs là khóa chuỗi truy vấn. Vì vậy, những trường nào bạn muốn trong chuỗi truy vấn. {field1: 'test1', field2: 'test2'}
Daniel

Có ai biết cách thực hiện việc này chỉ với mô-đun http lõi Nodejs không?
Alexander Mills

1
@AlexanderMills xem câu trả lời của tôi. Thư viện của bên thứ 3 là không cần thiết.
Justin Meiners

8
Mô-đun yêu cầu hiện đã lỗi thời và không được dùng nữa.
AmiNadimi

19

Không cần thư viện của bên thứ 3. Sử dụng mô-đun url nodejs để tạo URL với các tham số truy vấn:

const requestUrl = url.parse(url.format({
    protocol: 'https',
    hostname: 'yoursite.com',
    pathname: '/the/path',
    query: {
        key: value
    }
}));

Sau đó, thực hiện yêu cầu với url được định dạng. requestUrl.pathsẽ bao gồm các tham số truy vấn.

const req = https.get({
    hostname: requestUrl.hostname,
    path: requestUrl.path,
}, (res) => {
   // ...
})

Tôi sẽ thử và sử dụng giải pháp này vì tôi muốn sử dụng một số mã hiện có sử dụng tích hợp sẵn https, tuy nhiên OP đã yêu cầu các thư viện và / hoặc trừu tượng cấp cao hơn để soạn các chuỗi URL với các truy vấn, vì vậy tôi nghĩ rằng câu trả lời hợp lệ hơn về mặt cá nhân
Scott Anderson

2
@ScottAnderson Tôi không sao nếu tôi không phải là câu trả lời được chấp nhận. Chỉ muốn giúp mọi người hoàn thành những gì họ cần. Rất vui vì nó có thể giúp ích cho bạn.
Justin Meiners

6

Nếu bạn không muốn sử dụng gói bên ngoài, chỉ cần thêm chức năng sau vào các tiện ích của bạn:

var params=function(req){
  let q=req.url.split('?'),result={};
  if(q.length>=2){
      q[1].split('&').forEach((item)=>{
           try {
             result[item.split('=')[0]]=item.split('=')[1];
           } catch (e) {
             result[item.split('=')[0]]='';
           }
      })
  }
  return result;
}

Sau đó, khi createServergọi lại, hãy thêm thuộc tính paramsvào requestđối tượng:

 http.createServer(function(req,res){
     req.params=params(req); // call the function above ;
      /**
       * http://mysite/add?name=Ahmed
       */
     console.log(req.params.name) ; // display : "Ahmed"

})

2
Câu hỏi của OP liên quan đến máy khách http, không phải máy chủ http. Câu trả lời này có liên quan để phân tích cú pháp các chuỗi truy vấn trong máy chủ http, không mã hóa các chuỗi truy vấn cho một yêu cầu http.
Stephen Schaub

Điều này đang làm ngược lại với những gì câu hỏi đang hỏi, và tốt hơn là sử dụng mô-đun tích hợp của Nodequerystring hơn là cố gắng tự phân tích cú pháp này.
peterflynn

6

Tôi đã gặp khó khăn với cách thêm các tham số chuỗi truy vấn vào URL của mình. Tôi không thể làm cho nó hoạt động cho đến khi tôi nhận ra rằng tôi cần phải thêm ?vào cuối URL của mình, nếu không nó sẽ không hoạt động. Điều này rất quan trọng vì nó sẽ giúp bạn tiết kiệm hàng giờ gỡ lỗi, tin tôi đi: đã có ... làm được điều đó .

Dưới đây, là một Điểm cuối API đơn giản gọi API Thời tiết Mở và chuyển APPID, latcũng lonnhư các tham số truy vấn và trả về dữ liệu thời tiết dưới dạng một JSONđối tượng. Hi vọng điêu nay co ich.

//Load the request module
var request = require('request');

//Load the query String module
var querystring = require('querystring');

// Load OpenWeather Credentials
var OpenWeatherAppId = require('../config/third-party').openWeather;

router.post('/getCurrentWeather', function (req, res) {
    var urlOpenWeatherCurrent = 'http://api.openweathermap.org/data/2.5/weather?'
    var queryObject = {
        APPID: OpenWeatherAppId.appId,
        lat: req.body.lat,
        lon: req.body.lon
    }
    console.log(queryObject)
    request({
        url:urlOpenWeatherCurrent,
        qs: queryObject
    }, function (error, response, body) {
        if (error) {
            console.log('error:', error); // Print the error if one occurred

        } else if(response && body) {
            console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
            res.json({'body': body}); // Print JSON response.
        }
    })
})  

Hoặc nếu bạn muốn sử dụng querystringmô-đun, hãy thực hiện các thay đổi sau

var queryObject = querystring.stringify({
    APPID: OpenWeatherAppId.appId,
    lat: req.body.lat,
    lon: req.body.lon
});

request({
   url:urlOpenWeatherCurrent + queryObject
}, function (error, response, body) {...})

1

Nếu bạn cần gửi GETyêu cầu đến một IPcũng như một Domain(Các câu trả lời khác không đề cập đến bạn có thể chỉ định một portbiến), bạn có thể sử dụng hàm này:

function getCode(host, port, path, queryString) {
    console.log("(" + host + ":" + port + path + ")" + "Running httpHelper.getCode()")

    // Construct url and query string
    const requestUrl = url.parse(url.format({
        protocol: 'http',
        hostname: host,
        pathname: path,
        port: port,
        query: queryString
    }));

    console.log("(" + host + path + ")" + "Sending GET request")
    // Send request
    console.log(url.format(requestUrl))
    http.get(url.format(requestUrl), (resp) => {
        let data = '';

        // A chunk of data has been received.
        resp.on('data', (chunk) => {
            console.log("GET chunk: " + chunk);
            data += chunk;
        });

        // The whole response has been received. Print out the result.
        resp.on('end', () => {
            console.log("GET end of response: " + data);
        });

    }).on("error", (err) => {
        console.log("GET Error: " + err);
    });
}

Đừng bỏ lỡ yêu cầu mô-đun ở đầu tệp của bạn:

http = require("http");
url = require('url')

Cũng xin lưu ý rằng bạn có thể sử dụng httpsmô-đun để giao tiếp qua mạng an toàn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.