Reputation: 87
I need to upload an apk to hockeyApp with c#'s HttpClient,
the cUrl to upload an apk is the following:
curl \
-F "status=2" \
-F "notify=1" \
-F "[email protected]" \
-H "X-HockeyAppToken: 4567abcd8901ef234567abcd8901ef23" \
https://rink.hockeyapp.net/api/2/apps/upload
i tried to do the same with c#:
var stream = await File.ReadAllBytesAsync(apkFilePath);
var bytes = new ByteArrayContent(stream);
bytes.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
var multipartFormDataContent = new MultipartFormDataContent
{
//send form text values here
{new StringContent("2"), "status"},
{new StringContent("0"), "notify"},
// send file Here
{bytes, "ipa"}
};
var uri = "https://rink.hockeyapp.net/api/2/apps/upload";
multipartFormDataContent.Headers.Add("X-HockeyAppToken", "++token_here++");
var response = await _client.PostAsync(uri, multipartFormDataContent);
but the response i am getting (after a long period) is 422 unprocessable entity
Upvotes: 0
Views: 512
Reputation: 11
Because Hockey App will be replaced by App Center i also had the same Problem with the 422 Response.So i talk with the Support and get this code sample wich is very good and maybe it will help.
// TODO: Update with your info
private static string apiKey = "<Your API Token>";
private static string uploadUrl = "https://api.appcenter.ms/v0.1/apps/<Owner Name>/<App Name>/release_uploads";
private static string releaseUrl = "https://api.appcenter.ms/v0.1/apps/<Owner Name>/<App Name>/release_uploads/";
private static string fileToUpload = "<Path to your IPA>";
private static string fileName = "<Your File Name>";
static async Task Main(string[] args)
{
// Get upload url
var client = new HttpClient();
var requestMessage = new HttpRequestMessage(HttpMethod.Post, uploadUrl);
requestMessage.Content = new StringContent("", Encoding.UTF8, "application/json");
requestMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
requestMessage.Headers.Add("X-API-Token", apiKey);
var response = await client.SendAsync(requestMessage);
var value = await response.Content.ReadAsAsync<UploadResponse>();
Console.WriteLine($"Upload ID: {value.UploadId}");
Console.WriteLine($"Upload URL: {value.UploadUrl}");
// Upload file
var uploadRequestMessage = new HttpRequestMessage(HttpMethod.Post, value.UploadUrl);
HttpContent fileStreamContent = new StreamContent(File.OpenRead(fileToUpload));
using (var formDataContent = new MultipartFormDataContent())
{
formDataContent.Add(fileStreamContent, "ipa", fileName);
uploadRequestMessage.Content = formDataContent;
var uploadResponse = await client.SendAsync(uploadRequestMessage);
Console.WriteLine($"Upload Response: {uploadResponse.StatusCode}");
}
// Set to committed
var uri = $"{releaseUrl}{value.UploadId}";
var updateStatusMessage = new HttpRequestMessage(HttpMethod.Patch, uri);
updateStatusMessage.Content = new StringContent("{ \"status\": \"committed\" }", Encoding.UTF8, "application/json");
updateStatusMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
updateStatusMessage.Headers.Add("X-API-Token", apiKey);
var updateResponse = await client.SendAsync(updateStatusMessage);
var releaseResponse = await updateResponse.Content.ReadAsAsync<ReleaseResponse>();
Console.WriteLine($"Release Response Id: {releaseResponse.ReleaseId}");
Console.WriteLine($"Release Response URL: {releaseResponse.ReleaseUrl}");
Upvotes: 1
Reputation: 87
Solved,
the problem was in the boundary
the cUrl command produces a boundary in this form boundary=xxxxxxxxxxx
(no quotes)
but the multipartFormDataContent has a boundary in this form boundary="xxxxxxxxxxx"
(with quotes)
when i removed the quotes it worked fine:
// Fix boundary problem (boundary is quoted)
var boundary = multipartFormDataContent.Headers.ContentType.Parameters.First(o => o.Name == "boundary");
boundary.Value = boundary.Value.Replace("\"", string.Empty);
Upvotes: 0