C#을 사용하여 서버에 JSON을 게시하려면 어떻게 해야 합니까?
사용하고 있는 코드는 다음과 같습니다.
// create a request
HttpWebRequest request = (HttpWebRequest)
WebRequest.Create(url); request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "POST";
// turn our request string into a byte stream
byte[] postBytes = Encoding.UTF8.GetBytes(json);
// this is important - make sure you specify type this way
request.ContentType = "application/json; charset=UTF-8";
request.Accept = "application/json";
request.ContentLength = postBytes.Length;
request.CookieContainer = Cookies;
request.UserAgent = currentUserAgent;
Stream requestStream = request.GetRequestStream();
// now send it
requestStream.Write(postBytes, 0, postBytes.Length);
requestStream.Close();
// grab te response and print it out to the console along with the status code
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string result;
using (StreamReader rdr = new StreamReader(response.GetResponseStream()))
{
result = rdr.ReadToEnd();
}
return result;
이 기능을 실행하면 항상 500개의 내부 서버 오류가 발생합니다.
내가 뭘 잘못하고 있지?
작업방법과 작업방법은 다음과 같습니다.
var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://url");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
string json = "{\"user\":\"test\"," +
"\"password\":\"bla\"}";
streamWriter.Write(json);
}
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
}
이 작업을 좀 더 쉽게 수행하기 위해 라이브러리를 작성했습니다.이 문서는 https://github.com/ademargomes/JsonRequest에 있습니다.
Ademar의 솔루션은 다음과 같은 이점을 활용하여 개선할 수 있습니다.JavaScriptSerializer
의Serialize
개체를 JSON으로 암묵적으로 변환하는 메서드를 지정합니다.
또, 다음의 기능을 활용할 수 있습니다.using
명시적으로 호출을 생략하기 위한 스테이트먼트의 기본 기능Flush
그리고.Close
.
var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://url");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
string json = new JavaScriptSerializer().Serialize(new
{
user = "Foo",
password = "Baz"
});
streamWriter.Write(json);
}
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
}
이 타입은 새로운 실장입니다.WebClient
그리고.HttpWebRequest
둘 다WebClient
그리고.WebRequest
사용되지 않는 것으로 표시되었습니다.[1]
다음 행을 사용할 수 있습니다.
string myJson = "{'Username': 'myusername','Password':'pass'}";
using (var client = new HttpClient())
{
var response = await client.PostAsync(
"http://yourUrl",
new StringContent(myJson, Encoding.UTF8, "application/json"));
}
필요할 때HttpClient
인스턴스를 하나만 생성하여 재사용하거나 새로운 인스턴스를 사용하는 것이 여러 번 권장됩니다.HttpClientFactory
. [2]
FTP의 경우 HttpClient가 지원하지 않으므로 타사 라이브러리를 사용하는 것이 좋습니다.
@learn.microsoft.com [3]
dotnet core 3.1부터를 사용할 수 있습니다.System.Text.Json
json 문자열을 만듭니다.
string myJson = JsonSerializer.Serialize(credentialsObj);
숀의 포스트에 덧붙여, 사용상의 발언들을 포함시킬 필요는 없습니다.타고using
StreamWriter는 블록의 마지막에 플러시되고 닫히기 때문에 명시적으로 콜할 필요가 없습니다.Flush()
그리고.Close()
메서드:
var request = (HttpWebRequest)WebRequest.Create("http://url");
request.ContentType = "application/json";
request.Method = "POST";
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
string json = new JavaScriptSerializer().Serialize(new
{
user = "Foo",
password = "Baz"
});
streamWriter.Write(json);
}
var response = (HttpWebResponse)request.GetResponse();
using (var streamReader = new StreamReader(response.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
}
비동기적으로 호출할 필요가 있는 경우
var request = HttpWebRequest.Create("http://www.maplegraphservices.com/tokkri/webservices/updateProfile.php?oldEmailID=" + App.currentUser.email) as HttpWebRequest;
request.Method = "POST";
request.ContentType = "text/json";
request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);
private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
// End the stream request operation
Stream postStream = request.EndGetRequestStream(asynchronousResult);
// Create the post data
string postData = JsonConvert.SerializeObject(edit).ToString();
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
postStream.Write(byteArray, 0, byteArray.Length);
postStream.Close();
//Start the web request
request.BeginGetResponse(new AsyncCallback(GetResponceStreamCallback), request);
}
void GetResponceStreamCallback(IAsyncResult callbackResult)
{
HttpWebRequest request = (HttpWebRequest)callbackResult.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult);
using (StreamReader httpWebStreamReader = new StreamReader(response.GetResponseStream()))
{
string result = httpWebStreamReader.ReadToEnd();
stat.Text = result;
}
}
저는 최근 JSON을 게시하는 보다 간단한 방법을 생각해 냈고, 앱에서 모델로부터 변환하는 단계를 추가했습니다.참고: 모델을 만들어야 합니다.[JsonObject]
컨트롤러가 값을 취득하여 변환을 실행할 수 있도록 합니다.
요청:
var model = new MyModel();
using (var client = new HttpClient())
{
var uri = new Uri("XXXXXXXXX");
var json = new JavaScriptSerializer().Serialize(model);
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PutAsync(uri,stringContent).Result;
// ...
}
모델:
[JsonObject]
[Serializable]
public class MyModel
{
public Decimal Value { get; set; }
public string Project { get; set; }
public string FilePath { get; set; }
public string FileName { get; set; }
}
서버 측:
[HttpPut]
public async Task<HttpResponseMessage> PutApi([FromBody]MyModel model)
{
// ...
}
사용하고 있는 Content-Type에 주의해 주세요.
application/json
출처:
경고! 나는 이 주제에 대해 매우 강한 견해를 가지고 있다.
.NET의 기존 웹 클라이언트는 개발자 친화적이지 않습니다!WebRequest와 WebClient는 '개발자를 좌절시키는 방법'의 대표적인 예입니다.C#의 간단한 Post 요청만 있으면 상세하고 작업이 복잡합니다.HttpClient는 이러한 문제에 대처하는데 어느 정도 도움이 되지만 여전히 부족합니다.게다가 Microsoft 의 문서도 나쁘고, 기술적인 잡담의 페이지를 걸러내고 싶지 않은 경우는, 정말로 좋지 않습니다.
구조를 위한 오픈 소스입니다.대안으로 3가지 우수한 오픈 소스 무료 NuGet 라이브러리가 있습니다.정말 고맙네요!이것들은 모두 서포트, 문서화되어 있습니다.또, 간단하게 수정, 매우 간단하게 조작할 수 있습니다.
- 서비스 스택텍스트 - 빠르고 가볍고 복원력이 뛰어납니다.
- RestSharp - 단순 REST 및 HTTP API 클라이언트
- Flurl - 유연하고 휴대성이 뛰어나고 테스트 가능한 HTTP 클라이언트 라이브러리
그 사이에 큰 차이는 없지만 Service Stack을 제공하겠습니다.가느다란 모서리를 텍스트로 표시...
- 기허브 별들은 대략 비슷하다.
- 해결되지 않은 문제 및 중요한 문제는 얼마나 빨리 종료됩니까?Service Stack은 문제를 가장 빨리 해결하고 해결되지 않은 문제를 해결했습니다.
- 문서?모두 훌륭한 문서를 가지고 있지만, Service Stack은 이를 다음 단계로 끌어올려 문서화의 '골든 스탠다드'로 알려져 있습니다.
OK - JSON의 Post Request는 ServiceStack 내에서 어떤 모습입니까?문자요?
var response = "http://example.org/login"
.PostJsonToUrl(new Login { Username="admin", Password="mypassword" });
그것은 한 줄의 코드입니다.간결하고 간단해!위의 내용을 와 비교합니다.NET의 Http 라이브러리.
이 옵션은 .Net 4.5.1까지 사용할 수 있습니다.
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:9000/");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var foo = new User
{
user = "Foo",
password = "Baz"
}
await client.PostAsJsonAsync("users/add", foo);
}
HttpClient를 다음과 같이 사용하는 방법이 있습니다.
public async Task<HttpResponseMessage> PostResult(string url, ResultObject resultObject)
{
using (var client = new HttpClient())
{
HttpResponseMessage response = new HttpResponseMessage();
try
{
response = await client.PostAsJsonAsync(url, resultObject);
}
catch (Exception ex)
{
throw ex
}
return response;
}
}
마지막으로 를 포함하여 동기 모드로 호출했습니다.결과
HttpResponseMessage response = null;
try
{
using (var client = new HttpClient())
{
response = client.PostAsync(
"http://localhost:8000/....",
new StringContent(myJson,Encoding.UTF8,"application/json")).Result;
if (response.IsSuccessStatusCode)
{
MessageBox.Show("OK");
}
else
{
MessageBox.Show("NOK");
}
}
}
catch (Exception ex)
{
MessageBox.Show("ERROR");
}
읽어낸 JSON 데이터를 게시하는 가장 친근하고 간결한 방법은 다음과 같습니다.
var url = @"http://www.myapi.com/";
var request = new Request { Greeting = "Hello world!" };
var json = JsonSerializer.Serialize<Request>(request);
using (WebClient client = new WebClient())
{
var jsonResponse = client.UploadString(url, json);
var response = JsonSerializer.Deserialize<Response>(jsonResponse);
}
를 하고 System.Text.Json
JSON의 시리얼화 및 시리얼화를 실시합니다.'NuGet' 참조.
닷넷 코어 솔루션
번째 사용법Newtonsoft.Json
그런 다음 다음과 같은 방법을 작성합니다.
public static string? LoginToken()
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://url");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
// write your json content here
string json = JsonConvert.SerializeObject(new
{
userName = ApiOptions.Username,
password = ApiOptions.Password
}
);
streamWriter.Write(json);
}
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
return result;
}
}
는 반환됩니다.string
「」의를 해제하는 는,string
JSON
해서 한 됩니다.
var result = streamReader.ReadToEnd();
var json_result = JsonConvert.DeserializeObject<LoginTokenResponse>(result); // + add this code
쪽일까요?LoginTokenResponse
입니다.
이렇게 하는 거야
//URL
var url = "http://www.myapi.com/";
//Request
using var request = new HttpRequestMessage(HttpMethod.Post, url);
//Headers
request.Headers.Add("Accept", "application/json");
request.Headers.Add("Cache-Control", "no-cache");
//Payload
var payload = JsonConvert.SerializeObject(
new
{
Text = "Hello world"
});
request.Content = new StringContent(payload, Encoding.UTF8, "application/json");
//Send
var response = await _httpClient.SendAsync(request);
//Handle response
if (response.IsSuccessStatusCode)
return;
var data = Encoding.ASCII.GetBytes(json);
byte[] postBytes = Encoding.UTF8.GetBytes(json);
UFT8 대신 ASCII 사용
언급URL : https://stackoverflow.com/questions/9145667/how-to-post-json-to-a-server-using-c
'sourcecode' 카테고리의 다른 글
ORA-00972 식별자가 너무 깁니다. 별칭 열 이름입니다. (0) | 2023.03.29 |
---|---|
React 구성 요소에서 사용자 지정 함수 생성 (0) | 2023.03.29 |
useState 초기값을 함수로 사용하는 경우 (0) | 2023.03.29 |
IOS9 WK Web View접근 제어 허가 발신지 (0) | 2023.03.29 |
json 인코딩 문자열 내에서 서브 어레이 데이터 주위에 대괄호를 추가하는 방법은 무엇입니까? (0) | 2023.03.29 |