2017-08-21 92 views
6

Wysyłam żądanie post do api z C# webrequest i httpClient, ale zawsze otrzymuję komunikat o błędzie z api, który mówi, że wysłałeś nieprawidłowe dane do nagłówka , ale chodzi o to, kiedy wysyłam te same dane z rozszerzonym klientem Chrome, który działa dobrze, a ja porównałem oba żądania, nie ma nic innego, co przyłączyłem zarówno żądanie, jak i mój kod, czy ktoś może pomóc w ustaleniu, na czym polega problem,Wysyłaj żądanie internetowe działające z aplikacją klienta odpoczynku, ale nie działa z C#

to żądanie od reszty aplikacji klienckiej:

enter image description here

i tu jest żądanie od C#

enter image description here

i tu jest mój C# kod

string item = "<?xml version=\"1.0\" encoding=\"UTF - 8\"?>" + 
    "<request>" + 
    "<Username>admin</Username>" + 
    "<Password>" + password + "</Password>" + 
    "<password_type>4</password_type>" + 
    "</request> "; 
var request = (HttpWebRequest)WebRequest.Create("http://192.168.8.1/api/user/login"); 
request.Method = "POST"; 
request.Headers["_RequestVerificationToken"]= Token; 
request.Headers["Cookie"] = Sess; 
byte[] bytes = Encoding.UTF8.GetBytes(item); 
request.ContentType = "application/xml;charset=UTF-8"; 
request.ContentLength = bytes.Length; 
Stream streamreq = request.GetRequestStream(); 
streamreq.Write(bytes, 0, bytes.Length); 
streamreq.Close(); 
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    var result = reader.ReadToEnd(); 
} 
+0

'a ja w porównaniu zarówno żądać nic different' Patrząc na zrzuty ekranu, jest wiele różnych rzeczy. 'SessionID' jest inny. '_RequestVerificationToken' jest inny. – mjwills

+0

Które API dzwonisz (czy to https://github.com/arska/e3372/issues/1)? Czy dokumentują, co oznacza kod "125002"? – mjwills

+0

@mjwills sessinid i token jest zmieniany na każde żądanie, problem polega na tym, że wysyłam prawidłową sesję i identyfikator tokena, które dostaję z api, ale w C# nie zwróciło się ok, a kod błędu mówi o nieprawidłowej sesji, jest to api z Huawei LTE modemów –

Odpowiedz

3

Wygląda __RequestVerificationToken zawiera dwa podkreślenia w lewym zdjęciu, więc spróbuj tego:

request.Headers["__RequestVerificationToken"]= Token; 
+0

Ps. W komentarzach zasugerowałem również użycie małych liter, ale [nazwy pól w nagłówkach HTTP nie uwzględniają wielkości liter] (https://stackoverflow.com/a/5259004/1576119), więc dodatkowe podkreślenie powinno wystarczyć. –

1

Główna różnica to Saw tutaj było to, że w API wysyłania

application/xml 

ale kod C#, który wysyłasz:

application/xml;charset=UTF-8; 

W interfejsie API długość zawartości wynosi 230, a w C# długość zawartości wynosi 227, 3 znaki mniej.

Teraz może to być długie ujęcie, ale zestawy znaków działają inaczej przy każdej przeglądarce i każdym języku, więc może wystąpić problem z dodaniem w kodzie charset=UTF-8.

Wyślij wniosek następująco:

string item = "<?xml version=\"1.0\" encoding=\"UTF - 8\"?>" + 
    "<request>" + 
    "<Username>admin</Username>" + 
    "<Password>" + password + "</Password>" + 
    "<password_type>4</password_type>" + 
    "</request> "; 
var request = (HttpWebRequest)WebRequest.Create("http://192.168.8.1/api/user/login"); 
request.Method = "POST"; 
request.Headers["_RequestVerificationToken"]= Token; 
request.Headers["Cookie"] = Sess; 
byte[] bytes = Encoding.UTF8.GetBytes(item); 
request.ContentType = "application/xml"; 
request.ContentLength = bytes.Length; 
Stream streamreq = request.GetRequestStream(); 
streamreq.Write(bytes, 0, bytes.Length); 
streamreq.Close(); 
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    var result = reader.ReadToEnd(); 
} 
+1

bardzo dziękuję za używanie tokena weryfikacyjnego żądania z dwoma podkreślnikami. –