Oto kod, którego używam:
// 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;
Kiedy to uruchamiam, zawsze pojawia się 500 wewnętrzny błąd serwera.
Co ja robię źle?
c#
json
post
httpwebrequest
Arsen Zahray
źródło
źródło
Odpowiedzi:
Sposób, w jaki to robię i działa to:
Napisałem bibliotekę, aby wykonać to zadanie w prostszy sposób, jest tutaj: https://github.com/ademargomes/JsonRequest
Mam nadzieję, że to pomoże.
źródło
Roztwór Ademar może być poprawiona poprzez wykorzystanie
JavaScriptSerializer
jestSerialize
sposób zapewnić niejawnego konwersji obiektu JSON.Dodatkowo można wykorzystać
using
domyślną funkcjonalność instrukcji, aby pominąć jawne wywołanieFlush
iClose
.źródło
application/json
był prawidłowy.Ten
HttpClient
typ jest nowszą implementacją niżWebClient
iHttpWebRequest
.Możesz po prostu użyć następujących wierszy.
Jeśli potrzebujesz
HttpClient
więcej niż raz, zaleca się utworzenie tylko jednego wystąpienia i ponowne użycie go lub użycie nowegoHttpClientFactory
.źródło
HttpClientFactory
. Nie przeczytałem wszystkich odpowiedzi w powiązanym numerze, ale myślę, że wymaga aktualizacji, ponieważ nie wspomina o fabryce.Poza postem Seana nie trzeba zagnieżdżać instrukcji using. By
using
w StreamWriter będzie zaczerwieniona i zamknięta na końcu bloku, więc nie trzeba jawnie wywołaćFlush()
iClose()
metod:źródło
Jeśli chcesz zadzwonić asynchronicznie, użyj
źródło
postStream.Write(postData);
- w zależności od interfejsu API może być konieczne użycierequest.ContentType = "application/json";
zamiast niegotext/json
.Zadbaj o typ zawartości, którego używasz:
Źródła:
RFC4627
Inny post
źródło
Niedawno wymyśliłem znacznie prostszy sposób opublikowania JSON, z dodatkowym krokiem konwersji z modelu w mojej aplikacji. Pamiętaj, że musisz wykonać model [JsonObject] dla swojego kontrolera, aby uzyskać wartości i wykonać konwersję.
Żądanie:
Model:
Po stronie serwera:
źródło
Ta opcja nie jest wymieniona:
źródło
Innym i czystym sposobem na osiągnięcie tego jest użycie HttpClient w następujący sposób:
źródło
PostAsJsonAsync
nie jest już dostępne od .NET 4.5.2. UżyjPostAsync
zamiast tego. Więcej tutajusing
stwierdzeniuIDisposable
interfejs z jakiegoś powoduOSTRZEŻENIE! Mam bardzo mocne zdanie na ten temat.
Obecni klienci sieci .NET nie są przyjaźni dla programistów! WebRequest i WebClient są doskonałymi przykładami „jak sfrustrować programistę”. Są pełne i skomplikowane w pracy; gdy wszystko, co chcesz zrobić, to proste żądanie Post w C #. HttpClient w jakiś sposób rozwiązuje te problemy, ale nadal nie spełnia tego zadania . Poza tym dokumentacja Microsoftu jest zła… naprawdę zła; chyba że chcesz przeszukiwać strony techniczne.
Open-source na ratunek.Istnieją trzy doskonałe, bezpłatne biblioteki NuGet jako alternatywy. Dzięki Bogu! Wszystkie są dobrze obsługiwane, udokumentowane i tak, łatwa - korekta… bardzo łatwa - praca.
Nie ma między nimi wiele, ale dałbym ServiceStack. Tekst lekką przewagę…
Ok - więc jak wygląda żądanie postu w JSON w ServiceStack.Text?
To jest jedna linia kodu. Zwięzłe i łatwe! Porównaj powyższe z bibliotekami HTTP platformy .NET.
źródło
W końcu wywołałem w trybie synchronizacji, włączając .Result
źródło
var data = Encoding.ASCII.GetBytes(json);
byte[] postBytes = Encoding.UTF8.GetBytes(json);
Użyj ASCII zamiast UFT8
źródło