Android和PHP codeigniter之间连接的简单代码

时间:2013-07-11 07:23:02

标签: php android mysql codeigniter

我有一个应用程序,它将Android的名字和姓氏和密码发送给PHP。

我的Android代码:

package com.example.com.tourism;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
    public class SignUp extends Activity{
            EditText first,last,birth ,pass;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.sign_up);

                Button signUp=(Button)findViewById(R.id.sign_up);

                first =(EditText) findViewById(R.id.edfname);
                last =(EditText) findViewById(R.id.edlname);
                pass =(EditText) findViewById(R.id.edpass);



                signUp.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg0) {
                        String firstn = first.getText().toString();
                        String lastn = last.getText().toString();
                        String passw = pass.getText().toString();
                        try {
                            JSONObject json = new JSONObject();
                            json.put("first_name", firstn);
                            json.put("last_name", lastn);
                            json.put("password", passw);
                            postData(json);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                }

                });

            }

            public void postData(JSONObject json) throws JSONException {
                HttpClient httpclient = new DefaultHttpClient();

                try {
                    HttpPost httppost = new HttpPost("http://10.0.0.2:3784/tourism/index.php/site/register");

                    List<NameValuePair> nvp = new ArrayList<NameValuePair>(2);
                    nvp.add(new BasicNameValuePair("json", json.toString()));
                    //httppost.setHeader("Content-type", "application/json");
                    httppost.setEntity(new UrlEncodedFormEntity(nvp));
                    HttpResponse response = httpclient.execute(httppost);

                    if(response != null) {
                        InputStream is = response.getEntity().getContent();
                        //input stream is response that can be shown back on android
                    }

                    }catch (Exception e) {
                    e.printStackTrace();`enter code here`
                    }
            }

}

并且在php codeigniter控制器中接收先前信息的函数是

function register_get()
    {
        $json = array('status' => false );
        if($this->input->post()==null){
            $this -> response($json, 200);
            }

        $firstname = $this->post("first_name");
        $lastname = $this->post("last_name");
        $password = $this->post("password");
        if(!$firstname || !$lastname || !$password){
            $json['status'] = "wrong insert";
            $this -> response($json, 200);
        }

        $this->load->model('Data_model');
        $result = $this->Data_model->search($firstname, $lastname);

        if($result)
        {
            $this->Data_model->insert($firstname,$lastname,$password);
            $json['status'] = true;

        }
        // here if false..
        $this -> response($json, 200);
    }

PHP代码我尝试它,它的工作原理我认为Android的问题,但我不知道它在哪里,任何人都可以帮助我???

2 个答案:

答案 0 :(得分:3)

您已经制作了在POST变量中接受请求的WebService,并以JSON格式提供响应。

我给你举个例子。

CodeIgniter中Controller的完整代码:

class info_control extends CI_Controller {

    //consrtuctor
    public function __construct()
    {
        parent::__construct();
        /*
        load you helper library
        */
        /*
        load you model
        */

        $this->load->library('form_validation');
    }

    function register_get()
    {
        /* What you have done that i don't know */
        /*
        $json = array('status' => false );
        if($this->input->post()==null){
            $this -> response($json, 200);
        }
        */

        /* This is Form Validation */
        $this->form_validation->set_rules('first_name', 'FirstName', 'valid_email|required');
        $this->form_validation->set_rules('last_name', 'LastName', 'required');
        $this->form_validation->set_rules('password', 'Password', 'required');

        /* Here you mistake $this->post('post var')*/
        $firstname = $this->input->post("first_name");
        $lastname = $this->input->post("last_name");
        $password = $this->input->post("password");

        /** YOUR PROCESS for REGISTER **/
        /*
        LIKE
        */
        if ($this->form_validation->run() == TRUE)
        {
            if(/* REGISTRATION SUCCESSFUL */)
            {
                $data = array('result' => 'success', 'msg' => 'Registered Successfully...');
            }
            else
            {
                $data = array('result' => 'error', 'msg' => 'Email Already Used or Invalid - Unable to Create Account' );
            }
        }
        else
        {
            $data = array('result' => 'error','msg' => preg_replace("/[\n\r]/",".",strip_tags(validation_errors())));
        }

        echo json_encode($data);

        /*
        if(!$firstname || !$lastname || !$password){
            $json['status'] = "wrong insert";
            $this -> response($json, 200);
        }

        $this->load->model('Data_model');
        $result = $this->Data_model->search($firstname, $lastname);

        if($result)
        {
            $this->Data_model->insert($firstname,$lastname,$password);
            $json['status'] = true;

        }
        // here if false..
        $this -> response($json, 200);
        */
    }

现在,在Android中,您必须发送如下数据:

