Может ли libcurl.net использовать новую страницу для слияния?

Я только начинаю использовать REST API для создания страниц.

Я пытаюсь настроить базовый пример, и я подумал об использовании libcurl.net, чтобы сделать это.

Кто-нибудь видит причину, почему это не сработает?

ОБНОВИТЬ:

Вот то, что я до сих пор адаптировал на примере "bookpost" curllib.net

 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

Я подключаюсь, потому что, если я удаляю имя пользователя и пароль, я получаю ответ через функцию "onWriteData" следующим образом:

<!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>

Проблема в том, что если я правильно вошел в систему, я не получил никакого ответа, кроме "CURLE_OK" от функции "easy.Perform()".

Это хорошо, потому что я знаю, что это работает в некоторой степени.

2 ответа

Решение

Так что это работает

Вот что я добавил / изменил, чтобы приведенный выше код работал

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

ЧТО СМОТРЕТЬ ДЛЯ:

(1) URL-адрес, конечно, вещь номер один

В моем случае я использовал https://domain.com/confluence/rest/api/content/ поскольку в документации по слиянию предполагается, что вы будете использовать имя корневого домена (как я)

Однако я не знал, что URL, который мне дали для тестирования, уже направлял меня в папку "слияния".

Поэтому мой URI должен был быть https://domain.com/rest/api/content/

(2) Индикатором того, что ваш HTTPHEADER должен быть помещен в список, является это возвращение с сервера: 415 неподдерживаемый тип носителя

(3) Убедитесь, что НЕ используете свойство CURLOPT_HEADER. Если вы видите этот заголовок в своих ответах, вам нужно убедиться, что он не используется:

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

Обратитесь к моему посту здесь для объяснения причин: CURLOPT_HEADER

(4) Наконец, когда вы создаете свое приложение, если вы получаете эту ошибку:

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.

Это вызвано тем, что процесс libcurl.net не был очищен.

Метод cleanup() недоступен в DLL, несмотря на то, что он приведен в примерах.

Поэтому вместо этого используйте EASY.Dispose() в конце вашей процедуры, и эта ошибка прекратится. (Я сохранил метод "GlobalCleanup()" просто для хорошей меры)

(5) Как ни странно, я пошел по пути использования CURL, потому что я думал, что интерфейс Confluence может потребовать это.

Но теперь кажется, что это не так, и вы можете просто использовать класс "HttpWebRequest" в.NET, чтобы получить те же результаты.

Тем не менее, Жюри все еще отсутствует, потому что "легкий" тестовый сервер, на который я был назначен, потерпел крах, и я жду, когда они исправят это, чтобы я мог проверить это.

В любом случае, я надеюсь, что все это кому-то поможет

M

Согласно документации libcurl.net: http://www.libcurl.org/

libcurl также поддерживает сертификаты HTTPS, HTTP POST, HTTP PUT, загрузку по FTP, загрузку на основе форм HTTP, прокси-серверы, файлы cookie и аутентификацию пользователя + пароль.

Поэтому я думаю, что вы должны иметь возможность сделать вызов REST API с ним. Я использовал curl (версия для Linux) для создания и обновления страниц, используя что-то вроде этого:

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

где body.json - это файл, содержащий данные для обновления страницы.

Я написал блог об этом здесь: https://javamemento.blogspot.no/2016/05/jira-confluence-3.html

Вы можете получить код здесь: https://github.com/somaiah/jira-confluence-graphs

Другие вопросы по тегам