如何使用curl的GET方法替代POST方法

17

我正在尝试使用curl打印一个URL的返回结果。到目前为止,我拥有的代码如下:

<?php
    $street = $_GET['street'];
    $city = $_GET['city'];
    $state = $_GET['state'];
    $zip = $_GET['zip'];

    $url = 'http://eligibility.cert.sc.egov.usda.gov/eligibility/eligibilityservice';
    $query = 'eligibilityType=Property&requestString=<?xml version="1.0"?><Eligibility xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="/var/lib/tomcat5/webapps/eligibility/Eligibilitywsdl.xsd"><PropertyRequest StreetAddress1="'.$street.'" StreetAddress2="" StreetAddress3="" City="'.$city.'" State="'.$state.'" County="" Zip="'.$zip.'" Program="RBS"></PropertyRequest></Eligibility>';
    $url_final = $url.''.$url_query;

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS,$query);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $return = curl_exec ($ch);
    curl_close ($ch);

    echo $return;

?>

我所知道的唯一明显问题是被查询的服务器使用GET而不是POST。是否有GET的替代方法?


这是一个相当长的查询字符串,通过GET发送。你可能会遇到浏览器长度限制,并发现它已被截断或缩短。 - Marc B
如果我在浏览器中运行它,它能正常工作。使用 cURL 的规则会有所不同吗? - Plummer
为什么要踩我?我在问是否有GET方法的POSTFIELDS替代品。 - Plummer
5个回答

28
curl_setopt($ch, CURLOPT_POST, 0);

Curl 默认使用 GET 方法,但您将其设置为了 POST 方法。如果您需要覆盖此设置,可以使用 curl_setopt($ch, CURLOPT_HTTPGET, 1);


但是POSTFIELDS呢?我只需要省略它并将查询字段与URL一起传递吗? - Plummer
2
你需要将变量修正为 $url_final = $url.'?'.$url_query; 并在 curl_setopt($ch, CURLOPT_URL, $url_final); 中使用它。 - AlienWebguy

4

使用file_get_contents()函数
file_get_contents

或者
curl_setopt($ch, CURLOPT_HTTPGET, 1);


1
这么多年过去了,没有人给出正确答案;构建查询字符串的方法是使用http_build_query()函数和数组。这会自动转义所有内容并返回一个简单的字符串。
$xml = '<?xml version="1.0"?><Eligibility xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="/var/lib/tomcat5/webapps/eligibility/Eligibilitywsdl.xsd"><PropertyRequest StreetAddress1="'.$street.'" StreetAddress2="" StreetAddress3="" City="'.$city.'" State="'.$state.'" County="" Zip="'.$zip.'" Program="RBS"></PropertyRequest></Eligibility>';
$data = [
    "eligibilityType" => "Property",
    "requestString" => $xml
];
$query = http_build_query($data);
$url .= "?$query";

不确定那是否是问题的重点,但感谢您的输入。 - Plummer

1
使用。
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => "http://yourlink.com",
CURLOPT_USERAGENT => 'Codular Sample cURL Request'));

0

您在URL中缺少一个问号。 应该像这样:

$query = '?eligibilityType=Property&...';

另外,你URL中的XML需要编码,例如在PHP中使用urlencode()函数。


cURL的示例中没有问号。你确定需要吗? - Plummer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接