简体   繁体   English

HttpPost返回HTML而不是Json代码

[英]Httppost returning html instead Json code

here i´m in my first post. 在这里,我在我的第一篇文章中。 I´m getting started to android. 我正在开始使用android。

I trying to connect my app to a webservice throu a tutorial from mybringback, but i´m getting an error with my json return. 我试图通过mybringback上的教程将应用程序连接到网络服务,但是我的json返回出现错误。

09-12 15:54:06.717: E/JSON Parser fallha(8254): Error parsing data org.json.JSONException: End of input at character 0 of 

I already found the reason, it´s happen becouse It´s returning the HTML from my php page instead json. 我已经找到原因了,因为它是从我的php页面而不是json返回HTML。 When i tried set a fix string with my json it worked. 当我尝试用json设置修复字符串时,它起作用了。

When i try to get the json from the browser it works fine. 当我尝试从浏览器获取json时,效果很好。

I set a Log.d in the reader and i got this: 我在阅读器中设置了一个Log.d,我得到了:

09-12 15:35:10.807: D/Acha Erro POR FAVOR(6691):        <h1>Login</h1> 
09-12 15:35:10.807: D/Acha Erro(6691):      <form action="login.php" method="post"> 
09-12 15:35:10.807: D/Acha Erro(6691):          Username:<br /> 
09-12 15:35:10.807: D/Acha Erro(6691):          <input type="text" name="username" placeholder="username" /> 
09-12 15:35:10.807: D/Acha Erro(6691):          <br /><br /> 
09-12 15:35:10.807: D/Acha Erro(6691):          Password:<br /> 
09-12 15:35:10.807: D/Acha Erro(6691):          <input type="password" name="password" placeholder="password" value="" /> 
09-12 15:35:10.807: D/Acha Erro(6691):          <br /><br /> 
09-12 15:35:10.807: D/Acha Erro(6691):          <input type="submit" value="Login" /> 
09-12 15:35:10.807: D/Acha Erro(6691):      </form> 
09-12 15:35:10.807: D/Acha Erro(6691):      <a href="register.php">Register</a>

I´ve spent about 3 days trying to find out a way to solve that. 我花了大约3天的时间来尝试找出解决方法。

Following my two classes and php 跟随我的两个班和PHP

package com.example.testemysql;


import java.util.ArrayList;
import java.util.List;
import java.util.logging.LogRecord;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener{

    private EditText user, pass;
    private Button mSubmit, mRegister;

     // Progress Dialog
    private ProgressDialog pDialog;

    // JSON parser class
    JSONParser jsonParser = new JSONParser();

    //php login script location:

    //localhost :  
    //testing on your device
    //put your local ip instead,  on windows, run CMD > ipconfig
    //or in mac's terminal type ifconfig and look for the ip under en0 or en1
   // private static final String LOGIN_URL = "http://xxx.xxx.x.x:1234/webservice/login.php";

    //testing on Emulator:
    private static final String LOGIN_URL = "http://www.bazarsol.6te.net/ANDROID/login.php";

  //testing from a real server:
    //private static final String LOGIN_URL = "http://www.yourdomain.com/webservice/login.php";

    //JSON element ids from repsonse of php script:
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_MESSAGE = "message";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //setup input fields
        user = (EditText)findViewById(R.id.username);
        pass = (EditText)findViewById(R.id.password);

        //setup buttons
        mSubmit = (Button)findViewById(R.id.login);
        mRegister = (Button)findViewById(R.id.register);

        //register listeners
        mSubmit.setOnClickListener(this);
        mRegister.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.login:
            new AttemptLogin().execute();   
            break;
        case R.id.register:
                //Intent i = new Intent(this, Register.class);
                //startActivity(i);
            break;

        default:
            break;
        }
    }

    class AttemptLogin extends AsyncTask<String, String, String> {

         /**
         * Before starting background thread Show Progress Dialog
         * */
        boolean failure = false;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Attempting login...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @Override
        protected String doInBackground(String... args) {
            // TODO Auto-generated method stub
             // Check for success tag
            int success;
            String username = user.getText().toString();
            String password = pass.getText().toString();
            try {
                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("username", username));
                params.add(new BasicNameValuePair("password", password));


                Log.d("URL",LOGIN_URL);
               Log.d("PARAMETROS",""+ params);

                Log.d("request!", "starting");
                // getting product details by making HTTP request
                JSONObject json = jsonParser.makeHttpRequest(
                        LOGIN_URL, "POST", params);

                // check your log for json response
                Log.d("Login attempt", json.toString());


                // json success tag
                success = json.getInt(TAG_SUCCESS);
                if (success == 1) {
                    //Log.d("Login Successful!", json.toString());
                    Log.d("Login Successful!", "");
                    //Intent i = new Intent(Login.this, ReadComments.class);
                    finish();
                    //startActivity(i);
                    return json.getString(TAG_MESSAGE);
                }else{
                    Log.d("Login Failure!", json.getString(TAG_MESSAGE));
                    return json.getString(TAG_MESSAGE);

                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;

        }
        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once product deleted
            pDialog.dismiss();
            if (file_url != null){
                Toast.makeText(MainActivity.this, file_url, Toast.LENGTH_LONG).show();
            }

        }

    }


}

