5

アトラシアンのhttps://answers.atlassian.com/questions/79902/using-httpclient-c-to-create-a-jira-issue-via-rest-generates-bad-request-responseで 1つの回答を読みました。ユーザーは、次のコードで JIRA 課題を作成しました。私はそれを適応させましたが、セルフビルドクラスの問題を使用してエラーが発生しましたObjectContent

Http.HttpContent content = new Http.ObjectContent<Issue>(data, jsonFormatter);

コンパイラはそれを受け入れません。理由を知っている人はいますか?

 public string CreateJiraIssue()
        {

            string data= @"{ ""fields"": { 
                                ""project"":
                   {
                       ""key"": ""HELP""
                   },
                                ""summary"": ""Test Ticket"",
                                ""description"": ""Creating of an issue using project keys and issue type names using the REST API"",
                                ""issuetype"": {
                                    ""name"": ""Ticket""
                                },
                                ""assignee"": { ""name"": ""user"" }
                            }
            }";
            string postUrl = "https://xxx.jira.com/rest/api/2/";
            System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
            client.BaseAddress = new System.Uri(postUrl);
            byte[] cred = UTF8Encoding.UTF8.GetBytes("username:password");
            client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(cred));
            client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
            System.Net.Http.Formatting.MediaTypeFormatter jsonFormatter = new System.Net.Http.Formatting.JsonMediaTypeFormatter();

            System.Net.Http.HttpContent content = new System.Net.Http.ObjectContent<Issue>(data, jsonFormatter);
            System.Net.Http.HttpResponseMessage response = client.PostAsync("issue", content).Result;
            if (response.IsSuccessStatusCode)
            {
                string result = response.Content.ReadAsStringAsync().Result;
                return result;
            }
            else
            {
                return response.StatusCode.ToString();
            }

そして使用して

namespace IOnotification_System
{
    public class Issue
    {
        public Fields fields { get; set; }
        public Issue()
        {
            fields = new Fields();
        }
    }

    public class Fields
    {
        public Project project { get; set; }
        public string summary { get; set; }
        public string description { get; set; }
        public Assignee assignee { get; set; }
        public IssueType issuetype { get; set; }
        public Fields()
        {
            project = new Project();
            issuetype = new IssueType();
        }
    }

    public class Project
    {
        public string key { get; set; }
    }

    public class IssueType
    {
        public string name { get; set; }
    }
     public class Assignee
    {
        public string name { get; set; }
    }
}
4

2 に答える 2

2

編集

このメッセージは、System.Net.Http.ObjectContent() が最初のパラメーターに Issue オブジェクトを想定していることを明確に示しています。その直後に、文字列から問題への変換は不可能であるという別のメッセージがあると思います。

Issue オブジェクトを期待するメソッドに文字列を渡しています。フォーマッターは、Issue オブジェクトを Json 文字列に変換するために使用されます。

すでに文字列を持っているので、変換しようとしても意味がありません。Json 文字列に変換する課題インスタンスがある場合にのみ、フォーマッターが必要です。StringContentクラスを使用し、そのHeadersプロパティを使用して、クライアントにまだ設定されていないヘッダーを追加できます。

var content=new StringContent(data);

オリジナル

エラー メッセージと使用しているプロジェクトの種類は何ですか? System.Net.Http.Formatting名前空間は、ASP.NET Web API の一部です。ASP.NET アプリケーション、コンソール アプリケーションなどを構築していますか?

ASP.NET サイトを構築していない限り、このコードは機能しません。唯一の問題が Json リクエストの解析方法である場合は、別の Json デシリアライゼーション クラスを使用してください。Json.NETは非常に一般的な選択肢です。

いずれにせよ、Json クラスを使用して文字列をまったく同じ文字列を含む HttpContent オブジェクトに変換する理由はありません。StringContentクラスを使用し、そのHeadersプロパティを使用して、クライアントにまだ設定されていないヘッダーを追加できます。

于 2012-12-20T14:38:54.030 に答える
1

以下は魔法を行います:

var content = new StringContent(data, Encoding.UTF8, "application/json");
于 2012-12-21T08:38:43.067 に答える