2017-02-12 7 views
1

Я пытаюсь выполнить фиксацию в репозитории gitlab через API gitlab и PHP. Хотя полезная нагрузка выглядит хорошо для меня, запрос локонов терпит неудачу и возвращаетgitlab commit через cURL с ошибкой PHP

[error] => branch_name is missing, commit_message is missing, actions is missing 

Мой код выглядит следующим образом:

$ch_git = curl_init(); 

curl_setopt($ch_git, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch_git, CURLOPT_HTTPHEADER, array('PRIVATE-TOKEN: xxx')); 
curl_setopt($ch_git, CURLOPT_URL, 'https://gitlab.com/api/v3/projects/xxx/repository/commits'); 
curl_setopt($ch_git, CURLOPT_POST, true); 

$info = array(
    'id' => 'xxx', 
    'branch_name' => 'master', 
    'commit_message' => 'updating content...', 
    'actions' => array(
     'action' => 'update', 
     'file_path' => 'filename', 
     'content' => 'test 1234' 
    ) 
); 

$payload = json_encode($info, JSON_PRETTY_PRINT); 

echo '<pre>'; 
echo $payload; 
echo '</pre>'; 

curl_setopt($ch_git, CURLOPT_POSTFIELDS, $payload); 

$res = curl_exec($ch_git); 

echo '<pre>'; 
print_r(json_decode($res)); 
echo '</pre>'; 

Насколько я могу видеть, моя полезная нагрузка отформатирован как в the example, но, может быть, я чего-то не хватает.

+1

Есть несколько вещей, которые стоит попробовать, начните с установки пользовательского запроса через завиток -> 'curl_setopt ($ ch_git, CURLOPT_CUSTOMREQUEST , "POST"); 'и также указать свой тип содержимого как' application/json' в заголовках -> 'curl_setopt ($ ch, CURLOPT_HTTPHEADER, array ('PRIVATE-TOKEN: xxx', 'Content-Type: application/json '). Я предполагаю, что заголовки будут вашей проблемой, как в примере, который вы связали, они также устанавливают заголовок (* '--header" Content-Type: application/json "' *). – Darren

+1

Добавить тип содержимого что-то изменилось. Теперь я получаю ошибку 500. Лучше, чем раньше. :-) – flomei

+0

H ага кричит! С вашего конца или с их? ; -P – Darren

ответ

0

Я нашел решение этого вопроса.

actions не просто ожидает одиночный массив, но массив массивов, который затем содержит отдельные действия, которые должны быть выполнены в репозитории.

Кроме того, выяснилось, что параметр id не является обязательным, так как я уже указал идентификатор в параметре CURLOPT_URL.

Таким образом, для обновления одного файла в указанном хранилище, этот код работает:

$info = array(
    'branch_name' => 'master', 
    'commit_message' => 'updating content...', 
    'actions' => array(
     array(
     'action' => 'update', 
     'file_path' => 'filename', 
     'content' => 'test 1234' 
    ) 
    ) 
);