Jak uzyskać odpowiedź json za pomocą system.net.webrequest w C #?

80

Potrzebuję danych JSON z domeny zewnętrznej. Użyłem zapytania internetowego, aby uzyskać odpowiedź ze strony internetowej. Oto kod:

var request = WebRequest.Create(url);
string text;
var response = (HttpWebResponse) request.GetResponse();

using (var sr = new StreamReader(response.GetResponseStream()))
{
    text = sr.ReadToEnd();
}

Czy ktoś wie, dlaczego nie mogę uzyskać danych JSON?

h3n
źródło
ktoś wie, dlaczego nie mogę uzyskać danych JSON?
h3n
6
Potrzebujesz using (var response = request.GetResponse()){ ... }. Może nie rozwiązać problemu, ale oszczędza wyciek zasobów.
John Saunders,

Odpowiedzi:

67

Musisz wyraźnie zapytać o typ zawartości.

Dodaj tę linię:

 request.ContentType = "application/json; charset=utf-8";
W odpowiednim miejscu

Oren A
źródło
Czy można przekazać parametr z tym żądaniem?
Jidheesh Rajan
7
Request Content-Type opisuje typ treści żądania. Służy do informowania serwera, w jakim formacie dane są wysyłane na serwer. Nie ma to nic wspólnego z typem treści odpowiedzi. Klient może poprosić o odpowiedź określonym typem za pomocą Acceptnagłówka, ale serwer może to zignorować z innych powodów.
temoto
Tak, Jidheesh, zobacz ten stackoverflow.com/questions/10263082/…
Zameer Ansari
Wiem, że to stara odpowiedź, ale dla kompletności chciałem odpowiedzieć na @SHEKHARSHETE: możesz użyć czegoś takiego jak doskonały NewtonSoft JSON.Net, który wykona pracę za Ciebie i polecam przeczytanie przydatnych poradników, jak to zrobić tutaj: newtonsoft.com/json
Tahir Khalid
73

Niektóre interfejsy API wymagają podania odpowiedniego nagłówka „Accept” w żądaniu, aby uzyskać żądany typ odpowiedzi.

Na przykład, jeśli interfejs API może zwracać dane w formacie XML i JSON, a chcesz otrzymać wynik w formacie JSON, musisz ustawić HttpWebRequest.Acceptwłaściwość na „application / json” .

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(requestUri);
httpWebRequest.Method = WebRequestMethods.Http.Get;
httpWebRequest.Accept = "application/json";
Martin Buberl
źródło
1
Czy jest możliwe przekazanie tego parametru?
Jidheesh Rajan
Być może możesz spróbować dodać swoje parametry do, requestUritj. Localhost / api / product / 123
DmitryBoyko
@JidheeshRajan Zobacz to pytanie / odpowiedzi, jak dodać parametry do WebRequest stackoverflow.com/questions/3279888/ ...
Martin Buberl
1
Dodanie tylko request.ContentType = "application / json; nie było dla mnie wystarczające, więc myślę, że twoje rozwiązanie jest właściwe.
Campinho
Tę odpowiedź należy zaakceptować, ponieważ obecnie zaakceptowana odpowiedź jest nieprawidłowa. Inny przykład niestosowania „Akceptuj” w odpowiednich przypadkach ...
Arkaine55,