使用PHP POST到Web API的最佳方法是什么?

时间:2010-05-21 18:02:45

标签: php

我已经看到curl()被用作POST的一种方式 - 是否有更广泛使用或更好的其他方式?

4 个答案:

答案 0 :(得分:5)

看到incredibly huge amount of settings you have with cURL,可能没有理由使用其他任何东西。

答案 1 :(得分:2)

从PHP 4.3和5开始,您还可以将stream_context_create()fopen() / file_get_contents()结合使用来发出POST请求。

完整的POST示例是here

至于哪个更好,我从未见过没有编译过cURL支持的PHP安装。但是看作needs an external library,而流上下文方法没有,一个可以认为后者是便携式应用的更好选择。

CURL仍然是更灵活的工具,并且具有更多选项和功能。但如果它只是你需要制作的POST请求,我会使用内置方式。

答案 2 :(得分:1)

AFAIK,cURL是PHP推荐到另一个API的推荐方式。可能还有其他方法可以做到这一点,但是cURL内置于PHP来处理这样的情况,为什么不使用呢?

答案 3 :(得分:1)

我最近回答了 similar question ,它提供了file_get_contents()和cURL的基本POST'able实现以及一些可以帮助您做出决定的基准。

已经提到cURL需要libcurl扩展,并且在某些服务器上file_get_contents()可能无法请求远程文件allow_url_fopen设置为Off

您必须选择哪一个最适合您,我通常使用以下功能,如果cURL不可用,则该功能可以回退到file_get_contents()

function Request($url, $post = null)
{
    if (extension_loaded('curl') === true)
    {
        $curl = curl_init($url);

        if (is_resource($curl) === true)
        {
            curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
            curl_setopt($curl, CURLOPT_FAILONERROR, true);
            curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

            if (isset($post) === true)
            {
                curl_setopt($curl, CURLOPT_POST, true);
                curl_setopt($curl, CURLOPT_POSTFIELDS, (is_array($post) === true) ? http_build_query($post, '', '&') : $post);
            }

            $result = curl_exec($curl);
        }

        curl_close($curl);
    }

    else
    {
        $http = array
        (
            'method' => 'GET',
            'user_agent' => $_SERVER['HTTP_USER_AGENT'],
        );

        if (isset($post) === true)
        {
            $http['method'] = 'POST';
            $http['header'] = 'Content-Type: application/x-www-form-urlencoded';
            $http['content'] = (is_array($post) === true) ? http_build_query($post, '', '&') : $post;
        }

        $result = @file_get_contents($url, false, stream_context_create(array('http' => $http)));
    }

    return $result;
}