Nemáte náhodou někdo zkušenosti s přistupováním na HTTPS přes WebRequest a zároveň znalost jquery/javascriptu?
Zabývám se přepisem následující z jquery funkce, která zadává požadavek jistému API, do C# přes WebRequest
$J.ajax( {
url: 'https://tojejedno.com/neconeco/buylisting/' + listingid,
type: 'POST',
data: {
sessionid: g_sessionID,
currency: g_rgWalletInfo['wallet_currency'],
subtotal: this.m_nSubtotal,
fee: this.m_nFeeAmount,
total: this.m_nTotal
},
crossDomain: true,
xhrFields: { withCredentials: true }
//Zbytek funkce už je nepodstatný
} ).done( function ( data ) {
BuyItemDialog.OnSuccess( { responseJSON: data } );
} ).fail( function( jqxhr ) {
// jquery doesn't parse json on fail
var data = $J.parseJSON( jqxhr.responseText );
BuyItemDialog.OnFailure( { responseJSON: data } );
} );
Určitou dobu mi to fungovalo s následujícím kódem, jenže provider API nejspíš přidal nějaké zpřísňující
kritérium a požadavky na API mi teď nefungují. Provider API je vyhodnotí jako chybné.
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "POST";
request.Timeout = 10000;
//Headery zachycene pres wireshark
request.Host = "tojejedno.com";
request.KeepAlive = true;
request.Accept = "*/*";
request.Headers.Add("Origin", "http://tojejedno.com");
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0";
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Referer = "http://tojejedno.com/neconeco/";
request.Headers.Add("Accept-Encoding","gzip,deflate,sdch");
request.Headers.Add("Accept-Language", "en-US ,en;q=0.8");
//Cookies
request.CookieContainer = cookies ?? new CookieContainer();
//Divociny kolem SSL
request.Proxy = null;
request.Credentials = CredentialCache.DefaultCredentials;
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
//Zpracovani dat, ktera budou odeslana POST metodou
string dataString = String.Join("&", Array.ConvertAll(data.AllKeys, key =>
String.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(data[key]))
)
);
byte[] dataBytes = Encoding.ASCII.GetBytes(dataString);
request.ContentLength = dataBytes.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(dataBytes, 0, dataBytes.Length);
//Ziskani odezvy
HttpWebResponse resp = (HttpWebResponse)request.GetResponse();
return resp;
Jsem si jistý, že odesílám správná data a že v cookies mám všechny parametry, které API vyžaduje.
Ale ze dne na den mi výše uvedený kód přestal fungovat. Tak jsem se rozhodl podívat na to co se
děje na síti i přesto, že je komunikace šifrovaná a přišel jsem na to, že WebRequest přistupuje
na rozdíl od Firefoxu k tomu HTTPS API jinak a zdá se, že špatně:
Tohle generuje Firefox
Tohle generuje můj kód
Bohužel SSL a síťažina vůbec není moje silná stránka, takže nevím kde hledat zakopaného psa. Neměli byste někdo nějaký tip?