2017-02-12 13 views
1

Ich versuche, ein Commit zu einem gitlab Repository über die gitlab API und PHP zu machen. Obwohl die Nutzlast mir gut aussieht, schlägt die cURL Anforderung und gibtgitlab commit über cURL mit PHP schlägt fehl

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

Mein Code wie folgt aussieht:

$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>'; 

Soweit ich sehen kann, ist meine Nutzlast wie in the example formatiert, aber vielleicht fehlt mir etwas.

+1

Es gibt ein paar Dinge, einen Versuch wert, beginnen Sie mit einer benutzerdefinierten Anfrage per curl Einstellung -> 'curl_setopt ($ ch_git, CURLOPT_CUSTOMREQUEST , "POST"); 'und auch Angabe Ihres Inhaltstyps als' application/json' innerhalb der Header -> 'curl_setopt ($ ch, CURLOPT_HTTPHEADER, Array ('PRIVATE-TOKEN: xxx', 'Content-Type: application/json '); '. Ich gehe davon aus, dass die Header Ihr Problem sind, wie in dem Beispiel, das Sie verlinkt haben, sie setzen auch den Header (*' --header "Content-Type: application/json" '*) – Darren

+1

Addind den Inhaltstyp habe tatsächlich etwas verändert, jetzt bekomme ich einen Fehler 500. Besser als vorher :-) – flomei

+0

H Aha, hoppla! Auf deinem oder ihrem Ende? ;-P – Darren

Antwort

0

Ich fand die Lösung dafür.

actions erwartet nicht einfach ein einzelnes Array, sondern ein Array von Arrays, die dann die einzelnen Aktionen enthalten, die für das Repository ausgeführt werden sollen.

Ich fand auch heraus, dass der id Parameter optional ist, wie ich bereits die ID in CURLOPT_URL Parameter angegeben habe.

So eine einzelne Datei im angegebenen Repository für die Aktualisierung dieser Code funktioniert:

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