简体   繁体   English

通过Curl / PHP查询API

[英]Querying API through Curl/PHP

I'm looking at the Parse.com REST API and making calls using the Curl wrapper PHP uses. 我正在查看Parse.com REST API并使用PHP使用的Curl包装器进行调用。

Raw Curl code(works): 原始卷曲代码(作品):

curl -X GET \
  -H "X-Parse-Application-Id: myApplicationID" \
  -H "X-Parse-REST-API-Key: myRestAPIKey" \
  https://api.parse.com/1/classes/Steps

PhP code(works): PhP代码(有效):

$ch = curl_init('https://api.parse.com/1/classes/Steps');

curl_setopt($ch,CURLOPT_HTTPHEADER,array('X-Parse-Application-Id: myApplicationID',
    'X-Parse-REST-API-Key: myRestAPIKey',
    'Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_exec($ch);
curl_close($ch);

Thats good and dandy, but now when I try to add a query constraint: 多数民众赞成好,但现在当我尝试添加查询约束时:

Raw Curl code(works): 原始卷曲代码(作品):

curl -X GET \
  -H "X-Parse-Application-Id: myApplicationID" \
  -H "X-Parse-REST-API-Key: myRestAPIKey" \
  -G \
--data-urlencode 'where={"steps":9243}' \
https://api.parse.com/1/classes/Steps

Alas, we ultimately arrive at my question- What is the php analogue to the above code? 唉,我们最终得出了我的问题 - 上述代码的php模拟是什么?

PHP code(does not work): PHP代码(不起作用):

$ch = curl_init('https://api.parse.com/1/classes/Steps');

$query = urlencode('where={"steps":9243}');

curl_setopt($ch,CURLOPT_HTTPHEADER,array('X-Parse-Application-Id: myApplicationID',
    'X-Parse-REST-API-Key: myRestAPIKey',
    'Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $query);

curl_exec($ch);
curl_close($ch);

Error response: 错误回复:

Object ( [code] => 107 [error] => invalid json: where%3D%7B%22steps%22%3A9243%7D )

Your last PHP example has changed the request to a POST from a GET. 您的上一个PHP示例已将请求从GET更改为POST。 Pass your parameters in the query string instead of the POST body. 将参数传递给查询字符串而不是POST正文。 Try: 尝试:

$query = urlencode('where={"steps":9243}');
$ch = curl_init('https://api.parse.com/1/classes/Steps?'.$query);

curl_setopt(
    $ch, 
    CURLOPT_HTTPHEADER,
    array(
        'X-Parse-Application-Id: myApplicationID',
        'X-Parse-REST-API-Key: myRestAPIKey',
        'Content-Type: application/json'
    )
);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_exec($ch);
curl_close($ch);

To call GET,POST,DELETE,PUT All kind of request, i have created one common function 要调用GET,POST,DELETE,PUT所有类型的请求,我创建了一个常用函数

define("SITEURL", "http://localhost:82/slimdemo/RESTAPI");

function CallAPI($method, $api, $data, $headers) {
    $url = SITEURL . "/" . $api;
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

    switch ($method) {
        case "GET":
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET");
            break;
        case "POST":
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
            break;
        case "PUT":
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
            break;
        case "DELETE":
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); 
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            break;
    }
    $response = curl_exec($curl);
    $data = json_decode($response);

    /* Check for 404 (file not found). */
    $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    // Check the HTTP Status code
    switch ($httpCode) {
        case 200:
            $error_status = "200: Success";
            return ($data);
            break;
        case 404:
            $error_status = "404: API Not found";
            break;
        case 500:
            $error_status = "500: servers replied with an error.";
            break;
        case 502:
            $error_status = "502: servers may be down or being upgraded. Hopefully they'll be OK soon!";
            break;
        case 503:
            $error_status = "503: service unavailable. Hopefully they'll be OK soon!";
            break;
        default:
            $error_status = "Undocumented error: " . $httpCode . " : " . curl_error($curl);
            break;
    }
    curl_close($curl);
    echo $error_status;
    die;
}

CALL DeleteAPI CALL删除APII

$data = array('id'=>$_GET['did']);
$header = array('USERTOKEN:' . GenerateToken());
$result = CallAPI('DELETE', "DeleteCategory", $data, $header);

CALL PostAPI CALL PostAPI

$data = array('title'=>$_POST['txtcategory'],'description'=>$_POST['txtdesc']);
$header = array('USERTOKEN:' . GenerateToken());
$result = CallAPI('POST', "InsertCategory", $data, $header);

CALL GetAPI CALL GetAPI

$data = array('id'=>$_GET['eid']);
$header = array('USERTOKEN:' . GenerateToken());
$result = CallAPI('GET', "GetCategoryById", $data, $header);

CALL PutAPI CALL PutAPI

$data = array('id'=>$_REQUEST['eid'],m'title'=>$_REQUEST['txtcategory'],'description'=>$_REQUEST['txtdesc']);
$header = array('USERTOKEN:' . GenerateToken());
$result = CallAPI('POST', "UpdateCategory", $data, $header);

This line: 这一行:

curl_setopt($ch, CURLOPT_POSTFIELDS, $query);

is trying to set a request body, which is not valid for a GET request. 正在尝试设置一个请求正文,该请求正文对GET请求无效。 cURL appears to let you set a body on a GET request ( example ). cURL似乎允许您在GET请求上设置正文( 示例 )。

It looks like your PHP is not making a POST request (at least best I can tell from looking at other PHP examples that use curl_setopt($ch,CURLOPT_POST, count($fields)); . I believe you need to pass an array to the postfields option: 看起来你的PHP没有发出POST请求(至少我可以通过查看使用curl_setopt($ch,CURLOPT_POST, count($fields));其他PHP示例curl_setopt($ch,CURLOPT_POST, count($fields));我相信你需要传递一个数组到postfields选项:

$fields = array(
    'where' => urlencode('{"steps":9243}')
);

curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);

Try this: 试试这个:

$query = json_encode(
    array(
        'where' => array( 'steps' => 9243 )
    )
);

I've gleaned this from here - not tested though! 我从这里收集了这个 - 虽然没经过测试! The Python example appears to JSON-encode the query before sending it, so it might be worth trying that. Python示例在发送之前似乎对查询进行了JSON编码,因此可能值得尝试。

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

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