Hi there,
I’m having problems with REST API usage in C# trying to upload a file.
Everything works fine (token request, getting upload link) up to the point where I try to send the file using the upload-link which constantly returns ‘Bad Request’ with status code 400.
I guess it is some problem with the multipart data, but I am out of ideas and already tried many things.
Would be really great if someone had an idea…
This is the sample code (.Net 6.0):
using System.Net.Http.Headers;
using System.Reflection;
using System.Text;
using System.Text.Json;
internal class Program
{
private const string url = "https://<url>";
private const string username = "<username>";
private const string password = "<password>";
private static async Task Main(string[] args)
{
string? Token;
string? RepoId;
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri(url + "/api2/auth-token/");
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url + "/api2/auth-token/");
var parameters = new Dictionary<string, string> { { "username", username }, { "password", password } };
request.Content = new FormUrlEncodedContent(parameters);
var response = await httpClient.SendAsync(request);
var jsonString = await response.Content.ReadAsStringAsync();
Token = JsonDocument.Parse(jsonString).RootElement.GetProperty("token").GetString();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Token", parameter: Token);
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
response = await httpClient.GetAsync(url+"/api2/repos/");
jsonString = await response.Content.ReadAsStringAsync();
RepoId = JsonDocument.Parse(jsonString).RootElement[0].GetProperty("id").GetString();
response = await httpClient.GetAsync(requestUri: url+"/api2/repos/" + RepoId + "/upload-link/");
var responseBody = await response.Content.ReadAsStringAsync();
var uploadLink = responseBody.Replace("\"", "");
var multipartContent = new MultipartFormDataContent();
multipartContent.Add(new ByteArrayContent(File.ReadAllBytes("Test.txt")), "file", Path.GetFileName("Test.txt"));
multipartContent.Add(new StringContent(""), name: "parent_dir");
multipartContent.Add(new StringContent("1"), name: "replace");
response = await httpClient.PostAsync(uploadLink, multipartContent);
// results in 'Bad Request'
}
}
}