    static InputStream is;
    static String result;
    static JSONObject jsonObject;

    static HttpClient httpClient;
    static HttpPost httpPost;

    static List<NameValuePair> pairs;

    static HttpResponse response;
    static HttpEntity entity;

private static void init() {
    // TODO Auto-generated constructor stub
    is = null;
    result = "";
    jsonObject = null;
    httpPost = null;
    httpClient = new DefaultHttpClient();
}

private static String getResult(InputStream is)  {
    // TODO Auto-generated method stub
    BufferedReader reader;
    StringBuilder stringBuilder = null;

    try {
        reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);

        stringBuilder = new StringBuilder();
        String line = null;

        while ((line = reader.readLine()) != null) {
            stringBuilder.append(line + "\n");
        }
        is.close();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return stringBuilder.toString();    
}

//for Register Employee
    public static JSONObject registerUser(String url, String firstNameString,   String lastNameString, String passwordString) {
        // TODO Auto-generated method stub
        try{
            init();

            Log.d("msg", "URL : "+url);
            httpPost = new HttpPost(url.toString());

            Log.d("msg", "post : "+httpPost);

            pairs = new ArrayList<NameValuePair>();

            pairs.add(new BasicNameValuePair("firstname", firstNameString));
            pairs.add(new BasicNameValuePair("lastname", lastNameString));
            pairs.add(new BasicNameValuePair("password", passwordString));

            httpPost.setEntity(new UrlEncodedFormEntity(pairs,HTTP.UTF_8));

            Log.d("msg", "httppost : "+httpPost.toString());

            response = httpClient.execute(httpPost);

            Log.d("msg", "res : "+response.getStatusLine().getStatusCode());

            entity = response.getEntity();

            is = entity.getContent();

            Log.d("msg", ""+is);
            /*//** Convert response to string **/
            result = getResult(is);

            jsonObject = new JSONObject(result);
            Log.d("msg", "jsonObj : "+jsonObject);
        }
        catch(ClientProtocolException e){
            Log.e("log_tag", "Error in Client Protocol : "+e.toString());
        }catch(JSONException e){
            Log.e("log_tag", "Error Parsing data "+e.toString());
        }catch(Exception e){
            Log.e("log_tag", "Error in HTTP Connection : "+e.toString());
        }
        return jsonObject;
    }

答案 1 :(得分:0)

这对我有用:

在php中返回的json是&#34; [{\&#34; pk_accident \&#34;:\&#34; 25 \&#34;},{\&#34; pk_accident \&# 34;:\&#34; 68 \&#34;}]&#34;,引用字符串的init和final,以及反斜杠。

但这是构建jSONArray的问题,然后Android APP的解决方案是删除json结构中的所有数据:

public ArrayList<String> getDataJSON(String phpJsonString){
    ArrayList<String> listArrayView= new ArrayList<String>();
    try {

        int posIni = phpJsonString.indexOf('[');
        int posFin = phpJsonString.indexOf(']') + 1;
        phpJsonString = phpJsonString.substring(posIni,posFin);
        phpJsonString = phpJsonString.replace("\\", "");
        JSONArray json= new JSONArray(phpJsonString);
        String text="";
        for (int i=0; i<json.length();i++){
            text = json.getJSONObject(i).getString("value1") +" - "+
                    json.getJSONObject(i).getString("value2");
            listArrayView.add(text);
        }
    } catch (Exception e) {
        // TODO: handle exception
    }
    return listArrayView;
}