0

そのため、現在、'GET' および 'POST' プロシージャに広く使用されている 'SendToHost' 関数を実装しようとしています。私の場合、「郵便番号」をショッピング Web サイトの郵便番号入力フォームに送信して、その郵便番号の特定のカタログを取得するために使用したいと考えています。より具体的には、コードは、郵便番号の結果を含む Web ページを自動的に生成する必要があります。以下は、関数と組み合わせた私のコードです。なぜそれが機能しないのか知りたいです:

function SendToHost($host, $method, $path, $data, $useragent=0)
{
  // Supply a default method of GET if the one passed was empty
  if (empty($method))
    $method = 'GET';
  $method = strtoupper($method);
  $fp = fsockopen($host,80);
  if ($method == 'GET')
    $path .= '?' . $data;
  fputs($fp, "$method $path HTTP/1.1\n");
  fputs($fp, "Host: $host\n");
  fputs($fp, "Content-type: application/x-www-form-urlencoded\n");
  fputs($fp, "Content-length: " . strlen($data) . "\n");
  if ($useragent)
    fputs($fp, "User-Agent: MSIE\n");
  fputs($fp, "Connection: close\n\n");
  if ($method == 'POST')
    fputs($fp, $data);

  while (!feof($fp))
    $buf .= fgets($fp,128);
  fclose($fp);
  return $buf;
}

echo sendToHost('catalog.coles.com.au','get','/default.aspx','ctl00_Body_PostcodeTextBox=4122');
4

1 に答える 1

1

ヘッダーで間違った改行スタイルを使用しています。\r\nだけでなく、を使用する必要があります\n

HTTP/1.1 ドキュメントからの引用:

HTTP/1.1 は、エンティティー本体を除くすべてのプロトコル要素の行末マーカーとしてシーケンス CR LF を定義します。

ソース: http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2


単純な POST/GET リクエストを送信するだけの場合は、cURLなどの HTTP ライブラリを使用することをお勧めします。もっと複雑なことをしていない限り、ソケットを手動で開いてヘッダーを送信する理由はありません。

function SendToHost($url, $data, $method='GET', $useragent=FALSE){
    $ch = curl_init();
    $options = array(
        CURLOPT_RETURNTRANSFER => TRUE
    );

    if($method === 'POST'){
        $options += array(
            CURLOPT_URL => $url,
            CURLOPT_POST => TRUE,
            // Passing a string will set `application/x-www-form-urlencoded`
            // Whereas an array will set `multipart/form-data`
            CURLOPT_POSTFIELDS => http_build_query($data)
        );
    }
    elseif($method === 'GET'){
        $options[CURLOPT_URL] = $url . '?' . http_build_query($data);
    }

    if($useragent){
        $options[CURLOPT_USERAGENT] = 'MSIE';
    }

    curl_setopt_array($ch, $options);        
    $buf = curl_exec($ch);        
    curl_close($ch);        
    return $buf;
}

これを少し異なる方法で呼び出します。

echo sendToHost('http://catalog.coles.com.au/default.aspx', array(
    'ctl00_Body_PostcodeTextBox' => 4122
));

GET リクエストを送信したいだけの場合は、次のように使用することもできますfile_get_contents

echo file_get_contents('http://catalog.coles.com.au/default.aspx?ctl00_Body_PostcodeTextBox=4122');
于 2013-09-18T18:05:51.077 に答える