0

Postman是一个 API 测试接口,我可以使用它来成功地进行特定的 API 调用。我正在尝试使用 CURL 在 PHP 中做同样的事情,但是 API 期望格式的方式存在问题......

假设我的 URL 是 /post。/post 之后的唯一变量是“auth=asdf1234etc”,然后是 XML 数据。所以我使用邮递员

/post?auth=asdf1234etc

它位于 URL 部分,它有一个原始 XML 数据发布部分,我在其中放置了 My XML:

<?xml version="1.0" encoding="UTF-8"?><usageReports><usageReport></usageReport></usageReports>

我的问题是 XML 不是变量,其中 asdf1234etc 是密钥 auth 的值,我的 XML 是没有密钥的值——所以我不知道如何使用 CURL 发布帖子。

这是我的 PHP 不起作用——我得到 401 未授权,因为程序认为 ?auth="..." 之后的所有内容都是身份验证令牌。但是,如果我在 auth 令牌之后放置一个 &,它也不起作用,因为在一个 & 之后,我必须执行 key=value,而我没有密钥。

$URL = "/post?auth=asdf1234etc";
$usage_report = '<?xml version="1.0" encoding="UTF-8"?><usageReports><usageReport></usageReport></usageReports>';
$fields = array("Host" => "/post",
                    "Content-type" => "application/xml",
                    "Content-length" => strlen($usage_report),
                    "data" => $usage_report);//note that my xml is not a variable and I don't expect this specific line to work.
$fields_string = "&";
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string,'&');
//open connection
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $URL);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $fields);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
$array_data = json_decode(json_encode(simplexml_load_string($result)), true);
//view response
echo "\n\n";
print_r($array_data);
echo "\n";

真正有用的是,如果邮递员的输出是包含所有内容的文字 URL,则发布 URL 基础 + authtoken + XML——因为我可以在邮递员中完成(200 OK),只是无法获取 PHP做同样的事情。

我打开了 CURLOPT_VERBOSE,这里可能有一些有用的信息:

POST /post?asdf123etc HTTP/1.1
Host: hidden.domain.com
Accept: */*
Content-Length: 335      //Why 335? strlen($usage_report) is 248?
Content-Type: application/x-www-form-urlencoded    //why is it changing from application/xml to this?

-it’s not a certificate issue
-it’s not a connection to host issue
-it’s kindof an auth issue, because it thinks that everything after ? is the auth token
-it’s an interesting problem because I can’t set the xml to a key in the fields array
-the xml constructed and urls I use work when using postman
-not an issue of xml format

ps 如果您认为您找到了重复项,请确保他们在发布不是 httpheader 的 XML 时也询问要做什么。(不是这样的)

4

1 回答 1

0

从您的代码中删除这些行:

$fields = array("Host" => "/post",
                "Content-type" => "application/xml",
                "Content-length" => strlen($usage_report),
                "data" => $usage_report);//note that my xml is not a variable and I don't expect this specific line to work.
$fields_string = "&";
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string,'&');

现在,首先修复您的 xml 字符串。您没有从 xml 中转义引号。所以使用这个:

$usage_report = '<?xml version="1.0" encoding="UTF-8"?><usageReports><usageReport></usageReport></usageReports>';

将这两个 curl 选项替换为您现有的选项。这里它发布 XML 数据:

curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: application/xml")); // or text/xml
curl_setopt($ch, CURLOPT_POSTFIELDS, $usage_report);

您的详细输出表明您使用了正确的 url。但仍要仔细检查,确保网址正确。目前它在您的代码中使用 URI 而不是 URL:

$URL = "/post?auth=asdf1234etc";
于 2014-03-17T22:01:22.360 回答