【问题标题】:How do I call a JSON web service from PHP with parameters and callback?如何使用参数和回调从 PHP 调用 JSON Web 服务?
【发布时间】:2012-11-07 01:16:54
【问题描述】:

我从 JQuery $.getJSON 函数调用 web 服务,它工作正常。

    var p = {
       'field1': 'value1',
       'field2': 'value2',
       'field3': 'value3'
    };

    $.getJSON('https://service:xxx@xxx.xxx.yyyyy.com.xx/service/search?callback=?', p, function(data) {
    if (data[0]) {      
        // print results
    } else  {
        // no results found
    }
});

我正在尝试从 PHP 和 CURL 进行连接,但是它不起作用,它总是返回 false。

//第一次尝试

$params = array(  'field1' => 'value1',  'field2' => 'value2', 'field3'=> 'value3');
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, 'https://service:xxx@xxx.xxx.yyyyy.com.xx/service/search?callback=?');
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
$result = curl_exec($ch); // return false instead of my JSON

// 第二次尝试

    $data_string = json_encode($params);                                                                                   
    $ch = curl_init('https://https://service:xxx@xxx.xxx.yyyyy.com.xx/service/search?callback=?');                                                                      
    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))                                                                       
);                                                                                                                   

    $result2 = curl_exec($ch); //return false instead of my JSON

我做错了什么?

非常感谢,

【问题讨论】:

  • 请求是jsonp还是json?两种情况下返回的格式不同
  • .getJSON 是一个获取请求。在 PHP 中,您使用的是发布请求。同样在 POSTFIELDS 中采用关联数组,但在您的第二次尝试中,您只给了它一个字符串。

标签: php json web-services curl callback


【解决方案1】:

尝试将您的代码更改为:

$params = array(  'field1' => 'value1',  'field2' => 'value2', 'field3'=> 'value3');

$data_string = implode('&',$params);
//NB: you may need to urlencode the each of your params

$ch = curl_init('https://service:xxx@xxx.xxx.yyyyy.com.xx/service/search?  callback=?&' .$data_string);                                                                      
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    
$result2 = curl_exec($ch);

未经测试的代码,希望对您有所帮助。

【讨论】:

    【解决方案2】:

    jquery 请求正在使用 GET。您编写的 curl 代码似乎正在发送一个发布请求(我不是 curl 方面的专家)。显然,接收服务器以不同的方式处理不同类型的请求,因此请确保您通过 curl 发送 get,这应该会有所帮助。

    【讨论】:

      【解决方案3】:

      getJSON 发送一个 GET 请求,因此您需要使用 http_build_query 将 params 数组转换为字符串并将其附加到查询中。当您使用 HTTPS 请求数据时,您需要使用 CURLOPT_CAINFO / CURLOPT_CAPATH 将 CURL 指向有效证书,我将忽略代码中的验证。

      $params = array(  'field1' => 'value1',  'field2' => 'value2', 'field3'=> 'value3');
      $url = 'https://service:xxx@xxx.xxx.yyyyy.com.xx/service/search?callback=?' . http_build_query($params);
      
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch , CURLOPT_SSL_VERIFYPEER , false);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      
      $result = curl_exec($ch);
      if($result === FALSE) {
          echo curl_error($ch);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-12
        • 2012-04-15
        • 2023-04-04
        • 1970-01-01
        相关资源
        最近更新 更多