【问题标题】:REST API returning HTML garbage on Standard HTTPWebRequest POSTREST API 在标准 HTTPWebRequest POST 上返回 HTML 垃圾
【发布时间】:2017-08-13 10:33:38
【问题描述】:

我有一个应用程序发出 Web 请求以取回要显示给用户实时报价的数据集。我检查了 Web API 并没有太大变化,我的 Web 请求的格式似乎正确,请求正文有效负载正确,但我没有取回数据。

HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(SearchHelper.SearchUrl);
httpRequest.Method = "POST"; 
httpRequest.ContentType = "application/json;charset=utf-8"; 
httpRequest.CookieContainer = new CookieContainer(); 
httpRequest.BeginGetRequestStream(new AsyncCallback(GetWebRequestBody), httpRequest); 

有人知道发生了什么吗?我可以通过浏览器发出类似的请求,我仍然可以为我的实时报价取回格式正确的数据,但是通过以前一直有效的 .Net HttpWebRequest 现在返回以下内容。

" 请加载网站 等等... html{height: 100%}body{margin: 0;height: 100%;}header{背景颜色:#020202;高度:64px;宽度: 100%;display: none;}header img{margin: 3px 0 0 2px;}section{height: calc(100% - 64px);}.content{padding: 0;position: relative;top: 计算(50% - 64px);文本对齐:居中;边距:自动;变换: translateY(-50%);}.left-img{display: inline-block;margin-right: 23px;}#JSCookieMSG .left-img, #JSOffMSG .left-img{显示: 内联块;边距:0 23px 0 0;}.right-msg{显示: 内联块;颜色:#4b4b4b;文本对齐: left;}.msg-head{vertical-align: top;margin: 0;display: 内联块;颜色:#4b4b4b;字体大小:35 像素;行高: 33px;字体粗细:粗体;字体系列:'Arial Narrow',Arial, sans-serif;padding-top: 46px;}#loading-content{padding: 10px;}#loading-content .left-img{margin-right: 10px;height: 10px;}#loading-content .left-img img{height: 8px;}#loading-content .msg-head{垂直对齐:继承;颜色:#4b4b4b;字体大小: 17px;字体粗细:正常;上边距:0;行高: 22px;}#JSCookieMSG .msg-head, #JSOffMSG .msg-head{font-size: 35px;行高:33px;字体粗细:粗体;字体系列:'Arial Narrow', Arial, sans-serif;}.divider{display: inline-block;margin: 0 21px 0 20px;}.msg-head-cookies{边距:0;}.msg-head-js{边距:0 0 0 2px;}.msg-main{margin-top: 14px;padding: 0;font-size: 13px;line-height: 16px;font-family: Arial, 'Helvetica Neue', 黑体,无衬线;}.icon{边距:-4px 9px 0 -3px;}.incident-id{display: inline-block;font-size: 15px;vertical-align: top;font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif;}@media(max-width: 768px){header img{margin-top: 3 像素;最小宽度:400 像素;宽度:100%;最大宽度:561 像素;高度: 65px;}.content{top: 200px;}}@media(max-width: 556px){.left-img{display: none;}.content{top: 200px;}}@media(max-height: 580px){.content{top: 200px;}} 请加载网站 等等... #loading-content{显示:无;} Cookies 已禁用此 网站正在使用安全服务来保护自己不上网 攻击。
该服务需要完整的 cookie 支持才能查看 该网站。
请在您的浏览器上启用 Cookie,然后重试。

