2016-05-21 2 views
0

Je commence à utiliser l'API REST pour créer des pages.Peut-on utiliser libcurl.net pour poster une nouvelle page à confluence?

Je suis en train de configurer un exemple de base et je pensé à utiliser libcurl.net de le faire.

Quelqu'un voit aucune raison pour laquelle cela ne fonctionne pas?

MISE À JOUR:

Voici ce que j'ai jusqu'à présent adapté du curllib.net « Bookpost » exemple

Option Explicit On 
Imports System.IO 
Imports System.Net 
Imports SeasideResearch.LibCurlNet 

Public Class CurlOperations 

Public Shared Sub CurlPost() 

    Try 

     Dim credUserName As String = "username" 
     Dim credPassword As String = "password" 

     Dim response As String = Nothing 
     Dim outputStdErr As Stream = Nothing 

     Curl.GlobalInit(CURLinitFlag.CURL_GLOBAL_ALL) 

     Dim easy As Easy 
     easy = New Easy 

     ' Set up write delegate 
     Dim wf As Easy.WriteFunction 
     wf = New Easy.WriteFunction(AddressOf OnWriteData) 
     easy.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wf) 

     'Authentication 
     easy.SetOpt(CURLoption.CURLOPT_HTTPAUTH, CURLhttpAuth.CURLAUTH_BASIC) 
     easy.SetOpt(CURLoption.CURLOPT_USERPWD, credUserName & ":" & credPassword) 

     'disable ssl peer verification 
     easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYPEER, False) 

     'Header 
     easy.SetOpt(CURLoption.CURLOPT_HTTPHEADER, "Content-Type: application/json; charset=utf-8") 

     ' Simple post - with a string 
     easy.SetOpt(CURLoption.CURLOPT_POSTFIELDS, WikiTools.CommREST.WebToCF.PostCurl()) 

     ' and the rest of the cURL options 
     easy.SetOpt(CURLoption.CURLOPT_USERAGENT, ".NET Framework Client") 
     easy.SetOpt(CURLoption.CURLOPT_URL, "https://domain.com/confluence/rest/api/content/") 
     easy.SetOpt(CURLoption.CURLOPT_POST, True) 

     response = easy.Perform().ToString 
     LoggingAndActivites.WriteLog("Response: " & response, GetFunctionName.GetCallerName, True, True) 

    Catch ex As Exception 

     LoggingAndActivites.WriteLog("Exception: " & ex.ToString, GetFunctionName.GetCallerName, True, True) 

    End Try 

    Curl.GlobalCleanup() 

End Sub 

' Called by libcURL.NET when it has data for your program 
Public Shared Function OnWriteData(ByVal buf() As Byte, ByVal size As Int32, ByVal nmemb As Int32, ByVal extraData As Object) As Int32 

    LoggingAndActivites.WriteLog(System.Text.Encoding.UTF8.GetString(buf), GetFunctionName.GetCallerName, True, True) 

    Return size * nmemb 

End Function 

End Class 

Je se connecter parce que si je retire le nom d'utilisateur et mot de passe que je reçois une réponse par la fonction « onWriteData » comme suit:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
<html> 
<head> 
<title>401 Unauthorized</title> 
</head> 
<body> 
<h1>Unauthorized</h1> 
<p>This server could not verify that you 
are authorized to access the document 
requested. Either you supplied the wrong 
credentials (e.g., bad password), or your 
browser doesn't understand how to supply 
the credentials required.</p> 
<hr> 
<address>Apache Server at domain.com Port 7080</address> 
</body> 
</html> 

le problème est maintenant que si je journal correctement, je ne suis pas GETT une réponse autre que "CURLE_OK" à partir de la fonction "easy.Perform()".

Il est bon parce que je sais qu'il travaille dans une certaine mesure.

Répondre

0

Il ne fonctionne

Voici ce que j'ai ajouté/modifié pour rendre le code ci-dessus travail

'I added an Slist to store the header items (I only had one)    
Dim slistHeaders As New Slist 
slistHeaders.Append("Content-Type: application/json") 

'Then I added the slist to the HTTPHEADER 
easy.SetOpt(CURLoption.CURLOPT_HTTPHEADER, slistHeaders) 

À surveiller:

(1) L'URL est bien sûr le première chose

Dans mon cas, j'utilisais était https://domain.com/confluence/rest/api/content/ parce que la documentation de Confluence suppose que vous souhaitez utiliser le nom de domaine racine (comme moi)

Cependant, ce que je ne savais pas ce que l'URL m'a donné le test me dirigeait déjà dans le dossier « confluent ».

Donc, mon URI devait être https://domain.com/rest/api/content/ au lieu

(2) Un indicateur que votre HTTPHeader doit être mis dans un slist est ce retour du serveur: 415 Type de non prise en charge des médias

(3 Assurez-vous que PAS pour utiliser la propriété CURLOPT_HEADER. Si vous voyez cet en-tête dans vos réponses, vous devez vous assurer qu'il est pas utilisé:

HTTP/1.1 500 Internal Server Error 
Date: Sun, 22 May 2016 17:50:32 GMT 
Server: Apache 
Content-Location: 500.en-GB.html 
Vary: negotiate,accept-language 
TCN: choice 
Accept-Ranges: bytes 
Content-Length: 7575 
Connection: close 
Content-Type: text/html; charset=UTF-8 
Content-Language: en-gb 

Se reporter à mon article ici pour une explication des raisons pour lesquelles: CURLOPT_HEADER

(4) Enfin, lorsque vous créez votre application si vous recevez cette erreur:

An unhandled exception of type 'System.AccessViolationException' occurred in libcurl.NET.dll 

Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 

Ceci est causé par le processus de libcurl.net pas nettoyé.

La méthode « nettoyage() » n'est pas disponible dans la DLL, en dépit d'être lsited dans les exemples.

Donc utilisez plutôt EASY.Dispose() à la fin de votre procédure et cette erreur s'arrêtera. (J'ai gardé la méthode "GlobalCleanup() juste pour faire bonne mesure)

(5) Ironiquement, je suis passé à l'utilisation de CURL parce que je pensais que l'interface de Confluence pourrait l'exiger.

Mais il semble maintenant que ce ne est pas et que vous pouvez simplement utiliser la classe « HttpWebRequest » dans .NET pour obtenir les mêmes résultats.

Cependant, le jury est toujours parce que le serveur de test « léger » J'ai été affecté tombé en panne et je suis en attente pour eux de le réparer afin que je puisse vérifier.

Either Way J'espère que tout cela aide quelqu'un

M

+0

Une autre note, n'utilisez pas "charset = utf-8" dans votre type de contenu. Parfois ça marche et parfois ça ne marche pas mais en tout cas ce n'est pas nécessaire que je puisse déterminer. – mreinsmith

1

Selon les libcurl.net docs: http://www.libcurl.org/

libcurl also supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, and user+password authentication.

donc je suppose que vous devriez être en mesure de faire un appel API REST avec elle. Je l'ai utilisé boucle (la version linux) pour créer des pages de mise à jour, en utilisant quelque chose comme ceci:

curl --globoff --insecure --silent -u username:password -X PUT -H 'Content-Type: application/json' --data @body.json confluenceRestAPIURL/pageId 

où body.json est un fichier contenant les données à mettre à jour la page.

j'ai écrit un blog sur ce ici: https://javamemento.blogspot.no/2016/05/jira-confluence-3.html

Vous pouvez obtenir le code ici: https://github.com/somaiah/jira-confluence-graphs

+0

Merci Somaiah ce sera utile! – mreinsmith