0

我有一个使用 GET 方法启动 HTTP 连接的 Java 程序。它看起来像这样:

String urlString = "http://10.205.110.250/cgiApp?envVariable";
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");

我知道这段代码确实有效,但这就是它变得棘手的地方......我有一个用 C++ 编写的 CGI 应用程序,看起来像这样:

int main() {
    char* url = getenv("QUERY_STRING");
    int pipe = open(PATH_TO_FIFO, O_WRONLY);
    write(pipe,url,256);
    close(pipe);
    return 0;
}

还有一个运行以接收 QUERY_STRING 并将其打印出来的程序:

int main () {
    char url[256];
    int pipe;
    pipe = open(PATH_TO_FIFO, O_RDONLY);
    read(pipe,url,256);
    close(pipe);
    cout << url << endl;
    return 0;
}

当我在浏览器中键入 HTTP 请求时,我已经确认 C++ 应用程序可以正常工作。例如,如果我输入

http://10.205.110.250/cgiApp?envVariable 

进入浏览器,并且接收程序正在运行,它将打印出“envVariable”

但是,当我运行 Java 程序时,它要么打印出乱码,要么什么都不打印(但仍然返回)。从我所做的初步研究来看,Java String 变量可能与 C++ 不兼容,或者它的编码方式不同。所以我的问题是,为什么我的 C++ 程序在从 Java 程序发送时不能打印出“envVariable”,但从浏览器发送时可以,我该如何修复它?

4

2 回答 2

1

您的 CGI 脚本对于它是从 Java 调用、被浏览器访问还是以其他方式访问一无所知——它应该只知道“嘿,我收到了一个 HTTP GET 请求”。它与Java类型的编码无关。String

阅读URLConnection的文档,需要connect()在打开连接并设置请求类型后调用该方法。运行 CGI 脚本时很可能会出现乱码,因为它指向一些未初始化的内存块。您可以使用 Wireshark 或 Charles Proxy 之类的工具来查看实际的 HTTP 请求。

于 2012-11-29T01:11:34.777 回答
1

您的网络浏览器可能正在发送额外的标头和/或接受/解码来自 CGI 应用程序的输出。如果您在 java 程序(和您的浏览器)和 CGI​​ 应用程序之间插入一个调试代理,您可以看到每个程序发送的内容以及来自 CGI 应用程序的响应。

于 2012-11-29T01:11:37.130 回答