【问题标题】:How to write to JSON curl postfield in PHP如何在 PHP 中写入 JSON curl postfield
【发布时间】:2018-03-13 09:54:07
【问题描述】:

我有这段代码,我尝试通过 API 列出我的网上商店中的所有文章(此处为文档http://api.textalk.se/webshop/

我制作了类似的脚本,女巫从相同的 API 接收命令,它运行良好,但我不会开始工作。

任何想法我做错了什么?

 <?php
class TextalkApi
{
       public function AdminLogin($username, $password) {
        $url = 'https://shop.textalk.se/backend/jsonrpc/v1/';           

        $ch = curl_init();      
        curl_setopt($ch, CURLOPT_URL, $url);        
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        
        curl_setopt($ch, CURLOPT_POST, 1);      
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch,CURLOPT_HTTPHEADER, array('Content-Type: application/json-rpc'));   
        curl_setopt($ch, CURLOPT_POSTFIELDS, '{"jsonrpc":"2.0", "id":1, "method":"Admin.login", "params":["' . $username . '","' . $password . '"]}');  
        $data = json_decode(curl_exec($ch), true);
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if($http_code != 200) 
            throw new Exception('Error : Admin Login Failed');

        return $data['result'];
    }

           public function GetArts($admin_auth_token, $webshop_id) {
        $url = 'https://shop.textalk.se/backend/jsonrpc/v1/?auth=' . $admin_auth_token . '&webshop=' . $webshop_id;

        $ch = curl_init();      
        curl_setopt($ch, CURLOPT_URL, $url);        
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        
        curl_setopt($ch, CURLOPT_POST, 1);      
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch,CURLOPT_HTTPHEADER, array('Content-Type: application/json-rpc'));

// this below i beleive dosen't work
        curl_setopt($ch, CURLOPT_POSTFIELDS, 
 '{"jsonrpc":"2.0","method":"Article.list", {"limit": 5}],"id":1}');
// this above i beleive dosen't work

                $data = json_decode(curl_exec($ch), true);
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if($http_code != 200) 
            throw new Exception('Error : Failed to get orders');

        return $data['result'];
    }
}
?>

在这个 POSTFIELD 中我写“// 这下面我相信它不起作用”我想把它正确地放这个

Article.list(true, {"limit": 5}) 

查看文档http://api.textalk.se/webshop/interface/TryIt/

在我的另一个看起来像这样的 PHP 文件中,我希望输出结果

<?php
require_once('the_file_with_the_class_TextalkApi.php');

$textalk = new TextalkApi();
//Working demo credentials
$admin_auth_token = $textalk->AdminLogin('pon85x@gmail.com', 'abc123');
$webshop_id = '77140';

$arts = $textalk->GetArts($admin_auth_token, $webshop_id);
echo '<pre>';print_r($arts);echo '</pre>';
var_dump($arts);
?>

但是结果是NULL

【问题讨论】:

  • 在没有json_decode的情况下尝试var_dump(curl_exec($ch))
  • 最好总是关闭 cURL 的 curl_close($ch);

标签: php json api curl


【解决方案1】:

在第 5 行,您没有验证 $username / $password 是字符串(如果是,您可能应该抛出 InvalidArgumentException)

在第 13 行,你不是 json-encoding $username / $password

在第 14 行,在第 19 行将其用作数组之前,您没有验证 json 解码是否确实成功。

在第 23 行,您没有再次验证输入参数,也不是 url 编码 $admin_auth_token 也不是 $webshop_id

在第 33 行,您发送了一个无效编码的 json,其中包含一个流浪 ]

在第 36 行,在第 41 行将其用作数组之前,您没有验证 json 解码是否确实成功。

在整个代码中,您没有发现任何潜在的 curl 错误,如果设置选项时出现错误,curl_setopt 返回 bool(false), 如果在传输过程中出现问题,curl_exec 返回 bool(false),您的代码将完全忽略该问题。尝试为 curl_setopt 使用捕获错误的包装器,例如

function ecurl_setopt ( /*resource*/$ch , int $option , /*mixed*/ $value ):bool{
    $ret=curl_setopt($ch,$option,$value);
    if($ret!==true){
        //option should be obvious by stack trace
        throw new RuntimeException ( 'curl_setopt() failed. curl_errno: ' . curl_errno ($ch).'. curl_error: '.curl_error($ch) );
    }
    return true;
}

同时检查 curl_exec 是否返回 false

【讨论】:

    猜你喜欢
    • 2016-11-25
    • 2012-07-09
    • 1970-01-01
    • 2016-07-17
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    相关资源
    最近更新 更多