PHP 发送 post 请求,怎么都发布成功

2017-06-27 22:48:08 +08:00
 coltguo

$data= "username=zhangsan&age=8"; $len =strlen($data); //print_r($len);die; $errornu = -1; $errstr = ''; $url= 'http://localhost/socket/post.php'; $fh = parse_url($url); //print_r($fh);die; if(!isset($fh['port'])){ $fh['port'] = 80; } $conn = fsockopen($fh['host'],$fh['port'],$errornu,$errstr,3); //print_r($conn);die; if(!$conn){

    echo  " $errstr  ( $errnu )<br />\n" ;
}else{


    $post = 'POST '.$fh['path'].' HTTP/1.1'."\r\n";
    $post .= 'Host: '.$fh['host']."\r\n";
    $post .= 'Content-type: application/x-www-form-urlencoded'."\r\n";
    $post .= 'Content-length:'.' '.$len."\r\n";
    $post .= ' '."\r\n";
    $post .=$data."\r\n";
    $post .= ' '."\r\n";
    $post .=  "Connection: Close\r\n\r\n" ;

    //echo $post;die;
    fwrite($conn,$post);
    while(!feof($conn)){

        echo  fread ( $conn ,128 );

    }

    fclose($conn);
}


怎么都是出现 400 的错误,希望大神帮我看看,是怎么回事?
2827 次点击
所在节点    PHP
8 条回复
coltguo
2017-06-27 22:49:49 +08:00
<?php
/**
* Created by PhpStorm.
* User: kobe
* Date: 2017/6/23
* Time: 上午 9:40
*/
//print_r($_POST);
$str = implode('/n',$_POST);
file_put_contents('1.txt',$str);
echo 'write ok';
coltguo
2017-06-27 22:50:32 +08:00
这是 post 文件
suchasplus
2017-06-27 22:51:46 +08:00
试试 curl
chaegumi
2017-06-28 08:17:10 +08:00
用 guzzlehttp 库,我真搞不懂为啥还有人要自己实现这些功能。
q409195961
2017-06-28 09:00:27 +08:00
用 curl 试试
按接口要求,可加上 UserAgent 和请求头数据
```
$url = "http://localhost/socket/post.php";
$postData = array("username" => "zhangsan","age" => "8");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 使用 POST 请求
curl_setopt($ch, CURLOPT_POST, 1);
// POST 参数
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$output = curl_exec($ch);
curl_close($ch);
// 返回的数据
print_r($output);
```
kfll
2017-06-28 11:46:56 +08:00
内容格式不大对,建议再看一下 http 规范。
那一段差不多应该是这样

$post = 'POST '.$fh['path'].' HTTP/1.1'."\r\n";
$post .= 'Host: '.$fh['host']."\r\n";
$post .= 'Content-type: application/x-www-form-urlencoded'."\r\n";
$post .= 'Content-length:'.' '.$len."\r\n";
$post .= "Connection: Close\r\n\r\n" ;
$post .= $data;

--

entity header 跟 entity body 分开;用两个合法换行分开;如果定义了 Content-Length,尽量让 entity body 的大小跟 Content-Length 一样大
Takahashi
2017-06-28 12:25:59 +08:00
建议 CURL
coltguo
2017-06-28 13:56:51 +08:00
@kfll 谢谢兄弟解决了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/371524

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX