1. 程式人生 > >使用PHP模擬post提交資料

使用PHP模擬post提交資料

這也是個老生常談的話題了,上午花了點時間把這個問題整理了一下。

一般來說用PHP來模擬post提交資料有三種方法,file_get_contents、curl和socket。

寫了個公用函式,專門用來列印post資料:

<?php
function pr() {
    $params = func_get_args();
    foreach ($params as $key => $value) {
        echo "<pre>";
        print_r($value);
        echo "</pre>";
    }
}

先寫一個post.php,用來接收post資料並打印出來:
<?php
require dirname(__FILE__).'/function.php';

if (isset($_POST) && !empty($_POST)) {
    pr($_POST);
} else {
    pr("NO POST DATA!");
}

下面是用file_get_contents來模擬post:
<?php
require dirname(__FILE__).'/function.php';

function file_get_contents_post($url, $post) {
    $options = array(
        'http' => array(
            'method' => 'POST',
            // 'content' => 'name=caiknife&[email protected]',
            'content' => http_build_query($post),
        ),
    );

    $result = file_get_contents($url, false, stream_context_create($options));

    return $result;
}

$data = file_get_contents_post("http://www.a.com/post/post.php", array('name'=>'caiknife', 'email'=>'
[email protected]
')); var_dump($data);

很簡單是吧?再來看看curl模擬post:
<?php
require dirname(__FILE__).'/function.php';

function curl_post($url, $post) {
    $options = array(
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HEADER         => false,
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => $post,
    );

    $ch = curl_init($url);
    curl_setopt_array($ch, $options);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

$data = curl_post("http://www.a.com/post/post.php", array('name'=>'caiknife', 'email'=>'
[email protected]
')); var_dump($data);

最後是用socket來模擬post:
<?php
require dirname(__FILE__).'/function.php';

function socket_post($url, $post) {
    $urls = parse_url($url);
    if (!isset($urls['port'])) {
        $urls['port'] = 80;
    }

    $fp = fsockopen($urls['host'], $urls['port'], $errno, $errstr);
    if (!$fp) {
        echo "$errno, $errstr";
        exit();
    }

    $post = http_build_query($post);
    $length = strlen($post);
    $header = <<<HEADER
POST {$urls['path']} HTTP/1.1
Host: {$urls['host']}
Content-Type: application/x-www-form-urlencoded
Content-Length: {$length}
Connection: close

{$post}
HEADER;

    fwrite($fp, $header);
    $result = '';
    while (!feof($fp)) {
        // receive the results of the request
        $result .= fread($fp, 512);
    }
    $result = explode("\r\n\r\n", $result, 2);
    return $result[1];
}

$data = socket_post("http://www.a.com/post/post.php", array('name'=>'caiknife', 'email'=>'[email protected]'));

var_dump($data);

這三種方法最後看到的內容都是一樣的,但是在是用socket的時候,傳送header資訊時必須要注意header的完整資訊,比如content type和content length必須要有,connection: close和post資料之間要空一行,等等;而通過socket取得的內容是包含了header資訊的,要處理一下才能獲得真正的內容。

相關推薦

使用PHP模擬post提交資料

這也是個老生常談的話題了,上午花了點時間把這個問題整理了一下。 一般來說用PHP來模擬post提交資料有三種方法,file_get_contents、curl和socket。 寫了個公用函式,專門用來列印post資料: <?php function pr() {

PHP利用CURL方法模擬POST提交資料並獲得返回值的小細節

背景:我與同事之間互相呼叫API,進行資料處理,並返回處理結果 互動:我傳遞一個圖片資訊過去,他那邊給我返回一個識別影象結果的json物件。 方法:使用php的自帶curl函式 詳情:    一.開啟擴充套件服務:開啟php.ini檔案,把 “;extension=php_

php模擬post提交提交json數據

curl<?php header("Content-type:application/json;charset=utf-8"); $url="http://192.168.10.234:8080/uc/login/loginid"; $param=array( //註冊字段 "name

php實現post提交資料

<?php $encode='UTF-8'; //頁面編碼和簡訊內容編碼為GBK。重要說明:如提交簡訊後收到亂碼,請將GBK改為UTF-8測試。如本程式頁面為編碼格式為:ASCII/GB2312/GBK則該處為GBK。如本頁面編碼為UTF-8或需要支援繁體,阿拉

php curl post提交資料失敗解決方法

function http_req($http_type, $method, $url, $data) { $ch = curl_init(); if (strstr($http_typ

php模擬post提交(方法二)

index.php <? /** * 模擬post進行url請求 *QQ:874689017 通達OA專業二次開發 * @param string $url

cURL模擬POST提交資料

首先,是這個程式碼: <?php //curl模擬post提交資料$url = "http://127.0.0.1/immoc/output.php";$post_data = array("f

php curl 模擬post提交

模擬post提交,用於測試 /** * 模擬post進行url請求 * @param string $url * @param string $param */ function re

ASP模擬POST提交,然後XMLHTTP獲取資料總是亂碼,請大家幫忙,感謝!

目前在建的一個專案要求使用外部的一個網站達到切詞的目的,由於外部網站的API介面要求必須是POST提交資料,因此只能模擬POST提交,然後再去讀取提交後的資料,我用以下的程式碼,獲取回來的中文總是亂碼,英文和數字沒有問題,請大家幫忙看看,非常感謝!<%On error

模擬post提交,保持session不變

final 登陸 exceptio read msi tor inpu amr dom public static String sendPost(String url, String param) { PrintWriter out = null; BufferedR

四種常見的POST提交資料方式

HTTP/1.1 協議規定的 HTTP 請求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 這幾種。其中 POST 一般用來向服務端提交資料,本文主要討論 POST 提交資料的幾種方式。 我們知道,HTTP 協議是以 ASCII 碼

POST提交資料時四種常見的資料格式

最近專案部署到新環境tomcat+mysql,想看看專案部署成功沒有,就用soupui調對應介面開測試,soupui使用比較簡單,給上介面地址,入參xml報文,把入參的media Type設定為application/xml 點選呼叫就可以了。但是點選呼叫返回值為空。對,就是啥都沒返回。XM

application/json 四種常見的 POST 提交資料方式

application/json 四種常見的 POST 提交資料方式 轉載宣告: 本文系轉載自以下兩篇文章: 四種常見的 POST 提交資料方式 作者: 滄海一滴 轉載僅為方便學習檢視,一切權利屬於原作者,本人只是做了整理和排版,如果帶來不便請聯絡我刪除。

Content-Type 四種常見的 POST 提交資料方式

參考於: https://blog.csdn.net/tycoon1988/article/details/40080691(瞭解) 和: https://www.gy0929.com/wz/1420.html?_d_id=7ff19a05e92534d3df987da4343f71(設定) 和:

“四種常見的 POST 提交資料方式”與之對應的“content-type取值”

application/x-www-form-urlencoded  這應該是最常見的 POST 提交資料的方式了。瀏覽器的原生 form 表單,如果不設定 enctype 屬性,那麼最終就會以 application/x-www-form-urlencoded 方式提交資料

前端四種常見的 POST 提交資料方式

HTTP/1.1 協議規定的 HTTP 請求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 這幾種。其中 POST 一般用來向服務端提交資料,本文主要討論 POST 提交資料的幾種方式。我們知道,HTTP 協

HttpClient gzip壓縮post提交資料

ButtongzipButton = (Button) findViewById(R.id.button1);//按鈕1-gzip壓縮 ButtonnogzipButton = (Button) findViewById(R.id.button2);//按鈕2-正常傳送

四種常見的 POST 提交資料方式

最近為專案組提供rest api 時遇到了關於介面引數的傳遞問題,主要是沒有充分考慮到第三方呼叫者的使用方式,應該儘量的去相容公司之前提供出去的介面呼叫方式,這樣可以降低第三方呼叫者的學習成本,儘管之前的方式並不是那麼的推薦,好的做法是即相容老的做法也支援推薦的做法。 對於基於http post介面,Co

laraval中使用post提交資料中報token的問題

在我們使用laravel框架做專案時,經常會使用post方法提交資料,例如檔案上傳,表單提交,或者處理一些大資料。 我相信大家對於用post提交表單資料時的token處理都懂,就是傳一個隱藏域 <input type="hidden" name="_token" va

使用jQuery POST提交資料返回的JSON是字串不能解析為JSON物件

剛開始介入程式設計,很多東西自己不是一下就能搞定的,剛開始犯的錯還不少。 藉助CSDN部落格當做自己的筆記。 今天用jQuery的POST提交資料,我需要用他返回的資料, [javascript] view plaincopy jQuery.pos