2015-09-25 1 views
7

Je migre de l'API SOAP de Confluence vers their REST API. Je vois qu'il ya un soutien for adding attachments to a page (by doing a POST) mais je suis en train de rencontrer des problèmes pour le faire fonctionner (je reçois un message d'erreur 403: Forbidden). J'ai d'autres objets "get" fonctionnant bien à travers l'api de repos mais faire un post de pièce jointe semble continuer à échouer.En C#, quelle est la bonne façon d'envoyer des pièces jointes à l'API REST de Confluence?

Voici mon code actuel (donné un nom de fichier spécifique):

byte[] rawData = File.ReadAllBytes(filename); 
var pageId = "11134"; 
var url = new Uri("http://example.com:9088/rest/api/content/" + pageId + "/child/attachment"); 
var requestContent = new MultipartFormDataContent(); 
var imageContent = new ByteArrayContent(rawData); 
imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse(attachement.contentType); 
requestContent.Add(imageContent, "file", attachement.fileName); 
requestContent.Headers.Add("X-Atlassian-Token", "nocheck"); 

Voyez-vous si je fais quelque chose de mal au-dessus?

+0

Confluence docs séjours: « Renvoyé si les pièces jointes est désactivé ou si vous n'êtes pas autorisé à ajouter des pièces jointes à ce contenu. ». Avez-vous essayé d'utiliser CURL comme dans la page ici https://docs.atlassian.com/confluence/REST/latest/#d3e787 et voir si elle renvoie encore 403? –

+0

Je viens d'essayer curl et je reçois une erreur curl <56> Erreur Recv: Connexion a été réinitialisée. J'ai utilisé cette syntaxe curl -D- -u utilisateur: pwd -X POST -H "X-Atlassian-Token: nocheck" -F "fichier = @test.txt" htttp: // exemple: 9088/reste/api/content/71105117/child/attachment (NOTE: je mets un "t" supplémentaire dans "http" dans ce commentaire afin que SO ne tente pas de le convertir en un hyperlien – leora

+0

@SimonMourier - aussi, y at-il une autre authentification requise sur le code C# – leora

Répondre

3

De la documentation Confluence (RTFM)

In order to protect against XSRF attacks, because this method accepts multipart/form-data, it has XSRF protection on it. This means you must submit a header of X-Atlassian-Token: nocheck with the request, otherwise it will be blocked.

Ajouter ce avant que le statut Post

httpClient.Headers.Add("X-Atlassian-Token", "nocheck"); 
+0

J'ai ajouté la nouvelle ligne et mis à jour la question. Le problème est maintenant que essayé d'ajouter ceci et maintenant je reçois 403: Interdit – leora

+6

SO stipule seulement 1 question par courrier. Passer à une nouvelle question devrait être un autre message. La raison en est que d'autres personnes peuvent rechercher des réponses à une question spécifique. –

4

403 indique que la demande n'est pas autorisée. Afin d'autoriser une demande, vous devez spécifier l'en-tête Authorization. L'API REST Confluence prend en charge le schéma d'autorisation de base. Pour l'authentification de base, vous devez spécifier l'en-tête suivant pour chaque demande: Authorization: Basic username:passwordnom d'utilisateur: mot de passe partie doit être codé en Base64. Vous pouvez utiliser le code suivant pour ce faire:

string userName; 
string password; 
string authorizationString = userName + ":" + password; 
string encodedValue = Convert.ToBase64String(Encoding.ASCII.GetBytes(authorizationString)); 
string authorizationHeaderValue = "Basic " + encodedValue; 

requestContent.Headers.Add("Authorization", authorizationHeaderValue); 

Selon cette link vous devez également spécifier le paramètre URL suivant à chaque demande: os_authType=basic.

HTTP basic authentication: (Authorization HTTP header) containing 'Basic username:password'. Please note however, username:password must be base64 encoded. The URL must also contain the 'os_authType=basic' query parameter.

Remarque: assurez-vous de vous connecter via https si vous utilisez l'authentification de base;

0

Voici la façon dont je préfère:

string url = "https://localhost:8080/confluence/rest/api/content/123456/child/attachment"; 
string filename = @"C:\temp\test.txt"; 
using (var client = new WebClient()) 
{ 
    string authorizationString = username + ":" + password; 
    string encodedValue = Convert.ToBase64String(Encoding.ASCII.GetBytes(authorizationString)); 
    client.Headers.Add("Authorization", "Basic " + encodedValue); 
    client.Headers.Add("X-Atlassian-Token", "nocheck"); 
    byte[] result = client.UploadFile(url, filename); 
    string responseAsString = Encoding.Default.GetString(result); 
}