C #에서 WebClient를 통해 URL에 JSON 게시


87

C #으로 변환해야하는 JavaScript 코드가 있습니다. 내 JavaScript 코드는 생성 된 웹 서비스에 일부 JSON을 게시합니다. 이 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 #으로 변환하는 방법을 알아 내려고합니다. 내 앱은 .NET 2.0을 사용하고 있습니다. 내가 알 수 있듯이 다음과 같은 작업을 수행해야합니다.

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

나는이 시점에서 약간 갇혀있다. 어떻게 생겼는지 잘 모르겠습니다 json. 콘텐츠 유형을 설정해야하는지 잘 모르겠습니다. 그렇게하면 어떻게해야할지 모르겠습니다. 나는 또한 보았다 UploadData. 그래서 올바른 방법을 사용하고 있는지 확실하지 않습니다. 어떤 의미에서 내 데이터의 직렬화가 내 문제입니다.

누군가 내가 여기서 놓친 것을 말해 줄 수 있습니까?

감사합니다!

답변:


70

콘텐츠를 구문 분석하려면 json serializer가 필요합니다. 요청하는 방법에 대한 초기 질문에 대해서는 이미 가지고있을 것입니다. 이것은 아이디어 일 수 있습니다.

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을 만들어야합니다. 감사합니다.
Eels Fan

JSON처럼 보일 수 있습니까? 아니면 어떤 종류의 특수 인코딩을해야합니까?
Eels Fan

@EelsFan은 일반적으로 JSON 파서를 선택하는 데 문제가되지 않습니다. 항상 JSON.Net을 사용하여 .net 개체를 JSON으로 파싱 할 수 있지만 내 경험상 다른 JSON 파서 버전이있는 일부 클라우드 서비스가 있었고 일부를 만들어야했습니다. 조정. 시나리오에 가장 무엇인지,이 논의는 너무하지 않고 몇 가지 문제를 참조 도움이 될 수 있나요 JSON.Net stackoverflow.com/questions/9573119/...
호르헤 알바

5
UTF8이 아닌 ASCIIEncoding을 사용하는 이유는 무엇입니까? stackoverflow.com/a/9254967/109392를 참조하십시오 .
경외

2
+1 먼저를 사용하여 OP와 유사하게 시도했지만 WebClient작동하지 않았습니다. 그런 다음이 솔루션을 시도해 보았고 매력처럼 작동했습니다. 내가 사용하던 UTF8Encoding대신 ASCIIEncoding내가 받아 들일 수있는 방법으로 사용 가능한 문자를 줄여 사용 ASCII, 아무런 이유가 없기 때문에, 바이트 배열을 만들 수 있습니다. ASCII는 문자 집합에 127 자만 있습니다.
경외

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
foxontherock

그러나 매개 변수를 해당 json 문자열에 삽입하는 것은 어떻습니까?
Tali 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
completed 이벤트를 사용하는 경우 UploadStringAsync 여야한다고 생각합니다.
Sam Mackrill 2015 년

암시 적으로이 메서드를 기본값으로 사용하므로 POST인수를 생략 할 수 UploadString있습니다. 또한 반환으로 client.Headers.Add(HttpRequestHeader.Accept, "application/json");예상 JSON하는 경우 추가 할 수 있습니다 .
jimasun

WebClient는 실제로 IDisposable을 구현합니까? 몇 년 후 .NET Framework 4.7.1에서 작업 중이지만 보이지 않습니다.
bubbleking

2
@bubbleking 나는 웹 클라이언트에서 F12를 클릭하고 구성 요소와 구성 요소 구현으로 IDisposable 것을 볼public class WebClient : Component public class Component : MarshalByRefObject, IComponent, IDisposable
라스 페르손
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.