Php 使用Guzzle向EventBrite API发布更新数据

Php 使用Guzzle向EventBrite API发布更新数据,php,rest,api,guzzle,eventbrite,Php,Rest,Api,Guzzle,Eventbrite,我可以使用带有以下代码的post添加事件: //Create client $client = new Client([ 'base_uri' => 'https://www.eventbriteapi.com/v3/', ]); $params = [ 'event.name.html' => $this->Name, 'event.description.html' => $this->Description, 'event.listed'

我可以使用带有以下代码的post添加事件:

//Create client
$client = new Client([
    'base_uri' => 'https://www.eventbriteapi.com/v3/',
]);

$params = [
  'event.name.html' => $this->Name,
  'event.description.html' => $this->Description,
  'event.listed'  => false,
  'event.start.utc'  => $this->StartTime,
  'event.start.timezone'  => 'Europe/London',
  'event.end.utc'  => $this->EndTime,
  'event.end.timezone'  => 'Europe/London',
  'event.currency'  => 'GBP'
];

try {
  //Send new event request
  $res = $client->request('POST', "events/", [
    'query' => ['token' => env('EVENTBRITE_TOKEN', '')],
    'form_params' => $params
  ]);
} catch (GuzzleException $e) {
  return false;
}
//Send update event request
$res = $client->request('POST', "events/$this->EventBriteID", [
  'query' => ['token' => env('EVENTBRITE_TOKEN', '')],
  'form_params' => $params
]);
但是,当我尝试使用步骤1中创建的ID和以下代码更新事件时:

//Create client
$client = new Client([
    'base_uri' => 'https://www.eventbriteapi.com/v3/',
]);

$params = [
  'event.name.html' => $this->Name,
  'event.description.html' => $this->Description,
  'event.listed'  => false,
  'event.start.utc'  => $this->StartTime,
  'event.start.timezone'  => 'Europe/London',
  'event.end.utc'  => $this->EndTime,
  'event.end.timezone'  => 'Europe/London',
  'event.currency'  => 'GBP'
];

try {
  //Send new event request
  $res = $client->request('POST', "events/", [
    'query' => ['token' => env('EVENTBRITE_TOKEN', '')],
    'form_params' => $params
  ]);
} catch (GuzzleException $e) {
  return false;
}
//Send update event request
$res = $client->request('POST', "events/$this->EventBriteID", [
  'query' => ['token' => env('EVENTBRITE_TOKEN', '')],
  'form_params' => $params
]);
它不会更新事件。请求看起来成功了。状态200随事件对象返回一个long,但是没有更新任何数据。该信息与创建事件时提交的信息相同。我做错了什么,我发现很难调试,因为端点返回200状态

这个请求在《邮递员》中很有效,所以我在《狂饮》中显然做错了什么

编辑

$response->request()的按请求输出


测试令牌和参数的一个好方法是导航到我已将您直接链接到EventbriteAPI updateEvent端点。您应该继续并在表单中填写参数和令牌,然后单击测试。您应该会看到一个详细的JSON响应。下面是一个简单的例子:

如果一切正常,单击仪表板响应上方的代码,注册,从下拉列表中选择PHP,RapidAPI将提供一个PHP代码片段,您可以直接复制并粘贴到代码中进行API调用。以下是RapidAPI将提供的PHP代码片段示例:

require __DIR__ . '/vendor/autoload.php';
use RapidApi\rapidApiConnect;

$rapid = new RapidApiConnect("StackOverflowTest",       "##########################");

$result = $rapid->call('EventbriteAPI', 'updateEvent', [
    'token' => '####################',
    'eventId' => '31082267900',
    'eventName' => 'Ghost Tour Test',
    'eventStartUtc' => '2017-02-20T03:00:00Z',
    'eventStartTimezone' => 'America/Los_Angeles',
    'eventEndUtc' => '2017-02-20T06:00:00Z',
    'eventEndTimezone' => 'America/Los_Angeles',
    'eventCurrency' => 'USD',
    'eventDescription' => ''
]);

希望这有帮助

您很可能应该使用
body
请求选项,而不是
form_params
。对请求使用
form_params
将发送
application/x-www-form-urlencoded
数据,这通常不是现代API所期望的。在Eventbrite的情况下,我相信它需要一个常规的
表单数据
编码请求

将您的Guzzle请求更改为:

$res = $client->request('POST', "events/$this->EventBriteID", [
  'query' => ['token' => env('EVENTBRITE_TOKEN', '')],
  'body' => $params
]);

希望这能奏效

所以在绝望了好几个小时后,我终于把它修好了。问题是端点url上缺少尾部斜杠:

$res = $client->request('POST', "events/$this->EventBriteID", []);
改为

$res = $client->request('POST', "events/$this->EventBriteID/", []);

现在可以正常工作。

在本地服务器上设置HTTP头的日志记录(创建一个小脚本),并根据该日志记录请求,然后比较这些头(与postman)。例如,如果内容类型不符合预期,某些API会忽略查询。请转储并在此处显示所有$client->request()参数添加了上述$response->request()的输出,以确保在Postman中,您是否使用“表单数据”或“x-www-form-urlencoded”发送参数?这里可能有细微差别…两个请求中的响应内容是什么,请尝试$response->getContents()并检查设置EBId的位置。使用“form_params”返回:“将“body”请求选项作为数组传递以发送POST请求已被弃用。”您还可以尝试
json
键吗?json也没有遇到这种情况。我有点惊讶API的响应是模仿GET(200OK)的行为,尽管它是作为POST发送的,但由于缺少尾部斜杠,所以遇到了同样的问题