在android中获取HTML响应而不是JSON

Posted

技术标签:

【中文标题】在android中获取HTML响应而不是JSON【英文标题】:Getting HTML response instead of JSON in android 【发布时间】:2015-12-01 07:07:28 【问题描述】:

我正在尝试通过 php 从位于远程服务器上的 mysql 数据库中检索数据到 android。这在 localhost 中运行时效果很好。但是当它在远程服务器中时,我会收到 html 代码而不是来自服务器的 JSON 响应。我尝试在浏览器中粘贴 url (http://ksos.0fees.us/pgm_list.php?day=1&hall=A),从而得到正确的 JSON 输出。 HTML 响应如下所示。

<html><body>
<script type="text/javascript" src="/aes.js" ></script>
<script>function toNumbers(d)
 var e=[];
  d.replace(/(..)/g,function(d)e.push(parseInt(d,16)));
  return e
 
 function toHex()
  for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)
  e+=(16>d[f]?"0":"")+d[f].toString(16);
  return e.toLowerCase()
 
 var a=toNumbers("f655ba9d09a112d4968c63579db590b4"),b=toNumbers("98344c2eee86c3994890592585b49f80"),c=toNumbers("5cb1c0309e553acda177d912f21ac485");
 document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; 
 expires=Thu, 31-Dec-37 23:55:55 GMT; 
 path=/";
 location.href="http://ksos.0fees.us/pgm_list.php?day=1&hall=A&ckattempt=1";
</script>
<noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript>
</body></html>

以下是我对服务器获取响应的请求

public String makeServiceCall(String url, int method, List<NameValuePair> params)
    try
        DefaultHttpClient httpclient = new DefaultHttpClient();
        HttpEntity httpentity = null;
        HttpResponse httpresponse = null;

        if (method == POST) 
            HttpPost httppost = new HttpPost(url);
            httppost.setHeader("User-Agent", ua);
            httppost.setHeader("Accept", "application/json");
            if(params!=null)
                httppost.setEntity(new UrlEncodedFormEntity(params));
            
            httpresponse = httpclient.execute(httppost);
         else if(method == GET)
            if(params!=null)
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
            
            HttpGet httpget = new HttpGet(url);
//              HttpPost httppost = new HttpPost(url);
            httpget.setHeader("User-Agent", ua);
            httpget.setHeader("Accept", "application/json");
            httpresponse = httpclient.execute(httpget);
        
        httpentity = httpresponse.getEntity();
        is = httpentity.getContent();
    catch(UnsupportedEncodingException e)
        e.printStackTrace();
    catch (ClientProtocolException e) 
         e.printStackTrace();
    catch (IOException e) 
         e.printStackTrace();
    
    try
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"),8);
//          BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine())!= null) 
            sb.append(line+"\n");
        
        is.close();
        response = sb.toString();
    catch(Exception e)
        Log.e("Buffer Error", "Error : "+e.toString());
    
    return response;

我已经尝试为用户代理设置而不是设置 setHeader。 php部分如下:

$q=mysql_query("SELECT ...........");
if(!empty($q))
    while($row=mysql_fetch_assoc($q))
        $pgmlist[]=$row;
    $response["pgmlist"] = $pgmlist;
    echo json_encode($response);


else
    $response["success"] = 0;
    $response["message"] = "No record found";
    echo json_encode($response);

【问题讨论】:

请在您将输出回显到您的 android 应用程序的地方发布 php 代码 我不希望 php 出现任何问题,因为当我在任何浏览器中检查 URL 时,我得到了所需的输出 问:这其中哪一部分不是服务器端的问题?问:您是否编写(或控制)服务器端 PHP 应用程序?问:您的 localhost 配置是否使用 same PHP 应用程序和 same HTTP 服务器?问:服务器日志说什么? “本地主机”和“远程”HTTP 请求之间有什么区别吗?您从服务器端完成了多少故障排除? 上面给出的php只是服务器端的。本地主机使用与远程服务器完全相同的东西并给出了正确的结果。我还没有完成服务器端故障排除。我到底应该在那里做什么? 您的问题几乎肯定出在服务器端。一台服务器发回纯 JSON(我猜,根据你的说法),另一台发回 HTML + Javascript。您需要弄清楚为什么服务器响应不同。再次: 问:您是在本地运行 same PHP 应用程序,因为远程服务器正在运行......还是在本地“模拟”它?问:本地和远程是否具有相同类型的 HTTP 服务器/相同的 PHP 配置?问:您是否查看过服务器日志(本地和远程)?您是否在日志中看到相同的“请求”?问:身份验证会是个问题吗? 【参考方案1】:

Atlast 找到了解决方案...

问题不在于 android 或 php 部分。这是服务器的问题。我使用的托管站点将 cookie 发送到客户端,这不是在 android 内部处理的,而是由浏览器自动处理的。我曾经使用过另一个不涉及 cookie 的托管站点并获得了所需的 json 输出。

【讨论】:

你能解释一下吗?我有同样的问题 大多数免费的虚拟主机站点都发送了 cookie 以增强客户体验。这在浏览器的情况下很好,因为浏览器使用此 cookie 进行管理。但是在我们创建的安卓应用程序中,如果我们通常不编写任何代码来接受这些 cookie。于是就出现了这种情况。要么我们必须编写代码来接受 cookie,要么寻找不发送 cookie 的服务器。 能否请您解释并编写代码,如何接受cookie @Niyaz 您使用的新托管网站是什么?【参考方案2】:

我花了很长时间去理解和解决问题。

首先,我们需要了解 0fess 托管具有阻止来自(非浏览器)客户端的调用的反僵尸技术。这种技术的主要思想是使用一个 javascript 脚本来检查请求是否来自普通的 Web 浏览器,然后该脚本会加密 IP,并使用密钥 __test 和加密 IP 的值设置一个 cookie。

为了解决这样的问题,我们需要在我们的应用程序中运行一个 webview 并从我们的 0fees 站点请求任何页面。然后我们可以拦截响应并获取cookie。之后,我们就可以在我们的 http rest 请求中使用这个 cookie 作为请求头了。

这是一个示例代码

 WebView browser=new WebView(getContext());
    browser.getSettings().setJavaScriptEnabled(true); 
    browser.setWebViewClient(new WebViewClient() 
        @Override
        public void onPageFinished(WebView view, String url)
            final String cookies = CookieManager.getInstance().getCookie(url);
            Log.d("any", "All the cookies by me in a string:" + cookies);
            HttpPost httppost = new HttpPost("http://ksos.0fees.us/pgm_list.php");
            httppost.setHeader("Accept", "application/json");
            httppost.setHeader("Cookie", cookies);
            //continue your request paramters 
           
       
  );
browser.loadUrl("http://ksos.0fees.us/");

【讨论】:

这个答案给了我一个很好的“北方”。我正在使用 infinityfree.net 并看到相同的行为。不幸的是,这里的解决方案有时有效,有时无效。服务器正在做一些我无法弄清楚的事情。我搬到了000webhost.com,现在它就像一个魅力,不需要解决方法。

以上是关于在android中获取HTML响应而不是JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何从android中的URL获取json数组而不是html

在ios中获取json响应而不是php

在spring boot中仅获取值而不是JSON响应中的键和值

从 php 获取响应并保存在 android 文件中

使用单个元素 android studio 获取 Json 数组

为啥 Cassandra 在获取数据时响应缓慢而不是拆分到不同的范围查询?