C#のWebClientを介してURLにJSONをPOSTする


87

C#に変換する必要のあるJavaScriptコードがいくつかあります。私のJavaScriptコードは、作成されたWebサービスにJSONをPOSTします。このJavaScriptコードは正常に機能し、次のようになります。

var vm = { k: "1", a: "2", c: "3", v: "4" };
$.ajax({
  url: "http://www.mysite.com/1.0/service/action",
  type: "POST",
  data: JSON.stringify(vm),
  contentType: "application/json;charset=utf-8",
  success: action_Succeeded,
  error: action_Failed
});

function action_Succeeded(r) {
  console.log(r);
}

function log_Failed(r1, r2, r3) {
  alert("fail");
}

これをC#に変換する方法を見つけようとしています。私のアプリは.NET2.0を使用しています。私が言えることから、私は次のようなことをする必要があります:

using (WebClient client = new WebClient())
{
  string json = "?";
  client.UploadString("http://www.mysite.com/1.0/service/action", json);
}

私はこの時点で少し立ち往生しています。どうあるjsonべきかわかりません。コンテンツタイプを設定する必要があるかどうかわかりません。もしそうなら、どうすればいいのかわかりません。私も見ましたUploadData。ですから、正しい方法を使っているのかどうかはわかりません。ある意味で、私のデータのシリアル化は私の問題です。

誰かが私がここで欠けているものを教えてもらえますか?

ありがとうございました!

回答:


70

コンテンツを解析するには、jsonシリアライザーが必要です。おそらく、既に持っているはずです。リクエストの作成方法に関する最初の質問では、これはアイデアかもしれません。

var baseAddress = "http://www.example.com/1.0/service/action";

var http = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress));
http.Accept = "application/json";
http.ContentType = "application/json";
http.Method = "POST";

string parsedContent = <<PUT HERE YOUR JSON PARSED CONTENT>>;
ASCIIEncoding encoding = new ASCIIEncoding();
Byte[] bytes = encoding.GetBytes(parsedContent);

Stream newStream = http.GetRequestStream();
newStream.Write(bytes, 0, bytes.Length);
newStream.Close();

var response = http.GetResponse();

var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
var content = sr.ReadToEnd();

それが役に立てば幸い、


1
「parsedContent」はどのように見えるべきですか?残念ながら、このシナリオでは手動でJSONを作成する必要があります。ありがとうございました。
うなぎファン

JSONのように見えるでしょうか?それとも、私が得ているのは、ある種の特別なエンコーディングを行う必要があるのでしょうか。
うなぎファン

@EelsFanは通常、JSONパーサーを選択するのに問題はありません。いつでもJSON.Netを使用して.netオブジェクトをJSONに解析できますが、私の経験では、JSONパーサーのバージョンが異なるクラウドサービスがいくつかあり、いくつか作成する必要がありました。微調整。シナリオに最適な方法を実行してください。このディスカッションは、JSON.Netなしでいくつかの問題を確認するのに役立つ場合がありますstackoverflow.com/questions/9573119/…–
Jorge Alvarado

5
なぜUTF8ではなくASCIIEncodingを使用するのですか?stackoverflow.com/a/9254967/109392を参照してください。
畏敬の念

2
+1最初にを使用してOPと同様に試しましたがWebClient、機能しませんでした。それから私はこの解決策を試しました、そしてそれは魅力のように働きました。私が使っていたUTF8Encodingの代わりに、ASCIIEncoding私は受け入れられない方法で利用可能な文字を低減ASCIIを使用する理由を、見ないので、バイト配列を作成します。ASCIIの文字セットは127文字のみです。
畏敬の念2013

197

質問はすでに回答されていますが、質問のタイトルにより簡単で関連性の高い解決策を見つけたと思います。ここにあります。

var cli = new WebClient();
cli.Headers[HttpRequestHeader.ContentType] = "application/json";
string response = cli.UploadString("http://some/address", "{some:\"json data\"}");

1
そして、jsonを「読み取り可能」にするには:( vb.netで)Dim json = <JSON> {"field1": "value1"、 "status": "pending"、 "objField":{"field2":true} } </ JSON> .ToString
foxont​​herock

しかし、そのjson文字列にパラメーターを補間するのはどうですか?
タリB.

74

次の例は、WebClient.UploadStringメソッドを介してJSONをPOSTする方法を示しています

var vm = new { k = "1", a = "2", c = "3", v=  "4" };
using (var client = new WebClient())
{
   var dataString = JsonConvert.SerializeObject(vm);
   client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
   client.UploadString(new Uri("http://www.contoso.com/1.0/service/action"), "POST", dataString);
}

前提条件:Json.NETライブラリ


4
完了したイベントを使用している場合は、UploadStringAsyncである必要があると思います。
Sam Mackrill 2015年

このメソッドをデフォルトPOSTとしてUploadString暗黙的に使用するため、引数を省略できます。さらに、返品client.Headers.Add(HttpRequestHeader.Accept, "application/json");を期待する場合は、追加することをお勧めしますJSON
jimasun 2017

WebClientは実際にIDisposableを実装していますか?数年後、.NET Framework 4.7.1で作業していますが、表示されません。
2018年

2
私は、Webクライアント上のF12をクリックすると、それはコンポーネントおよびコンポーネントの実装IDisposableをであることがわかり@bubblekingpublic class WebClient : Component public class Component : MarshalByRefObject, IComponent, IDisposable
ラースPerssonの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.