#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?