在 Codeigniter 4 中从 C++ 应用程序捕获 post 数据

Capturing post data from C++ application in Codeigniter 4

我正在将我们的网站从 Codeigniter 3 升级到 Codeigniter 4。到目前为止,一切都很繁琐,但大部分进展顺利。我现在 运行 遇到一个问题,控制器无法识别用 C++ 编写的应用程序的发布值。 这个应用程序已经与 CI3 合作多年,但是......好吧,CI4。我不知道有关 C++ 应用程序的所有详细信息,但开发人员向我保证他肯定使用 HTTP_VERB_POST 将数据发送到控制器。 ----编辑----- 这是调用相关控制器的 C++ 应用程序的代码:

subscriptioninfo = pSession->OpenRequest(CHttpConnection::HTTP_VERB_POST, address, NULL, NULL, NULL, NULL, INTERNET_FLAG_SECURE | INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE);

我已经为控制器创建了一个视图,并且 CAN 使用我的浏览器从表单中成功 Post 值。

但是 - Post从应用程序 1) 告诉我请求方法是 GET 和 2) 根本没有传递任何值。但是它确实如此 - 如果没有值传递给控制器​​,请向我发送我期望的响应......

将以下内容添加到我的控制器后:

        header('Access-Control-Allow-Origin: *');
        echo $this->request->getMethod();
        echo "\n POST VARS = ";
        print_r($_POST);
        echo "\n GET VARS = ";
        print_r($_GET);
        echo "\n";

我得到以下结果:

get
 POST VARS = Array
(
)

 GET VARS = Array
(
)

Activation: No
Error: No parameters sent.

如果确实没有发送任何参数,最后两行(Activation 和 Error)是我希望从该控制器获得的内容。

哦 - 不,我的 CI 4 应用程序中没有启用 CSRF(默认的基于 Cookie 的 CSRF 保护除外)。

如有任何想法,我们将不胜感激!


我尝试了很多不同的东西,我认为问题是 CI4 没有从 C++ 应用程序接收到 Content-Type header。它是这样明确设置的:

CString strHeaders = _T("Content-Type: application/x-www-form-urlencoded");

这是 CI4 和 CI3 在同一台服务器上收到的 header 的简单打印。 (我已将我的旧 CI3 应用程序复制到 CI4 的 Public 目录中名为 'dev' 的目录。)

Headers 来自 Public 文件夹中的 CI3

host: test.site.com
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Authorization: Basic XXXXXXXXXXXXXXXXXXXX
Content-Type: application/x-www-form-urlencoded
Cookie: ci_session=9do54stine1po2c0tren49gr17eq068g
User-Agent: CustomName
X-Forwarded-For: 96.68.149.126
X-Forwarded-Port: 443
X-Forwarded-Proto: https
Content-Length: 164
Connection: keep-alive

来自CI3

的回应
Subscription number: 9999999999999999
Activation: No
Error: Activation Key does not exist.

Headers 来自 CI4

host: test.site.com
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Authorization: Basic XXXXXXXXXXXXXXXXXXXX
Cookie: ci_session=g6v3qlgms2bv3ijv19hpl3cgnvnbg4kk
User-Agent: CustomName
X-Forwarded-For: 96.68.149.126
X-Forwarded-Port: 443
X-Forwarded-Proto: https
Connection: keep-alive

CI4

的回复
Subscription number:
Activation: No
Error: No parameters sent.

如您所见 - C++ 应用程序连接到 CI3 控制器,header 中的 Content-Type 和 returns 是我期望的我传入的参数。但是,CI4 没有收到 Content-Type header 并告诉我没有传递任何参数。

关于为什么 CI4 无法识别 C++ 应用程序发送的 Content-Type 有什么想法吗?

Codeigniter 4 在 public.htaccess 文件中有以下内容:

# Redirect Trailing Slashes...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]

从 url 中删除结尾的斜杠。删除那三行

# Redirect Trailing Slashes...
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteCond %{REQUEST_URI} (.+)/$
# RewriteRule ^ %1 [L,R=301]

保留尾部斜线。现在 C++ 应用程序能够成功 post 到 CI 控制器。

我还不知道什么蠕虫可以打开,但它确实解决了问题。