curl post 变成了get

使用curl对接一个接口,这个接口在本地,测试服务器,postman以及线上项目相同目录又创建了一个项目都能成功(这个是为了验证线上的linux环境而作的,都能成功);但是把这个接口放到项目里面,这个请求就由POST变成了GET,并且头信息也变了,http code也变成了 404,curl_error 这个也拿不到一点错误;网络上面有人说设置这个 CURLOPT_POSTREDIR 就能解决请求方法不变;但是这个我设置等于 1 或者 3都没有用;哪位高手能帮忙解决下这个问题吗,在此先谢了

img

是不是配置了什么跨域导致的 nginx 用了吗??

没有啊;我可能问题还没有描述完;这个是某个支付;这个接口是创建订单接口;请求的第三方;在创建订单接口之前还有一个接口时获取token,也是curl的post方式来请求,能够成功获取到token,唯一的区别就是,token接口模拟的是表单提交;而创建订单接口是传的json数据;跨域这些都是没有问题的; 你只显示了一个请求,我怀疑它是第二个请求,其中第一个是POST,你在这里看到的GET是在重定向之后完成的。
当遵循基于响应中30x代码的重定向并且行为由HTTP 1.1规范(RFC 7230和朋友)引导时,curl 可以切换到GET(这个问题已经验证不是这个问题,我把token分开来获取也可以,就是进入页面就拿到token,点支付按钮创建订单;分开了也还是不可以)。 途中有curl设置

img

可以尝试修改一下请求头信息,将 Content-Type 设置为 application/x-www-form-urlencoded,同时修改 CURLOPT_POSTFIELDS 为表单格式的数据,而不是 JSON 格式的数据。另外,可以尝试将 CURLOPT_POST 设置为 true,表示使用 POST 请求方式,并且将 CURLOPT_CUSTOMREQUEST 设置为 null,这样 curl 就会使用默认的 POST 方法发送请求。最后,可以在 curl_exec() 前加上一个 curl_setopt($curl, CURLOPT_FAILONERROR, true); 语句,表示如果出现错误,则会立即停止请求并返回错误信息。参考代码如下:

$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS =>10,
    CURLOPT_TIMEOUT => 600,
    CURLINFO_HEADER_OUT => 1,
    CURLOPT_VERBOSE => 1,
    CURLOPT_USERAGENT => $_SERVER["HTTP_USER_AGENT"],
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query([
        "intent" => "CAPTURE",
        "purchase_units" => [
            "amount" => [
                "currency_code" => "EUR",
                "value" => "40.0"
            ]
        ]
    ]),
    CURLOPT_HTTPHEADER => array(
        'Authorization: Bearer A21AANGfuX4mSFXOTLiygm7hu-ETEHesNuJmEShPiMSeEJLXdewHytvCnR3TEX6UZR_KCjogSFEU8rxgOHqauaW_8aN9110w',
        'Content-Type: application/x-www-form-urlencoded',
    ),
));

curl_setopt($curl, CURLOPT_FAILONERROR, true);

$response = curl_exec($curl);
$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$head = curl_getinfo($curl, CURLINFO_HEADER_OUT);


```php

// URL 地址和 POST 数据
$url = 'http://xxxx.com/api';
$data = array(
    'param1' => 'value1',
    'param2' => 'value2'
);

// 创建 cURL 请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// 发送请求并获取响应内容
$response = curl_exec($ch);

// 关闭 cURL 资源
curl_close($ch);

// 处理响应结果
if ($response === false) {
    echo 'cURL Error: ' . curl_error($ch);
} else {
    echo $response;
}

```

curl_setopt($ch, CURLOPT_URL, $url):设置需要发送请求的 URL 地址;
curl_setopt($ch, CURLOPT_POST, 1):指定发送 POST 请求;
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)):设置 POST 请求的数据,可以是数组或字符串;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true):将响应结果以字符串形式返回,而不是直接输出。

你第一个截图使用了method.Get

这个之前有遇到过,你先这试试:

  1. 代码实现方面的问题:你需要检查你的代码,仔细排查在项目中是否覆盖了某些 curl 请求的参数或者方法,或者在请求过程中是否存在某些逻辑上的问题。
  2. URL 形式问题:请确保在项目中 URL 地址的形式与其他环境中的形式相同,例如是否添加了协议头(http/https)、端口号和路径等。
    还是不行的话,你可以尝试使用 Curl 的 -v 参数,可以看到很多的信息 再进一步排查

没看到你的请求代码,不好判断为什么post会变成get请求。最好把代码贴出来,或者你的项目和新建的项目代码有什么区别以便判断问题。

用这个改改:
curl --location 'http://192.168.3.109:9080/EKMSVersion' --header 'appID: 013d6563-da03-4013-9ee7-379a3b883e86' --header 'version: v1' --header 'format: BASE64' --header 'Content-Type: application/json' --data '{}'
或者
您不是说postman成功了吗,从postman直接导出curl也行

php curl同时执行post,php – Curl POST作为GET执行
可以参考下
https://blog.csdn.net/weixin_33622555/article/details/115878960

解决了就好

根据你的描述,各种配置都对,代码都没问题的话,那就不可能有问题,现在既然出错了,肯定还是会有错误信息的,可能你没有找对错误信息在哪个地方。
在这种情况下,建议你使用调试模式看看,当发送curl post后每一步是怎么执行的,应该就能定位到哪里出的问题

确保你在请求中包含了正确的参数,特别是请求方法(method)和头信息(headers)。
检查URL,确保你在请求中使用了正确的URL,并验证该URL可以在所在的环境中正常访问。
检查服务器的配置文件,确保没有对请求的URL进行重定向或其他处理,导致请求的方法和头信息发生变化。
可以使用命令行工具(如cURL)或浏览器的开发者工具来发送请求并查看返回结果和请求头信息,以便进一步调试问题。
查看服务器的错误日志,以获取更多关于404错误的详细信息,可能是由于服务器端的问题导致的。

可以在后端中把POST和GET两种请求方式都放开,这样无论是使用POST或者GET都可以请求到

看看你后端是怎么写的,POST、GET的请求方式是在后端代码中设置的controller层控制的

建议检查项目中的代码和配置,特别是与请求相关的部分,例如路由、中间件、拦截器这些东西。
可以先在项目中使用Guzzle或者Requests 客户端库进行请求看是否能够成功。如果也无法成功,那么可能是项目中的代码或配置问题。如果可以成功,那么可能是 curl 库的使用问题

更新断点 跟不了断点用arthas跟一下这个请求个链路,之后检查一下下面的几点

  1. 检查代码:确保在调用curl时使用了正确的HTTP方法和头信息。如果代码中使用了错误的HTTP方法或头信息,可能会导致请求失败或被重定向到其他页面。
  2. 检查服务器配置:检查的服务器配置,确保服务器支持使用的HTTP方法和头信息。如果服务器不支持使用的HTTP方法或头信息,则可能会导致请求失败或被重定向到其他页面。
  3. 检查URL:断点请检查URL,确保正在向正确的端点发送请求。
  4. 检查网络连接:请检查网络连接,确保可以访问该接口。如果网络连接不稳定或存在问题,则可能会导致请求失败或被重定向到其他页面。