PHP中的HTTP POST

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP中的HTTP POST相关的知识,希望对你有一定的参考价值。

我正在尝试使用php发布JSON有效负载,但无法使其正常工作。我有以下可在Shell上运行的CURL命令以及以下也可运行但需要相同功能的PHP实现的Python代码。

Shell上的CURL:

curl -H "Content-Type: application/json" -X POST -d '"Content":" <CONTENT OF THE MESSAGE> "' <URL of the node receiving POST data>

Python:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import requests

headers = 
  'Content-type': 'application/json',


auth = '<URL>'

line1 = '<CONTENT of message>'

data = '"Content":"%s"' % (line1)
response = requests.post(url = auth, headers = headers, data = data)

到目前为止,我在PHP中所拥有的(不起作用):

$data = array("Content" => "<CONTENT of the message>");                                                                    
$data_string = json_encode($data);                                                                                   

$ch = curl_init('<URL>');                                                                      
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json',                                                                                
    'Content-Length: ' . strlen($data_string))                                                                       
);                                                                                                                   

$result = curl_exec($ch);

任何人和所有的帮助都非常感谢!

答案

似乎您在这里正确地完成了所有操作(除了10 + 11行上的可怕缩进,使它看上去实际上在您实际上不在时缺少了)),您只是缺少了错误检查代码进行调试,请尝试:

$stderrh=tmpfile();
curl_setopt_array($ch,[CURLOPT_VERBOSE=>1,CURLOPT_STDERR=>$stderrh]);
$result = curl_exec($ch);
rewind($stderrh); // https://bugs.php.net/bug.php?id=76268
var_dump(stream_get_contents($stderrh),$result);

详细日志应该告诉您问题出在哪里,它说什么?

((您一开始也缺少<?php,并且您可能想在结尾添加var_dump($result);。为了加快处理速度,您可以添加CURLOPT_ENCODING=>''以使curl使用压缩进行传输,如果响应是可压缩的(例如JSON或html或文本),通常可以加快速度)]

另一答案

尝试此代码。

    $ch = curl_init( );
    $data = array("Content" => "<CONTENT of the message>");
    $headers = array(
    'Content-Type: application/json'
    );

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt ( $ch, CURLOPT_URL, $url );       
    curl_setopt ( $ch, CURLOPT_POST, 1 );
    curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data);
    // Allow cUrl functions 20 seconds to execute
    curl_setopt ( $ch, CURLOPT_TIMEOUT, 20 );
    // Wait 10 seconds while trying to connect
    curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 10 );
    $output = array();
    $output['server_response'] = curl_exec( $ch );
    $curl_info = curl_getinfo( $ch );
    $output['http_status'] = $curl_info[ 'http_code' ];
    $output['error'] = curl_error($ch);
    curl_close( $ch );
    return $output;

以上是关于PHP中的HTTP POST的主要内容,如果未能解决你的问题,请参考以下文章

从 PHP 中的 JSON POST 读取 HTTP 请求正文的问题

使用 POST 方法的 Swift 中的 HTTP 请求

找出PHP中的HTTP方法[重复]

转:PHP中的使用curl发送请求(GET请求和POST请求)

HTTP 多部分 (POST) 请求中的边界参数是啥?

laravel 中的 Http Post 使用 fetch api 给出 TokenMismatchException