2013-06-03 42 views
44

Tôi có một ứng dụng Node.js là một ứng dụng khách http (hiện tại). Vì vậy, tôi đang làm:yêu cầu http 'get' của node.js http 'get' với tham số chuỗi truy vấn

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); 
}); 

Điều này có vẻ như là một cách đủ tốt để thực hiện việc này. Tuy nhiên tôi có phần miffed rằng tôi đã phải làm các bước url + query. Đ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 hiện có trong thư viện của http của nút và tôi không chắc chắn gói npm chuẩn nào có thể thực hiện nó. Có cách nào được sử dụng rộng rãi một cách hợp lý tốt hơn không?

url.format phương pháp lưu công việc xây dựng URL riêng. Nhưng lý tưởng là yêu cầu sẽ cao hơn mức này.

+0

http://nodejs.org/api/url.html#url_url_format_urlobj – SLaks

+0

https://nodejs.org /api/querystring.html – velop

Trả lời

103

Kiểm tra mô-đun request.

Tính năng này đầy đủ hơn so với ứng dụng 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); 
}); 
+0

Thuộc tính điển hìnhObject trông như thế nào? Tôi không thể làm việc này – user264230

+2

Số q là khóa chuỗi truy vấn. Vì vậy, những gì các lĩnh vực bao giờ bạn muốn trong chuỗi truy vấn. {field1: 'test1', field2: 'test2'} – Daniel

3

Nếu bạn không muốn sử dụng gói bên ngoài, Chỉ cần thêm các chức năng sau đây trong hệ thống điện nước:

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 đó, trong createServer cuộc gọi trở lại, thêm thuộc tính params để 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" 

}) 
+1

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

0

Tôi đã đấu tranh với cách thêm 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 tôi, 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 thời gian gỡ lỗi, hãy tin tôi: đã ở đó ... thực hiện điều đó.

Dưới đây, là một API đơn giản Endpoint mà các cuộc gọi Open Weather API và vượt qua APPID, latlon như tham số truy vấn và trả về dữ liệu thời tiết như một đối tượng JSON. 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 các mô-đun querystring, làm những điều sau đây thay đổi

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

request({ 
    url:urlOpenWeatherCurrent + queryObject 
}, function (error, response, body) {...}) 
Các vấn đề liên quan