Составной POST для API JOPLIN REST с использованием C# и Flurl - PullRequest
0 голосов

В настоящее время я работаю над консольным приложением для импорта данных в Joplin для Windows 10, используя C# и Flurl. Описание API Joplin можно найти здесь .

Я пытаюсь создать новый ресурс в Joplin для файла в моей системе, чтобы его можно было присоединить к заметке Joplin.

С помощью CURL я могу создать ресурс с помощью команды:

curl -F  "data=@c:\\temp\\Test.pptx" -F  "props={\"title\":\"my resource title\"}" http://localhost:41184/resources?token=MyToken

(примечание: он работает только с "data=@c: \ temp \ Test.pptx", НЕ с "data = c") : \ temp \ Test.pptx ")

Когда я пытаюсь сделать это с Flurl в c#, я получаю ответ 400 от Joplin, в журнале нахожу:

Ошибка: Ресурс нельзя создать без файла в Api.action_resources (C: \ Program Files \ Joplin \ resources \ app.asar \ lib \ services \ rest \ Api. js: 351: 37) в Api.route (C: \ Program Files \ Joplin \ resources \ app.asar \ lib \ services \ rest \ Api. js: 140: 42) в execRequest (C: \ Program Files \ Joplin \ resources \ app.asar \) lib \ ClipperServer. js: 157: 39) в C: \ Program Files \ Joplin \ resources \ app.asar \ lib \ ClipperServer. js: 185: 8 в C: \ Program Files \ Joplin \ ресурсы \ app.asar \ node_modules \ многопартийная \ индекс. js : 136: 9 в C: \ Program Files \ Joplin \ resources \ app.asar \ node_modules \ multiparty \ index. js: 115: 9 в processTicksAndRejected (внутренняя / process / task_queues. js: 75: 11 ) "

Я пробовал это до сих пор:

        try
        {
            var url = BaseUrl
                .WithHeader("User_Agent", browserUserAgent)
                .AppendPathSegment("resources")
                .SetQueryParam("token", Token);

            using (var fs = new FileStream("c:\\temp\\Test.pptx", FileMode.Open, FileAccess.Read))
            {
                var resource = url.PostMultipartAsync(mp => mp
                        .AddJson("props", new { title = "test title" })
                        .AddFile("data", fs, "Test.pptx", "application/octet-stream")
                        )
                    .ReceiveJson<JoplinResource>()
                    .Result;
            }
        }

и:

        try
        {
            var url = BaseUrl
                .WithHeader("User_Agent", browserUserAgent)
                .AppendPathSegment("resources")
                .SetQueryParam("token", Token);

            var resource = url.PostMultipartAsync(mp => mp
                    .AddJson("props", new { title = "test title" })
                    .AddFile("data", "c:\\temp\\Test.pptx")
                    )
                .ReceiveJson<JoplinResource>()
                .Result;
        }

Я подключил скрипач, чтобы увидеть, что это разница между моим приложением и CURL.

Curl:

POST http://127.0.0.1:41184/resources?token=MyToken HTTP/1.1
Host: 127.0.0.1:41184
User-Agent: curl/7.70.0
Accept: */*
Connection: Keep-Alive
Content-Length: 33648
Content-Type: multipart/form-data; boundary=------------------------91ab181cbb0247ba

--------------------------91ab181cbb0247ba
Content-Disposition: form-data; name="props"

{"title":"my resource title"}
--------------------------91ab181cbb0247ba
Content-Disposition: form-data; name="data"; filename="Test.pptx"
Content-Type: application/octet-stream
...

Приложение My Console:

POST http://localhost:41184/resources?token=MyToken HTTP/1.1
User_Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36
Content-Type: multipart/form-data; boundary="f603841b-5c32-4e77-985a-69c2ffb6eed0"
Host: localhost:41184
Content-Length: 33612
Expect: 100-continue
Accept-Encoding: gzip, deflate

--f603841b-5c32-4e77-985a-69c2ffb6eed0
Content-Disposition: form-data; name=props

{"title":"My Resource"}
--f603841b-5c32-4e77-985a-69c2ffb6eed0
Content-Disposition: form-data; name=data; filename=Test.pptx; filename*=utf-8''Test.pptx
...

Обратите внимание на различия:

  1. реквизиты и данные в кавычках при использовании CURL, а не с FLURL
  2. FLURL отправляет второе имя файла: filename*=utf-8''Test.pptx

Как мне заставить это работать правильно?

1 Ответ

0 голосов

Проблема заключалась в пропущенных кавычках для «data» и «props»:

    try
    {
        var url = BaseUrl
            .WithHeader("User_Agent", browserUserAgent)
            .AppendPathSegment("resources")
            .SetQueryParam("token", Token);

            var resource = url.PostMultipartAsync(mp => mp
                    .AddJson("\"props\"", new { title = "My Resource" })
                    .AddFile("\"data\"", "c:\\temp\\Test.pptx")
                    )
                .ReceiveJson<JoplinResource>()
                .Result;
    }

Необработанный заголовок запроса теперь:

POST http://localhost:41184/resources?token=MyToken HTTP/1.1
User_Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36
Content-Type: multipart/form-data; boundary="c6b2377a-1240-4ae3-872f-fa24b643d3e0"
Host: localhost:41184
Content-Length: 33616
Expect: 100-continue
Accept-Encoding: gzip, deflate

--c6b2377a-1240-4ae3-872f-fa24b643d3e0
Content-Disposition: form-data; name="props"

{"title":"My Resource"}
--c6b2377a-1240-4ae3-872f-fa24b643d3e0
Content-Disposition: form-data; name="data"; filename=Test.pptx; filename*=utf-8''Test.pptx
...

И служба REST Joplin создает новый ресурс ...

...