2015-09-25 9 views
7

Sto migrando dall'API SOAP di Confluence all'utilizzo di their REST API. Vedo che è disponibile il supporto for adding attachments to a page (by doing a POST) ma sto riscontrando problemi per il suo funzionamento (ricevo un messaggio di errore 403: Proibito). Ho altri elementi "get" che funzionano bene attraverso il resto della API ma fare un post per gli allegati sembra continuare a fallire.In C#, qual è il modo giusto per pubblicare gli allegati all'API REST di Confluence?

Ecco il mio codice corrente (dato un nome specifico):

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"); 

Riesci a vedere se sto facendo qualcosa di sbagliato in precedenza?

+0

docs Confluence soggiorni: "restituita se gli allegati è disattivata o se non si dispone dell'autorizzazione per aggiungere allegati a questo contenuto.". Hai provato a usare CURL come nella pagina qui https://docs.atlassian.com/confluence/REST/latest/#d3e787 e vedere se restituisce ancora 403? –

+0

Ho appena provato arricciatura e ottengo un errore di arricciatura <56> Errore Recv: la connessione è stata ripristinata. Ho usato questo sintassi curl -D- -u utente: pwd -X POST -H "X-Atlassian-Token: nocheck" -F "[email protected]" htttp: // esempio: 9088/rest/api/content/71105117/child/attachment (NOTA: in questo commento inserisco una "t" extra in modo tale che SO non provi a convertirlo in un collegamento ipertestuale – leora

+0

@SimonMourier - inoltre, è richiesta un'altra autenticazione sul codice C# sopra? – leora

risposta

3

Da documentazione 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.

Aggiungere questo prima che lo stato Post

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

Ho aggiunto la nuova riga e ho aggiornato la domanda. Il problema ora è che ho provato ad aggiungere questo e ora ottengo 403: Proibito – leora

+6

SO stabilisce solo 1 domanda per post. Passare a una nuova domanda dovrebbe essere un altro post. Il motivo è che altre persone sono in grado di cercare risposte a una domanda specifica. –

4

403 indica che la richiesta non è autorizzato. Per autorizzare una richiesta è necessario specificare l'intestazione Authorization. L'API REST Confluence supporta lo schema di autorizzazione di base. Per l'autenticazione di base è necessario specificare la seguente intestazione con ogni richiesta: Authorization: Basic username:password dove nome utente: password parte deve essere codificata Base64. È possibile utilizzare il seguente codice per fare questo:

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); 

Secondo questo link si dovrebbe anche specificare il seguente parametro URL con ogni richiesta: 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.

Nota: assicurarsi di connettersi tramite https se si utilizza l'autenticazione di base;

0

Qui è il modo che preferisco:

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); 
} 
Problemi correlati