【问题标题】:POST works on Postman, but not with CURLPOST 适用于 Postman,但不适用于 CURL
【发布时间】:2015-09-19 11:39:33
【问题描述】:

使用邮递员,我发送一个 POST 到(我的用户名和密码已填写):

https://ssl.reddit.com/api/login?api_type=json&user=XXX&passwd=XXX&rem=True 

我收到一个包含 modhash 和 cookie 的响应。然后,我用邮递员发送第二个 POST 到:

https://en.reddit.com/api/comment?api_type=json&text=7/1/15TEST&thing_id=t1_csa56v2

带有以下标题(XXX已确认并填写):

User-Agent: XXX
Cookie: reddit_session=XXX
X-Modhash: XXX

这提供了正确的响应,但是当我尝试在我的 PHP 中使用 CURL 做同样的事情时,它会响应 USER_REQUIRED。我再次确认 cookie 和 modhash 是正确的。

$name = 't1_csa56v2';
$text = 'NEWEST TEST 7/2/15 12:20am';
$url = 'https://en.reddit.com/api/comment';

$modhash = 'XXX';
$cookie = 'XXX';

$headerFields = array (
    'User-Agent' => 'XXX',
    'Cookie' => 'reddit_session='.$cookie,
    'X-Modhash' => $modhash 
);

$postFields = array (
    'api_type' => 'json',
    'text' => $text,
    'thing_id' => $name
);


$field_string = http_build_query($postFields);

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerFields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 3);
curl_setopt($ch, CURLOPT_POSTFIELDS, $field_string);
$response = curl_exec($ch);

我做错了什么?为什么我不能得到相同的响应?

邮递员截图:

【问题讨论】:

  • 您正在使用 url 发送用户名和密码查询(就像发送 GET 请求)。使用 Curl 发送 POST 请求。
  • @NeerajVerma 哦,对不起,我忘了包括您可以指定邮递员发送 POST
  • 但是仅仅指定发送 POST 请求是不够的。您需要发送 POST 数据。但在这里你是在 URL 中发送数据。
  • 所以我将帖子字段添加到 POST 选项后列出的 URL 参数部分,它会自动吐出我在这里粘贴的 URL,我 99% 确定那是我添加帖子参数的地方
  • 如果您可以分享邮递员请求的屏幕截图会有所帮助。或者尝试使用与 CURL 请求相同的 url。由于使用邮递员和使用 CURL 的 URL 不一样。我的意思是在发出 CURL 请求时在 URL 查询中发送数据。

标签: php curl postman


【解决方案1】:
<?php 
error_reporting(E_ALL);
$name = 't1_csa56v2';
$text = 'NEWEST TEST 7/2/15 12:20am';
$url = 'https://en.reddit.com/api/comment';

$modhash = 'XXX';
$cookie = 'XXX';

$headerFields = array (
    'X-Modhash' => $modhash 
);

$postFields = array (
    'api_type' => 'json',
    'text' => $text,
    'thing_id' => $name
);



$ch = curl_init($url);
assert(curl_setopt_array($ch,
array(
        CURLOPT_AUTOREFERER => true,
        CURLOPT_BINARYTRANSFER => true,
        CURLOPT_COOKIESESSION => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_FORBID_REUSE => false,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_CONNECTTIMEOUT => 10,
        CURLOPT_TIMEOUT => 11,
        CURLOPT_ENCODING=>"",
        CURLOPT_USERAGENT=>'XXX',
        CURLOPT_COOKIE=>'reddit_session='.$cookie,
        CURLOPT_HTTPHEADER=>$headerFields,
        CURLOPT_POST=>true,
        CURLOPT_POSTFIELDS=>$postFields,
)));
$response = curl_exec($ch);

试试这个.. 不知道你到底做错了什么,但用户代理应该用 CURLOPT_USERAGENT 设置,cookie 应该用 CURLOPT_COOKIE 设置,你应该让 curl 为你编码,而不是使用 http_build_query ,并且您应该将其显式设置为 POST 请求,默认情况下为 GET 请求。还应该启用 E_ALL 错误报告

【讨论】:

  • 非常感谢您的回答!没想到昨天和今天还要出差,回来后会尽快试试你的建议。只是不想让你认为我忽略了你!
  • 感谢您,无法请求添加用户代理并正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 2020-06-17
  • 1970-01-01
相关资源
最近更新 更多