为什么我的HTTP请求从PHP失败


Why my HTTP request fail from PHP?

我尝试提交一个表单到远程服务器:http://openconvert.clarin.inl.nl/openconvert/tagger#text,因为你可以看到所需的字段是inputformat,和动作url是http://openconvert.clarin.inl.nl/openconvert/text/,所以我尝试以下php:

<?php
function do_post_request($url, $data, $optional_headers = null)
{
  $params = array('http' => array(
    'method' => 'POST',
    'content' => $data
  ));
  if ($optional_headers !== null) {
    $params['http']['header'] = $optional_headers;
  }
  $ctx = stream_context_create($params);
  $fp = @fopen($url, 'rb', false, $ctx);
  if (!$fp) {
    throw new Exception("Problem with $url, $php_errormsg");
  }
  $response = @stream_get_contents($fp);
  if ($response === false) {
    throw new Exception("Problem reading data from $url, $php_errormsg");
  }
  return $response;
}
$remoteurl="http://openconvert.clarin.inl.nl/openconvert/text";
$rawdata=array(
  'input'=>'test',
  'format'=>'text');
$data=http_build_query($rawdata, '', '&amp;'); //flags_, myvar_
var_dump($data);
echo "<br />";
echo do_post_request($remoteurl,$data,'Content-Type: text/html');
?>

我不知道为什么服务器找不到我的数据?

输出为:

string(26) "input=test&amp;format=text"
<br /><?xml version="1.0" encoding="UTF-8"?>
<error>Insufficient parameters. Required parameters: input, format</error>

可能有其他问题,但http_build_query中的&amp;值肯定是错误的。您没有将url编码的数据嵌入到html文档中,因此不应该对&进行html转义。将该行替换为:

http_build_query($rawdata, '', '&amp;'); 

应该更好,但它可能不是您的100%解决方案。

注:永远不要使用@。您正在抑制您应该看到的真实错误。