Нужна помощь, чтобы преобразовать вызов curl в VB.NET

#windows #vb.net #api #curl

Вопрос:

У меня есть несколько команд, которые я запускаю через CURL, и они получают ответ от API. Я превращаю их в VB.net.

У меня есть такая просьба

 curl --location --request GET http://ip:port/
 

и я превратился в vb.net вот так.

 Imports System
Imports System.IO
Imports System.Net

Module Module1

    Sub Main()
        
        ' Make HTTP Request
        Dim Request As HttpWebRequest = HttpWebRequest.Create("http://ip:port/")
        Request.Method = "GET"
        Request.Credentials = userCredentials
        
        ' Get HTTP Response
        
        Dim response As HttpWebResponse = Request.GetResponse()
        Dim reader As StreamReader = New StreamReader(Response.GetResponseStream())
        Dim str As String = reader.ReadLine()
        Do While str.Length >= 0
            Console.WriteLine(str)
            str = reader.ReadLine()
        Loop
        If (Console.ReadLine() = "EXIT") Then
            Environment.Exit(0) 'or, simply return from the Main method
        End If
    End Sub
End Module
 

Ответ будет таким, как и ожидалось.

Теперь у меня есть другая команда curl, которая вызывает метод запроса Post и загружает файл в D: . Поэтому у нее есть дополнительные параметры.

 curl --location --request POST "http://ip:port/copy" --header "Content-Type: application/json" --data-raw "{"file":"//path/file.xlsx"}" >> D:file.xlsx
 

Я пробовал это до сих пор, но я не понимаю, как передать все параметры, чтобы это работало.

     Dim Request As HttpWebRequest = WebRequest.Create("http://ip:port/copy")
    Request.Method = "POST"
    Request.ContentType = "application/json"
    Request.Credentials = userCredentials
 

как мне передать —данные-необработанные и D:file.xlsx и что я должен использовать, чтобы получить ответ.

Любая помощь будет признательна.

Большое спасибо.

Ответ №1:

Если вы не привязаны к использованию HttpWebRequest, HttpClient (доступен в .NET Framework 4.5) считается лучшей библиотекой.

Параметр —location указывает curl следовать перенаправлениям http (с кодом 3XX), которые HttpClient выполняет автоматически.

Параметр —data-raw отправляет данные, как если бы они были отправлены из элемента управления файлами в форме html (тип содержимого-приложение/x-www-форма-url-код).

Я прочитал информацию выше по адресу: https://curl.se/docs/manpage.html

Используя HttpClient, опубликовать файл очень просто:

         Dim client As New HttpClient()
        Dim content As New ByteArrayContent(IO.File.ReadAllBytes("path_to_my_file"))
        Dim response As HttpResponseMessage = Await client.PostAsync("<my url>", content)
        response.EnsureSuccessStatusCode()
 

Возможно, из-за параметра data-raw вам нужно использовать MultipartFormDataContent вместо ByteArrayContent .

 Dim client As New HttpClient()
Dim b As Byte() = IO.File.ReadAllBytes("<path_to_my_file>")
Dim ms As New IO.MemoryStream(b, 0, b.Length)
ms.Write(b, 0, b.Length)
Dim content = New MultipartFormDataContent()
content.Add(New StreamContent(ms))
Dim response As HttpResponseMessage = Await client.PostAsync("<my url>", content)
 

Я надеюсь, что это поможет.

Комментарии:

1. Чтобы опубликовать запрос JSON, добавьте в заголовки по умолчанию .Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")) и установите содержимое HttpRequest в new StringContent([The JSON string])

2. Это правильно, но, похоже, OP хочет отправить запрос JSON и также отправить файл xlsx?