大家进来看看帮帮忙,关于Nodejs的问题
大家进来看看帮帮忙,关于Nodejs的问题
/** 主函数*/
function main(a_route,a_handle) {
function onRequest(a_req, a_res) {
a_res.writeHead(200, {'Content-Type': 'text/plain'});
a_req.setEncoding('utf8');
var t_str=urllib.parse(a_req.url,true).query.json;//接收字符串
/********************/
console.log("1url:\n"+a_req.url);
console.log("data:\n"+t_str);
/********************/
var t_obj=JSON.parse(t_str);//将字符串转换成json
a_route(a_handle,t_obj.interfaceid,t_obj,a_res);
a_res.end();
}
http.createServer(onRequest).listen(port);
}
写了以上的代码,用浏览器访问http://192.168.0.152:8888/?json={“interfaceid”:“0x1001”,“mac”:“cat”,“gameid”:“23”} 是可以正确解析和使用的, 用C++的编写了一个client端进行访问的时候以上代码报错,经过打印发现时URL为空,找了好久找不是哪里写的问题,client可以跟定是发送了东西的。请高手指点下
回答内容
你好!根据你提供的代码和描述,问题可能出在客户端发送请求的方式上。在使用C++客户端发送HTTP请求时,需要确保请求格式正确,并且包含了必要的头部信息。
以下是你的代码片段,我稍作修改以更好地解释和处理可能出现的问题:
// 引入必要的模块
const http = require('http');
const url = require('url');
/** 主函数 */
function main(a_route, a_handle, port) {
function onRequest(a_req, a_res) {
// 设置响应头
a_res.writeHead(200, {'Content-Type': 'text/plain'});
// 解码请求体
let t_str = '';
a_req.on('data', (chunk) => {
t_str += chunk;
});
a_req.on('end', () => {
try {
// 将请求体转换为JSON对象
const t_obj = JSON.parse(decodeURIComponent(t_str));
// 打印日志
console.log("URL:\n" + a_req.url);
console.log("Data:\n" + t_str);
// 调用路由处理函数
a_route(a_handle, t_obj.interfaceid, t_obj, a_res);
} catch (error) {
// 如果解析失败,返回错误信息
a_res.writeHead(400, {'Content-Type': 'text/plain'});
a_res.end('Invalid JSON data');
}
});
a_res.end();
}
// 创建HTTP服务器并监听指定端口
http.createServer(onRequest).listen(port, () => {
console.log(`Server running at http://192.168.0.152:${port}/`);
});
}
// 示例路由处理函数
function route(handle, interfaceId, data, response) {
if (handle[interfaceId]) {
handle[interfaceId](data, response);
} else {
response.writeHead(404, {'Content-Type': 'text/plain'});
response.end('Not Found');
}
}
// 示例处理函数
const handlers = {
'0x1001': (data, response) => {
response.end(`Received data: ${JSON.stringify(data)}`);
}
};
// 启动服务器
main(route, handlers, 8888);
关键点解释
-
数据处理:
- 使用
a_req.on('data', ...)
和a_req.on('end', ...)
来处理请求体,确保接收到完整的数据。 - 使用
decodeURIComponent
对请求体进行解码,因为C++发送的请求体可能包含URL编码。
- 使用
-
错误处理:
- 使用
try-catch
块来捕获JSON解析错误,如果解析失败,则返回错误信息。
- 使用
-
日志打印:
- 打印请求的URL和数据,以便调试。
C++ 客户端示例
确保C++客户端发送的请求格式正确。以下是一个简单的C++客户端示例,使用 libcurl
发送HTTP请求:
#include <iostream>
#include <string>
#include <curl/curl.h>
int main() {
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
std::string post_fields = "json={\"interfaceid\":\"0x1001\",\"mac\":\"cat\",\"gameid\":\"23\"}";
curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.152:8888/");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_fields.c_str());
// 执行请求
res = curl_easy_perform(curl);
if(res != CURLE_OK)
std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
// 清理
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
希望这些信息能帮助你解决问题!如果还有其他疑问,请随时提问。
浏览器访问时会对url进行urlencode,你用chrome浏览器。看network,看看实际请求的样子。
不太明白~
比较好奇。我觉得 c++服务端+js客户端的情况比js服务端+c++客户端的情况多很多。你的技术选型是咋样的?
从你的描述来看,问题可能出在C++客户端发送请求的方式上,而不是Node.js服务器端的代码。Node.js代码本身看起来没有明显的问题,它能够正确处理GET请求中的查询字符串。
示例代码
以下是完整的Node.js代码示例:
const http = require('http');
const url = require('url');
// 模拟路由处理函数
function route(handle, interfaceId, obj, res) {
console.log(`Route for ${interfaceId}`);
res.write(`Received request for interfaceId: ${interfaceId}\n`);
res.end(JSON.stringify(obj));
}
function main(port, handle) {
const server = http.createServer((req, res) => {
req.setEncoding('utf8');
// 解析URL中的查询字符串
const parsedUrl = url.parse(req.url, true);
const t_str = JSON.stringify(parsedUrl.query);
console.log("1url:\n" + req.url);
console.log("data:\n" + t_str);
// 解析为JSON对象
const t_obj = parsedUrl.query;
// 调用路由处理函数
route(handle, t_obj.interfaceid, t_obj, res);
res.end();
});
server.listen(port, () => {
console.log(`Server is listening on port ${port}`);
});
}
// 示例调用
main(8888, {});
C++客户端示例
假设你使用的是libcurl
库来发送HTTP请求,以下是一个简单的C++客户端示例:
#include <iostream>
#include <string>
#include <curl/curl.h>
int main() {
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if (curl) {
std::string url = "http://192.168.0.152:8888/?json={\"interfaceid\":\"0x1001\",\"mac\":\"cat\",\"gameid\":\"23\"}";
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
res = curl_easy_perform(curl);
if (res != CURLE_OK)
std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
可能的问题
- URL编码:确保URL中的特殊字符被正确编码。
- C++ 客户端设置:检查是否设置了正确的
Content-Type
和Accept
头。 - 错误处理:添加错误处理机制,以确保在网络请求过程中捕获到任何潜在的错误。
如果你已经确认了上述几个方面都没有问题,那么请再次检查C++客户端发送的数据格式和结构是否与预期一致。