繁体   English   中英

将JSON发布到API并使用PHP检索数据

[英]POST JSON to API and retrieve data with PHP

我正在尝试使用此API并通过必需的参数对其进行POST。

使用此代码:

function postToService_php( $urlAbs, $data ) {
    $dataJSON = json_encode($data);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $urlAbs);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
    curl_setopt($ch, CURLOPT_POSTFIELDS, $dataJSON);                                                                  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
        'Content-Type: application/json',                                                                                
        'Content-Length: ' . strlen($dataJSON))                                                                       
    );
    $resultJSON = curl_exec($ch);
    return $resultJSON;
}

$postData = array(
    'UserName' => '*username*',
    'Password' => '*password*',
    'Area' => 1
);

var_dump(postToService_php('http://e20prodwebapi.esmartapi.com/api/Authenticate', $postData));

结果似乎是给定string(0)“”,在这里我做错了什么?

使用此方法:考虑必须为此站点使用SSL(HTTPS)

<?php

function postToService_php( $urlAbs, $data ) {
    $dataJSON = json_encode($data);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $urlAbs);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
    curl_setopt($ch, CURLOPT_POSTFIELDS, $dataJSON);                                                                  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1); //Remove this line if everything works okay.
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 20);
    curl_setopt($ch,CURLOPT_POST, true);    
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
        'Content-Type: application/json',                                                                                
        'Content-Length: ' . strlen($dataJSON))                                                                       
    );
    $resultJSON = curl_exec($ch);

    return $resultJSON;
}

$postData = array(
    'UserName' => 'test',
    'Password' => 'test',
    'Area' => 1
);

var_dump(postToService_php('https://e20prodwebapi.esmartapi.com/api/Authenticate', $postData));

凭直觉我尝试使用https并使用此代码收到了预期的401响应

function postToService_php( $url, $data ) {
    $ch = curl_init();
    $data=json_encode( $data );

    curl_setopt($ch, CURLOPT_URL, $url );

    if( parse_url( $url,PHP_URL_SCHEME )=='https' ){
        curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
        curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 2 );
        curl_setopt( $ch, CURLOPT_CAINFO, realpath( 'c:/wwwroot/cacert.pem' ) );
    }

    curl_setopt($ch, CURLOPT_POST, true );                                                                     
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data );  
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true );                                                               
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                     
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
        'Content-Type: application/json',
        'Content-Length: ' . strlen( $data ))                                                                       
    );

    $result = curl_exec( $ch );
    $info=curl_getinfo( $ch );
    curl_close( $ch );

    return (object)array(
        'result'=>  $result,
        'info'  =>  $info
    );
}


$url='https://e20prodwebapi.esmartapi.com/api/Authenticate';
$postData = array(
    'UserName' => 'geronimo',
    'Password' => 'passthedoobie',
    'Area' => 1
);

print_r( postToService_php( $url, $postData ) );

此API https是必需的。 我没有帐户,因此无法测试。

https://e20prodwebapi.esmartapi.com/api/Authenticate

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM