使用curl对接一个接口,这个接口在本地,测试服务器,postman以及线上项目相同目录又创建了一个项目都能成功(这个是为了验证线上的linux环境而作的,都能成功);但是把这个接口放到项目里面,这个请求就由POST变成了GET,并且头信息也变了,http code也变成了 404,curl_error 这个也拿不到一点错误;网络上面有人说设置这个 CURLOPT_POSTREDIR 就能解决请求方法不变;但是这个我设置等于 1 或者 3都没有用;哪位高手能帮忙解决下这个问题吗,在此先谢了
是不是配置了什么跨域导致的 nginx 用了吗??
没有啊;我可能问题还没有描述完;这个是某个支付;这个接口是创建订单接口;请求的第三方;在创建订单接口之前还有一个接口时获取token,也是curl的post方式来请求,能够成功获取到token,唯一的区别就是,token接口模拟的是表单提交;而创建订单接口是传的json数据;跨域这些都是没有问题的; 你只显示了一个请求,我怀疑它是第二个请求,其中第一个是POST,你在这里看到的GET是在重定向之后完成的。
当遵循基于响应中30x代码的重定向并且行为由HTTP 1.1规范(RFC 7230和朋友)引导时,curl 可以切换到GET(这个问题已经验证不是这个问题,我把token分开来获取也可以,就是进入页面就拿到token,点支付按钮创建订单;分开了也还是不可以)。 途中有curl设置
可以尝试修改一下请求头信息,将 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
这个之前有遇到过,你先这试试:
-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跟一下这个请求个链路,之后检查一下下面的几点