JSONParser JSONParser

package com.example.testemysql;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;


import android.util.Log;

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    // function get json from url
    // by making HTTP POST or GET mehtod
    public JSONObject makeHttpRequest(String url, String method,
            List<NameValuePair> params) {

        // Making HTTP request
        try {

            // check for request method
            if(method == "POST"){
                // request method is POST
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);

                httpPost.setEntity(new UrlEncodedFormEntity(params));
                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
                Log.d("Acha o erro POR FAVOR ajuda",""+ httpResponse);

            }else if(method == "GET"){
                // request method is GET
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity 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, "iso-8859-1"), 8);
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
            Log.d("Acha Erro POR FAVOR",""+ reader.readLine());
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
            Log.d("Acha Erro", json);
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e);
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser fallha", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }
}

PHP - UPDATED PHP-更新

<?php

//load and connect to MySQL database stuff
require("config.inc.php");

//gets user's info based off of a username.
$query = " 
        SELECT 
            indice, 
            usuario, 
            senha
        FROM usuarios 
        WHERE 
            usuario = :username 
    ";

$query_params = array(
    ':username' => $_POST["username"]
);

try {   
    $stmt   = $db->prepare($query);
    $result = $stmt->execute($query_params);
    print_r($_REQUEST);
    print_r (var_dump($_POST));
    print_r(get_headers());

    }
catch (PDOException $ex) {
    // For testing, you could use a die and message. 
    //die("Failed to run query: " . $ex->getMessage());

    //or just use this use this one to product JSON data:
    $response["success"] = 0;
    $response["message"] = "Database Error1. Please Try Again!2";
    echo "Bruno 2";
    die(json_encode($response&$ex));

}

//This will be the variable to determine whether or not the user's information is correct.
//we initialize it as false.
$validated_info = false;

//fetching all the rows from the query
$row = $stmt->fetch();
if ($row) {
    //if we encrypted the password, we would unencrypt it here, but in our case we just
    //compare the two passwords
    if ($_POST["password"] === $row["senha"]) {
        $login_ok = true;
    }
}

// If the user logged in successfully, then we send them to the private members-only page 
// Otherwise, we display a login failed message and show the login form again 
if ($login_ok) {
    $response["success"] = 1;
    $response["message"] = "Login successful!";
    die(json_encode($response));
} else {
    $response["success"] = 0;
    $response["message"] = "Invalid Credentials!";
    die(json_encode($response));
}?>

RESULTS 结果

09-16 16:58:00.687: D/Acha o erro POR FAVOR ajuda(29176):org.apache.http.message.BasicHttpResponse@42680990
09-16 16:58:00.687: D/Acha Erro POR FAVOR(29176): Array
09-16 16:58:00.687: D/Acha Erro(29176): (
09-16 16:58:00.687: D/Acha Erro(29176): )
09-16 16:58:00.687: D/Acha Erro(29176): array(0) {
09-16 16:58:00.687: D/Acha Erro(29176): }
09-16 16:58:00.687: D/Acha Erro(29176): {"success":0,"message":"Invalid Credentials!"}

In your request, you should specify that the desired return is of type Json. 在您的请求中,您应该指定所需的回报为Json类型。

You may need to add something similar to the following to your HTTP Request Header: 您可能需要在HTTP请求标头中添加类似于以下内容的内容:

header('Content-Type: application/json');

In your code, I'd recommend something like this: 在您的代码中,我建议这样的事情:

// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);

httpPost.setEntity(new UrlEncodedFormEntity(params));
httpPost.setHeader("Content-Type: application/json")
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();

looks like your issue is in your filtering, never ever ever do string comparisons with ==, it doesn't work. 看起来您的问题出在您的过滤中,从来没有使用==进行字符串比较,这是行不通的。

instead of doing this line: 而不是这样做:

if(method == "POST"){
//...
else if(method == "GET")

do this: 做这个:

if (method.equals("POST"))
//...
else if(method.equals("GET"))

this is causing your post value to be sent to the server empty. 这导致您的帖子值发送到服务器为空。 thats the only reason your php script will ever output the login form instead of processing the JSON request... of course after you get past this issue, there may be other bugs to look into.. 多数民众赞成在您的php脚本将输出登录表单而不处理JSON请求的唯一原因...当然,当您解决此问题之后,可能还会有其他错误需要调查。

You get the inlog page. 您将获得登录页面。 So aparently you have to use a username and pass before your request is honored. 因此,显然,您必须使用用户名并通过,然后才能兑现您的请求。 With the browser you first logged in? 使用浏览器,您首次登录?

Ok i see in the php script that that html is returned when $_POST is empty. 好的,我在php脚本中看到$ _POST为空时返回了html。 So you should POST better. 因此,您应该更好地发布。

After all, i got a solution, the problem wasnt the code it was the server (6te.net) settings. 毕竟,我得到了一个解决方案,问题不在于它是服务器(6te.net)设置的代码。 I tried in a local xampp server and it worked fine. 我在本地xampp服务器上尝试过,但工作正常。

Thanks to every body, especialy to greenapps. 多亏每个人,尤其是greenapps。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM