102

Web API を使用して操作したいカスタム複合型があります。

public class Widget
{
    public int ID { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

そして、これが私の Web API コントローラー メソッドです。このオブジェクトを次のように投稿したい:

public class TestController : ApiController
{
    // POST /api/test
    public HttpResponseMessage<Widget> Post(Widget widget)
    {
        widget.ID = 1; // hardcoded for now. TODO: Save to db and return newly created ID

        var response = new HttpResponseMessage<Widget>(widget, HttpStatusCode.Created);
        response.Headers.Location = new Uri(Request.RequestUri, "/api/test/" + widget.ID.ToString());
        return response;
    }
}

System.Net.HttpClientそして今、メソッドを呼び出すために使用したいと思います。ただし、メソッドに渡すオブジェクトの種類と、そのPostAsync作成方法がわかりません。サンプル クライアント コードを次に示します。

var client = new HttpClient();
HttpContent content = new StringContent("???"); // how do I construct the Widget to post?
client.PostAsync("http://localhost:44268/api/test", content).ContinueWith(
    (postTask) =>
    {
        postTask.Result.EnsureSuccessStatusCode();
    });

HttpContentWeb API が理解できるようにオブジェクトを作成するにはどうすればよいですか?

4

9 に答える 9

134

ジェネリックHttpRequestMessage<T>削除されました。これ :

new HttpRequestMessage<Widget>(widget)

動作しなくなります。

代わりに、この投稿から、ASP.NET チームはこの機能をサポートするためにいくつかの新しい呼び出しを含めました。

HttpClient.PostAsJsonAsync<T>(T value) sends “application/json”
HttpClient.PostAsXmlAsync<T>(T value) sends “application/xml”

したがって、新しいコード ( dunston から) は次のようになります。

Widget widget = new Widget()
widget.Name = "test"
widget.Price = 1;

HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:44268");
client.PostAsJsonAsync("api/test", widget)
    .ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode() );
于 2013-02-05T18:42:08.623 に答える
99

代わりにこのメソッドを使用する必要がありますSendAsync。これは、サービスへの入力をシリアル化する一般的なメソッドです。

Widget widget = new Widget()
widget.Name = "test"
widget.Price = 1;

HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:44268/api/test");
client.SendAsync(new HttpRequestMessage<Widget>(widget))
    .ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode() );

具体的なクラスを作成したくない場合は、クラスで作成できFormUrlEncodedContentます

var client = new HttpClient();

// This is the postdata
var postData = new List<KeyValuePair<string, string>>();
postData.Add(new KeyValuePair<string, string>("Name", "test"));
postData.Add(new KeyValuePair<string, string>("Price ", "100"));

HttpContent content = new FormUrlEncodedContent(postData); 

client.PostAsync("http://localhost:44268/api/test", content).ContinueWith(
    (postTask) =>
    {
        postTask.Result.EnsureSuccessStatusCode();
    });

int?注:IDをnull許容のint( )にする必要があります

于 2012-04-24T20:04:17.077 に答える
76

ポータブル クラス ライブラリを使用している場合、HttpClient には PostAsJsonAsync メソッドがないことに注意してください。ポータブル クラス ライブラリを使用してコンテンツを JSON として投稿するには、次のようにする必要があります。

HttpClient client = new HttpClient();
HttpContent contentPost = new StringContent(argsAsJson, Encoding.UTF8, 
"application/json");

await client.PostAsync(new Uri(wsUrl), contentPost).ContinueWith(
(postTask) => postTask.Result.EnsureSuccessStatusCode());
于 2014-04-15T22:21:25.910 に答える
4

他の回答で言及されている便利なメソッドのタイプが必要であるが、移植性が必要な場合 (または必要でない場合でも)、Flurl [開示: 私は著者です] を確認することをお勧めします。HttpClientJson.NET を(薄く) ラップし、流暢なシュガーや、組み込みのテスト ヘルパーを含むその他の機能を追加します。

JSON として投稿:

var resp = await "http://localhost:44268/api/test".PostJsonAsync(widget);

または URL エンコード:

var resp = await "http://localhost:44268/api/test".PostUrlEncodedAsync(widget);

上記の例は両方とも を返しますHttpResponseMessageが、Flurl には他のものを返すための拡張メソッドが含まれています。

T poco = await url.PostJsonAsync(data).ReceiveJson<T>();
dynamic d = await url.PostUrlEncodedAsync(data).ReceiveJson();
string s = await url.PostUrlEncodedAsync(data).ReceiveString();

Flurl は NuGet で利用できます。

PM> Install-Package Flurl.Http
于 2014-07-30T18:49:48.343 に答える
1

多くの代替案を調査した結果、API 2.0 バージョンに適した別のアプローチに出会いました。

(VB.NET は私のお気に入りです、すっごく...)

Public Async Function APIPut_Response(ID as Integer, MyWidget as Widget) as Task(Of HttpResponseMessage)
    Dim DesiredContent as HttpContent = New StringContent(JsonConvert.SerializeObject(MyWidget))
    Return Await APIClient.PutAsync(String.Format("api/widget/{0}", ID), DesiredContent)
End Function

幸運を!私にとってはこれでうまくいきました(結局!)。

よろしく、ピーター

于 2014-08-10T18:27:34.433 に答える