参考编号: ff0bdf6aeb56b1845c11e93b11faecc9 JavaScript 已禁用此 网站正在使用安全服务来保护自己不上网 攻击。
该服务需要完整的 JavaScript 支持才能 查看网站。
请在您的浏览器上启用 Javascript 并尝试 再次。参考编号: ff0bdf6aeb56b1845c11e93b11faecc9 功能 sbbloadmid(){if(window.sbrmp){var smbMode=\"frm\";if(smbMode==\"frm\"){var bodyObj=document.getElementsByTagName(\"body\")[0];var submitFrm=document.createElement(\"form\");bodyObj.appendChild(submitFrm);submitFrm.id=\"sbmtfrm\";submitFrm.method=\"post\";submitFrm.action=\"\";submitFrm .sbbSbmt=submitFrm.submit;submitFrm.sbbSbmt();}否则 window.location.reload(true);}else{setTimeout(\"sbbloadmid()\", 50);}}变种 cookieenabled=false;if(navigator.cookieEnabled){if(navigator.cookieEnabled==true){var exdate=新 Date();exdate.setDate(exdate.getDate()+1);document.cookie=\"sbtsck=jav;path=/;expires=\"+exdate.toGMTString()+\"\";cookieenabled=( document.cookie.indexOf(\"sbtsck\")!=-1)? 真的 : false;}}if(cookieenabled){setTimeout(\"sbbloadmid()\",50);}else{var oJSCookieMSGObj=document.getElementById('JSCookieMSG');var loadingContent=document.getElementById('loading-content');var header=document.getElementsByTagName('header');oJSCookieMSGObj.style.display='block';header.style.display='block';loadingContent.style.display='none';} \n
\n sbbvscc='';\n
sbbgscc='';\n function genPid() {return String.fromCharCode(119)+String.fromCharCode(70) ; };\n
\n \n (函数(XHR){var open=XHR.prototype.open;var 发送=XHR.prototype.send;var parser=document.createElement('a');XHR.prototype.open=function(method, url, 异步, 用户, 通过){if(typeof async=='undefined'){async=true;}parser.href=url;if(parser.host==''){parser.href=parser.href;}this.ajax_hostname=parser.hostname;open.call (这, 方法、url、异步、用户、 pass);};XHR.prototype.send=function(data){if(location.hostname==this.ajax_hostname)this.setRequestHeader(\"X-MOD-SBB-CTYPE\", \"xhr\");send.call(this, data);}})(XMLHttpRequest);函数 sbbgc(check_name){var start=document.cookie.indexOf(check_name+\"=\");var oVal='';var len=start+check_name.length+1;if((!start)&&(document.cookie.substring(0,check_name.length)!=​​check_name)){oVal='';}else 如果(开始==-1){oVal='';}否则{var end=document.cookie.indexOf(';',len);if(end==-1)end=document.cookie.length;var oVal=document.cookie.substring(len,end);};返回oVal;}函数 addmg(inm,ext){var primgobj=document.createElement('IMG');primgobj.src=window.location.protocol+\"//\"+window.location.hostname+(window.location.port && window.location.port!=80 ? ':'+window.location.port: '')+\"/sbbi/?sbbpg=\"+inm+(ext?\"&\"+ext:\"\");var sbbDiv=document.getElementById('sbbfrcc');sbbDiv.appendChild(primgobj);};函数 addprid(prid){var oldVal=sbbgc(\"PRLST\");if((oldVal.indexOf(prid)==-1)&&(oldVal.split('/').length -1 || str.indexOf(key+'=')==0){var idx=str.indexOf('&'+key+'=');if(idx==-1)idx=str.indexOf(key+'=');var end=str.indexOf('&', idx+1);var newstr;if(end !=-1)newstr=str.substr(0, idx)+str.substr(end+(idx ? 0 : 1))+'&'+key+'='+value;否则newstr=str.substr(0, idx)+'&'+key+'='+value;return newstr;}else return str+'&'+key+'='+value;};var strgt=function(name, text){if(typeof text !='string')return \"\";var nameEQ=name+\"=\";var ca=text.split(/[;&]/);for(var i=0;i 1){if(invalArr[0]==\"A\"||invalArr[0]==\"D\"){ invl=invalArr[1];}否则 invl=\"\";}if(invl==null||typeof(invl)==\"undefined\"||invl==\"falseImgUT\"||invl==\"undefined\"||invl ==\"null\"||invl!=encodeURI(invl))invl=\"\";if(typeof(invl).toLowerCase()==\"string\")if(invl.length>20) if(invl.substr(0,2)!=\"h4\")invl=\"\";}catch(ex){invl=\"\";}return invl;};this.sbbsv=function( fv){for(var elm in this){if(this[elm].name==\"sbbrf\"){this[elm].f(\"altutgv2\",fv);}}document.cookie=\"UTGv2=\"+fv+ ';过期=星期二, 2030 年 12 月 31 日 00:00:00 UTC;path=/';};this.sbbgv=function(){var valArr=Array();var currVal=\"\";for(var elm in this){if(this[elm].name==\"sbbrf\"){currVal=this[elm].f(\"altutgv2\");currVal=this.sbbcv(currVal);if(currVal!= \"\")valArr[currVal]=(typeof(valArr[currVal])!=\"undefined\"?valArr[currVal]+1:1);}}var lb=0;var fv=\"\";for(var val in valArr){if(valArr[val]>lb){fv=val;lb=valArr[val]}}if(fv==\"\")fv=sbbgc(\"UTGv2\");fv=this. sbbcv(fv);if(fv!=\"\")this.sbbsv(fv);else this.sbbsv(\"D-h470427f615e9a3c2e0e8cb93383234e8d86\");返回 fv;};};函数 m2vr(m1,m2){var i=0;var rc=\"\";var est=\"ghijklmnopqrstuvwyz\";var rnum;var rpl;var 魅力1=m1.charAt(i);var charm2=m2.charAt(i);while(charm1!=\"\"||charm2!=\"\"){rnum=Math.floor(Math.random()* est.length);rpl=est.substring(rnum,rnum+1);rc+=(charm1==\"\"?rpl:charm1)+(charm2==\"\"?rpl:charm2);i++; charm1=m1.charAt(i);charm2=m2.charAt(i);}return rc;}函数 sbbls(prid){try{var eut=sbbgc(\"UTGv2\");sbbeccfi=new sbbeccf();sbbgs=sbbeccfi.sbbgv();if(eut!=sbbgs && sbbgs!=\"\" && typeof(sbbfcr)==\"undefined\"){addmg('utMedia',\"vii=\"+m2vr(\"15e90d11d95bce15d7faa0030fd4a92d\",sbbgs));}var sbbiframeObj=document.createElement('IFRAME');var dfx=new Date();sbbiframeObj.id='SBBCrossIframe';sbbiframeObj.style.border='0px';if(document.all){sbbiframeObj.style.position='absolute';sbbiframeObj.style.top='-1px'; sbbiframeObj.style.height='1px';sbbiframeObj.style.width='28px';}否则{sbbiframeObj.style.height='1px';sbbiframeObj.style.width='0px';}sbbiframeObj.scrolling=\" NO\";sbbiframeObj.src=window.location.protocol+\"//\"+window.location.hostname+(window.location.port && window.location.port!=80 ? ':'+window.location.port: '')+'/sbbi/?sbbpg=sbbShell&gprid='+prid + '&sbbgs='+sbbgs+'&ddl='+(Math.round(dfx.getTime()/1000)-1490112137)+'';var sbbDiv=document.getElementById('sbbfrcc');sbbDiv.appendChild(sbbiframeObj);}catch(ex){;}}try{y=unescape(sbbvscc.replace(/^$/g,''));document.getElementById('sbbhscc').innerHTML=y;x=unescape(sbbgscc.replace(/^$/g,''));}catch(e){x='函数 genPid(){返回 \"jser\";}';}try{if(window.gprid==undefined)document.write(''+x+\"var gprid=genPid();addprid(gprid);sbbls(gprid);\");}catch(e){addprid(\"dwer\");} "

【问题讨论】:

  • 读取已经返回的内容:This website is using a security service to protect itself from online attacks. The service requires full cookie support in order to view the website. Please enable Cookies on your browser and try again.
  • 我没有弄明白,它是字面上写在响应中的。使用 CTRL + F 你会看到它。是的,我假设您需要一个 cookie 容器。没有看到代码,我不知道是哪一个,但你的猜测对我来说是正确的。
  • 仅供参考,它还显示JavaScript Disabled This website is using a security service to protect itself from online attacks. The service requires full JavaScript support in order to view the website. Please enable Javascript on your browser and try again.。不知道你怎么绕过那个。可能是时候与提供商交谈了。
  • 我明白了,我以前没有看到。正文如下: Cookies disabled 该网站正在使用安全服务来保护自己免受在线攻击。该服务需要完整的 cookie 支持才能查看网站。请在您的浏览器上启用 Cookie,然后重试。参考 ID:ff0bdf6aeb56b1845c11e93b11faecc9 JavaScript Disabled 该网站使用安全服务来保护自己免受在线攻击。该服务需要完整的 JavaScript 支持才能查看该网站。请在您的浏览器上启用 Javascript,然后重试。
  • 我猜测这不是 API,但您正在尝试解析普通的 HTML 页面。看起来他们已经实施了检测以防止抓取工具读取页面,不幸的是它们非常有效。我说的对吗?

标签: c# .net web-services rest httpwebrequest


【解决方案1】:

我认为答案是在发出请求时提供 UserAgent。

var wc = new System.Net.WebClient();
wc.Headers.Add ("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
var result = wc.DownloadString(new Uri("url"));

结果现在包含预期的 JSON


OP 已澄清他使用HttpWebRequest。现有代码将保持不变,只需在此行中添加适当的 UserAgent 字符串:

httpRequest.UserAgent = 
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";

快速示例(可以改进,只是为了证明一点):

var httpRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create("url"); 
httpRequest.Method = "POST"; 
httpRequest.ContentType = "application/json; charset=utf-8"; 
httpRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
var response = (System.Net.HttpWebResponse)httpRequest.GetResponse();
Stream receiveStream = response.GetResponseStream();
StreamReader readStream = new StreamReader(receiveStream);
var result = readStream.ReadToEnd();

结果同上。

【讨论】:

  • 没问题。您也可以传递搜索参数,但由于您的问题中没有代码,如果不是 WebClient,我无法判断您使用什么来发出这些请求。
  • 好的,现在看看。
  • HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(SearchHelper.SearchUrl); httpRequest.Method = "POST"; httpRequest.ContentType = "应用程序/json; charset=utf-8"; httpRequest.CookieContainer = new CookieContainer(); httpRequest.BeginGetRequestStream(new AsyncCallback(GetWebRequestBody), httpRequest);
  • 我建议使用正确的格式将代码编辑到您的问题中,这很难阅读,如果留在 cmets 中可能会被其他读者遗漏。
  • HttpWebRequest 添加了一个示例,对我有用。不确定这是一个安全风险,看不到您提供私人详细信息的任何地方,这似乎是一个公共 API。我猜由你决定。
猜你喜欢
  • 2020-04-01
  • 2014-06-18
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 2017-09-04
  • 2014-12-04
相关资源
最近更新 更多