VB. NET PUT-запрос с параметром --data-binary не будет работать. Работает в curl. 401 Несанкционированный - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть небольшая проблема, и я борюсь с этим. Я пытаюсь загрузить аудио в онлайн-сервис через их API.

У меня есть команда curl, но она не работает в VB. net (Community 2017, если это помогает ). Я знаю, что MS уходят от VB, но я хотел включить эту новую функцию загрузки в текущую программу, которую я написал за эти годы.

Проблема в том, что этот пример для curl работает :( Обычно у вас есть также ProgramId, clipID и ключ API авторизации (SPECIALLONGKEY), но я их спрятал)

    curl "https://api.omnystudio.com/v0/programs/{programId}/clips/{clipId}/audio" --request PUT --data-binary "@birthday.mp3" --header "Accept:application/json" --header "Authorization:OmnyToken SPECIALLONGKEY"

Тем не менее, когда я пытаюсь сделать то же самое в VB. NET Ответ «401 несанкционированный».

    Dim httpClient As New Http.HttpClient()
    Dim request = New Http.HttpRequestMessage(New Http.HttpMethod("PUT"), "https://api.omnystudio.com/v0/programs/{programId}/clips/{clipId}/audio")
    request.Headers.Add("Accept", "application/json")
    request.Headers.Add("Accept-Encording", "gzip, deflate, br")
    request.Headers.Add("Authorization", "OmnyToken SPECIALLONGKEY")

    request.Content = New StringContent("C:\test\birthday.mp3")
    request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded")

    Dim response = httpClient.SendAsync(request).Result

    Debug.Print(request.ToString)
    Debug.Print(response.ToString)

Я получаю этот ответ примерно так:

Method: PUT, RequestUri: 'https://api.omnystudio.com/v0/programs/{programId}/clips/{clipId}/audio', Version: 1.1, Content: System.Net.Http.StringContent, Headers:
{
  Accept: application/json
  Accept-Encording: gzip, deflate, br
  Authorization: OmnyToken SPECIALLONGKEY
  Content-Type: application/x-www-form-urlencoded
  Content-Length: 50
}
StatusCode: 401, ReasonPhrase: 'Unauthorized. Provide a valid Authentication header', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Connection: keep-alive
  CF-Cache-Status: DYNAMIC
  Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
  CF-RAY: 5841cc895a0fda5e-SYD
  Cache-Control: no-cache, private
  Date: Wed, 15 Apr 2020 01:12:34 GMT
  Server: cloudflare
  WWW-Authenticate: OmnyToken
  Content-Length: 0
}

Документация по API мне мало помогает, так как она просто говорит: «Аудио клипа может быть предоставлено в виде двоичного тела запроса "

Я запустил Fiddler, чтобы посмотреть, что происходит, и все это, кажется, проверяет правильность отправляемых правильных заголовков et c. Просто интересно, если или что я делаю неправильно, или, если мне нужно просто go записать командные файлы, а затем заставить программу выполнять их каждый раз, когда должно произойти это конкретное c происшествие. Спасибо.

1 Ответ

0 голосов
/ 15 апреля 2020

Получив небольшую помощь от разработчиков, похоже, возникло две проблемы.
Самой большой была (и остается) проблема перенаправления, которая все еще происходит, но звук теперь загружается, так как была проблема ContentType.

Несмотря на то, что перенаправление все еще происходит, это можно преодолеть, опросив API, когда загрузка клипа прошла или не сработала, и когда она закончила обработку.

Вот обновленный пример кода vb. net:

    Dim OmnyProgramId As String = ""
    Dim OmnyClipId As String = ""
    Dim OmnyToken As String = "SPECIALLONGKEY"

    ' This creates a 303 "See Other" Error
    Dim myHandler As HttpClientHandler = New HttpClientHandler()
    myHandler.AllowAutoRedirect = False
    Dim httpClient As New Http.HttpClient(myHandler)

    ' Original
    ' This creates a redirect 303 "StatusCode: 401, ReasonPhrase: 'Unauthorized. Provide a valid Authentication header" Error
    'Dim httpClient As New Http.HttpClient() 

    Dim request = New Http.HttpRequestMessage(New Http.HttpMethod("PUT"), "https://api.omnystudio.com/v0/programs/" & OmnyProgramId & "/clips/" & OmnyClipId & "/audio")
    request.Headers.Add("Accept", "application/json")
    request.Headers.Add("Accept-Encording", "gzip, deflate, br")
    request.Headers.Add("Authorization", "OmnyToken " & OmnyToken)

    'easily swap between two test files.
    'Dim filename As String = "C:\test\bahamas.mp3"
    Dim filename As String = "C:\test\birthday.mp3"

    Dim dataBytes() As Byte = IO.File.ReadAllBytes(filename)
    Dim dataStream = New MemoryStream(dataBytes)
    request.Content = New StreamContent(dataStream)

    request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("audio/mpeg")

    ' Do the upload
    Dim response = httpClient.SendAsync(request).Result

    ' See the output
    Debug.Print("::")
    Debug.Print(request.ToString)
    Debug.Print("::")
    Debug.Print(response.ToString)

Я все еще получаю ответы заголовков, на которые сложно ответить, звук по крайней мере загружается. Это ответы заголовка: (снова программа, клипы и API-ключ подвергаются цензуре)

::
Method: PUT, RequestUri: 'https://api.omnystudio.com/v0/programs/{program}/clips/{clip}/audio', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Accept: application/json
  Accept-Encording: gzip, deflate, br
  Authorization: OmnyToken SPECIALLONGKEY
  Content-Type: audio/mpeg
  Content-Length: 1392706
}
::
StatusCode: 303, ReasonPhrase: 'See Other', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Connection: keep-alive
  X-RateLimit-Limit: 10
  X-RateLimit-Remaining: 9
  X-RateLimit-Reset: 10
  CF-Cache-Status: DYNAMIC
  Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
  CF-RAY: 58436ad7eec8fd2e-SYD
  Cache-Control: no-cache, private
  Date: Wed, 15 Apr 2020 05:55:26 GMT
  Location: https://api.omnystudio.com/v0/programs/{program}/clips/{clip}
  Set-Cookie: __cfduid=d5d4e3ab37736930123; expires=Fri, 15-May-20 05:55:23 GMT; path=/; domain=.omnystudio.com; HttpOnly; SameSite=Lax
  Server: cloudflare
  Content-Length: 0
}

Я надеюсь, что это кому-то поможет, учитывая, что почти все в C#. NET в эти дни, и VB . NET примеры идут по пути додо.

...