【问题标题】:Why I can't retrieve data from my webserver as json but i can when i test it on localhost为什么我不能从我的网络服务器检索数据作为 json 但我可以在本地主机上测试它
【发布时间】:2016-06-10 11:20:19
【问题描述】:

我正在尝试创建一个连接到 mysql 数据库的简单登录应用程序。 该应用程序在我在 localhost 中测试时可以正常工作,但是当我将数据库和 php 脚本上传到托管服务器( Byethost )时,它无法正常工作, 问题似乎与服务器的响应字符串有关,它不是“JSON”

正如我上面提到的,当我在 localhost 中测试应用程序时,它工作得很好。

这里是 Andorid 代码

        requestQueue = Volley.newRequestQueue(this);
    StringRequest stringRequest = new StringRequest(Request.Method.POST, login_url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try{
                Log.d("#-SERVER RESPONSE-#",response);
                JSONObject jsonObject = new JSONObject(response);
                Log.d("#-LOGIN STATUS-#",jsonObject.getString("status"));
            } catch (Exception e){
                Log.d("#-JSON ERROR-#",e.toString());
            }//end if
        }
    },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("#-VOLLEY ERROR-#",error.toString());
                }
            }){

        @Override
        public Map<String,String> getParams(){
            Map<String,String> params = new HashMap<>();
            params.put(KEY_USERNAME,username);
            params.put(KEY_PASSWORD,password);
            return params;
        }
    };
    requestQueue.add(stringRequest);

这里是php代码

    $username = mysqli_real_escape_string($connection,$_POST['username']);
$password = mysqli_real_escape_string($connection,$_POST['password']);

$query = "SELECT * FROM user WHERE username='{$username}' AND password='{$password}'";
$result = mysqli_query($connection,$query);

$json_reply['status'] = 1; //erorr by default

if(mysqli_num_rows($result) > 0){
  $json_reply['status'] = 0; //success
}

print(json_encode($json_reply));

这是 Android Monitor 窗口的输出。

响应字符串

<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("99efa97c59e1cf6146f7e801802ed6bc");document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"; document.cookie="referrer="+escape(document.referrer); location.href="http://zsoft.byethost8.com/login.php?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>

【问题讨论】:

  • 显示你的执行网络服务的代码
  • 你能从服务器发布完整的响应字符串吗?它看起来像一个普通的 HTML 站点。
  • @Mono 其实很奇怪,我会用响应字符串更新问题
  • 您在 android 代码的 volley 请求中在哪里传递用户名和密码?
  • @Vickyexpert 我将它们作为两个参数(用户名、密码)传递,我刚刚发布了函数的主体。我想知道为什么它在我的本地主机中运行良好

标签: android json android-volley


【解决方案1】:

前段时间我遇到了类似的问题,我不知道为什么,但我设法解决了使用 echo json_encode ( $ response , JSON_UNESCAPED_UNICODE ) ; 而不是print 并在 encode 而不是 mysqli 中转义特殊字符,希望对您有所帮助

【讨论】:

  • 也许 apache 阻止了特殊字符,返回包含什么?如果是这样,请尝试在没有特殊字符的情况下对响应进行硬编码以进行测试。
  • 我试过了,我开始相信它与我试过 application-json 的 Content-tpye 相关,但它一直返回 text-html
【解决方案2】:

似乎问题出在主机本身,我尝试了另一个主机(arvixe),一切都像魅力一样。我不知道为什么,但可能是因为它是付费主机。

【讨论】:

  • 可能是一些安全配置。在服务器上,你的申请方式是 POST ?
  • 是的,我正在使用 POST 请求,我也尝试过 GET 我什至尝试回显一个 json 字符串而没有希望
  • 我明白了,获取请求可能会因为 url 中的特殊字符而被阻止,在某些服务器中被阻止,我认为 Post 没有这个问题
【解决方案3】:

许多免费托管服务提供商都在末尾附加分析代码,这是 php 文件失败的主要原因。

此类问题的最佳解决方案是使用

 <?php exit(); ?> 

在最后一个可执行语句之后,它将显式关闭 PHP 文件。

当您显式退出 PHP 文件时,代码不会附加到 JSON。

【讨论】:

  • 感谢您的回复,我会尝试一下,我会告诉您发生了什么
  • 我试过你的答案,但没有任何反应,同样的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 2017-08-14
  • 2017-01-19
  • 1970-01-01
  • 2016-10-20
  • 2022-07-11
相关资源
最近更新 更多