CURL表格发布(-F)到HttpClient帖子

问题描述 投票:0回答:2

我需要使用c#的HttpClient将apk上传到hockeyApp,

上传apk的cUrl如下:

curl \
  -F "status=2" \ 
  -F "notify=1" \ 
  -F "[email protected]" \ 
  -H "X-HockeyAppToken: 4567abcd8901ef234567abcd8901ef23" \
   https://rink.hockeyapp.net/api/2/apps/upload

我试着用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);

但我得到的反应(经过很长一段时间)是422无法处理的实体

c# asp.net .net-core dotnet-httpclient hockeyapp
2个回答
0
投票

解决了,

问题出在边界上

cUrl命令以这种形式生成边界boundary=xxxxxxxxxxx(无引号)

但是multipartFormDataContent有一个这种形式的边界boundary="xxxxxxxxxxx"(带引号)

当我删除引号它工作正常:

// Fix boundary problem (boundary is quoted)
var boundary = multipartFormDataContent.Headers.ContentType.Parameters.First(o => o.Name == "boundary");
boundary.Value = boundary.Value.Replace("\"", string.Empty);

0
投票

因为曲棍球应用程序将被App Center取代我也遇到了与422响应相同的问题。所以我与支持人员交谈并得到这个代码样本非常好,也许它会有所帮助。

 // 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}");
© www.soinside.com 2019 - 2024. All rights reserved.