如何将JSON数据从Android发送到php url?

i want to send login infromation from my App to php url.as this my App will crash.can any one help me to slove this.

this my server login method. i want to send data to this login method..

   Method [  public method login ] {

      - Parameters [3] {
        Parameter #0 [  $user_auth ]
        Parameter #1 [  $application ]
        Parameter #2 [  $name_value_list = Array ]
      }
    }

this is my login.java in android app

public class Login extends ActionBarActivity implements View.OnClickListener {

    EditText userName, pass;
    Button login;

    private ProgressDialog pDialog;

    JSONParser jsonParser = new JSONParser();

    private static final String LOGIN_URL = "http://crm.demo.com/service/v4_1/rest.php/login";

    private static final String TAG_SUCCESS = "sucess";
    private static final String TAG_MESSAGE = "message";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        userName = (EditText) findViewById(R.id.editText_userN);
        pass = (EditText) findViewById(R.id.editText_pass);
        login = (Button) findViewById(R.id.btn_login);

        login.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        Log.d("v", "Login button clicked");

        new AttemptLogin().execute();
    }

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

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

        @Override
        protected String doInBackground(String... args) {

             // Check for success tag
            int success;
            String user_auth[];
            String user_name = userName.getText().toString();
            String password = pass.getText().toString();
            String application = "wakensys";
            String name_value_list[];
            String language = "en-au";
            String notifyonsave = "true";

            try {
                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("user_auth[]", user_name));
                params.add(new BasicNameValuePair("user_auth[]", password));
                params.add(new BasicNameValuePair("application", application));
                params.add(new BasicNameValuePair("name_value_list[]", language));
                params.add(new BasicNameValuePair("name_value_list[]", notifyonsave));


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

                // 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());
                    Intent i = new Intent(Login.this, Success.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(Login.this, file_url, Toast.LENGTH_LONG).show();
            }
        }
    }
}

--new logcat---

11-21 10:33:34.467: D/v(4400): Login button clicked
11-21 10:33:34.496: D/request!(4400): starting..
11-21 10:33:34.496: I/NameValuePair(4400): [user_auth=dghj, user_auth=ccbj, name_value_list=EN]
11-21 10:33:36.528: E/JSON Parser(4400): Error parsing data org.json.JSONException: Value <pre> of type java.lang.String cannot be converted to JSONObject
11-21 10:33:36.531: E/AndroidRuntime(4400): FATAL EXCEPTION: AsyncTask #1
11-21 10:33:36.531: E/AndroidRuntime(4400): Process: com.wakensys.sugercrm, PID: 4400
11-21 10:33:36.531: E/AndroidRuntime(4400): java.lang.RuntimeException: An error occured while executing doInBackground()
11-21 10:33:36.531: E/AndroidRuntime(4400):     at android.os.AsyncTask$3.done(AsyncTask.java:300)
11-21 10:33:36.531: E/AndroidRuntime(4400):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
11-21 10:33:36.531: E/AndroidRuntime(4400):     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
11-21 10:33:36.531: E/AndroidRuntime(4400):     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
11-21 10:33:36.531: E/AndroidRuntime(4400):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
11-21 10:33:36.531: E/AndroidRuntime(4400):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
11-21 10:33:36.531: E/AndroidRuntime(4400):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
11-21 10:33:36.531: E/AndroidRuntime(4400):     at java.lang.Thread.run(Thread.java:818)
11-21 10:33:36.531: E/AndroidRuntime(4400): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.json.JSONObject.toString()' on a null object reference
11-21 10:33:36.531: E/AndroidRuntime(4400):     at com.wakensys.sugercrm.Login$AttemptLogin.doInBackground(Login.java:116)
11-21 10:33:36.531: E/AndroidRuntime(4400):     at com.wakensys.sugercrm.Login$AttemptLogin.doInBackground(Login.java:1)
11-21 10:33:36.531: E/AndroidRuntime(4400):     at android.os.AsyncTask$2.call(AsyncTask.java:288)
11-21 10:33:36.531: E/AndroidRuntime(4400):     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-21 10:33:36.531: E/AndroidRuntime(4400):     ... 4 more

Any Help Please !!

JOSONparser.java

public class JSONParser {

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

    // constructor
    public JSONParser() {

    }


    public JSONObject getJSONFromUrl(final String url) {

        // Making HTTP request
        try {
            // Construct the client and the HTTP request.
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            // Execute the POST request and store the response locally.
            HttpResponse httpResponse = httpClient.execute(httpPost);
            // Extract data from the response.
            HttpEntity httpEntity = httpResponse.getEntity();
            // Open an inputStream with the data content.
            is = httpEntity.getContent();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            // Create a BufferedReader to parse through the inputStream.
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            // Declare a string builder to help with the parsing.
            StringBuilder sb = new StringBuilder();
            // Declare a string to store the JSON object data in string form.
            String line = null;

            // Build the string until null.
            while ((line = reader.readLine()) != null) {
                sb.append(line + "
");
            }

            // Close the input stream.
            is.close();
            // Convert the string builder data to an actual string.
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

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

        // Return the JSON Object.
        return jObj;

    }


    // 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();

            }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);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "
");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

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

        // return JSON String
        return jObj;

    }
}
doupin2013
doupin2013 什么是空指针异常可能重复,我该如何解决?
接近 6 年之前 回复
dsfsda121545
dsfsda121545 在onCreate()中,在全局String变量中获取EditText的内容,并在doInBackground()中使用此字符串
接近 6 年之前 回复
douju7765
douju7765 那我在哪里可以访问EditText?
接近 6 年之前 回复
dongshi1880
dongshi1880 您正在尝试访问doInBackground()中的EditText。不要那样做。它会产生错误。
接近 6 年之前 回复
dounou9751
dounou9751 无需添加带参数名称的[]并提供logcat以获得更多帮助。
接近 6 年之前 回复
duanhuoyao7011
duanhuoyao7011 你能发帖子logcat吗?
接近 6 年之前 回复

3个回答

You can try your code like this, works perfect for me.

public class Login extends ActionBarActivity
{
    EditText tv, tv2;
    String email;
    int a;
    String password;

    JSONParser jsonParser = new JSONParser();

    private ProgressDialog dialog;

    private static String register_user = "your link here";

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
          super.onCreate(savedInstanceState);

          setContentView(R.layout.activity_login);

          tv = (EditText) findViewById(R.id.editText1);
          tv2 = (EditText) findViewById(R.id.editText2);
    }

    public void Login(View view)
    {
          email = tv.getText().toString().trim();
          password = tv2.getText().toString();

          if(TextUtils.isEmpty(email) || TextUtils.isEmpty(password))
          {
                if(TextUtils.isEmpty(email))
                {
                    tv.setError("This field cannot be empty");
                }
                if(TextUtils.isEmpty(password))
                {
                    tv2.setError("This field cannot be empty");
                }
            }
            else
            {
                //build Params
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("email", email));
                params.add(new BasicNameValuePair("password", password));

                CreateNewProduct productTask = new CreateNewProduct(params);
                productTask.execute();
            }
    }

    class CreateNewProduct extends AsyncTask<String, String, JSONObject>
    {
         List<NameValuePair> params;

         public CreateNewProduct(List<NameValuePair> params)
        {
             this.params = params;
        }

        protected void onPreExecute()
        {
            super.onPreExecute();
            dialog = new ProgressDialog(Login.this);
            dialog.setMessage("We are Logging in. Please wait . . .");
            dialog.setIndeterminate(false);
            dialog.setCancelable(false);
            dialog.show();
        }

        protected JSONObject doInBackground(String... args)
        {
             JSONObject json = jsonParser.makeHttpRequest(register_user, "POST", this.params);

             return json;
        }

        protected void onPostExecute(JSONObject result)
        {
               dialog.dismiss();
              //this assumes that the response looks like this:
              //{"success" : true }
              String message = null;
              try {
                  message = result.getString("message");
              } catch (JSONException e1) {
                  // TODO Auto-generated catch block
                  e1.printStackTrace();
              }
              boolean success = false;
              try {
                success = result.getBoolean("success");
              } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
              }
              Toast.makeText(getBaseContext(), success ? "We are good to go." : "Something went wrong!", 
              Toast.LENGTH_SHORT).show();
              Toast.makeText(getBaseContext(), message, Toast.LENGTH_LONG).show();
        }
    }
}

Now according to your success value, you can take certain actions. You can also try other combinations of JSON outputs from your php script.

Try to start activity from onPostExecute instead doInBackground and no need [] in parms keys :

Note : as per your log you missing add internet permission in AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>

Example :

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

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

    @Override
    protected JSONObject doInBackground(String... args) {

        String user_name = userName.getText().toString();
        String password = pass.getText().toString();
        String application = "wakensys";
        String language = "en-au";
        String notifyonsave = "true";
        JSONObject json=null;
        try {
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("user_auth", user_name));
            params.add(new BasicNameValuePair("user_auth", password));
            params.add(new BasicNameValuePair("application", application));
            params.add(new BasicNameValuePair("name_value_list", language));
            params.add(new BasicNameValuePair("name_value_list", notifyonsave));

            Log.d("request!", "starting..");
            Log.i("NameValuePair", params.toString());
            // getting product details by making HTTP request
            json = jsonParser.makeHttpRequest(LOGIN_URL, "POST", params);
            // check your log for json response
            Log.d("Login attempt", json.toString());

            // json success tag

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return json;
    }
    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(JSONObject response) {
        // dismiss the dialog once product deleted
        pDialog.dismiss();
        if (response != null){
            Toast.makeText(Login.this, response.getString(TAG_MESSAGE), Toast.LENGTH_LONG).show();

            if (response.getInt(TAG_SUCCESS) == 1) {
                Log.d("Login Successful!", response.toString());
                Intent i = new Intent(Login.this, Success.class);
                startActivity(i);
                finish();
            }else{
                Log.d("Login Failure!", response.getString(TAG_MESSAGE));
            }
        }

    }
}
donglizhan7848
donglizhan7848 你的意思是什么?
接近 6 年之前 回复
duanqin4238
duanqin4238 检查makeHttpRequest中的sb值。
接近 6 年之前 回复
douhu4692
douhu4692 你能找到任何问题吗?
接近 6 年之前 回复
doupu1727
doupu1727 是的。但我没有看到任何错误。等我发布代码
接近 6 年之前 回复
douge3492
douge3492 你试试看makeHttpRequest json构建代码吗?
接近 6 年之前 回复
dsasd12314
dsasd12314 做..
接近 6 年之前 回复
dqbr37828
dqbr37828 删除以前的logcat并仅发布新的logcat。
接近 6 年之前 回复
dongyongyu0789
dongyongyu0789 我删除了它,但你想要看到新的logcat相同的logcat。
接近 6 年之前 回复
douyan1321
douyan1321 你响应json是null所以删除这一行:Log.d(“登录尝试”,json.toString()); 来自doInBackGround()
接近 6 年之前 回复
duandai3964
duandai3964 从makeHttpRequest检查json。
接近 6 年之前 回复
dorflv5944
dorflv5944 我怎样才能找到json response.sorry
接近 6 年之前 回复
duanhuizhe6767
duanhuizhe6767 请你发布json回复?
接近 6 年之前 回复
dongxing1412
dongxing1412 感谢您的回复+1
接近 6 年之前 回复
duancanjiu3754
duancanjiu3754 所以这意味着您的回复存在问题,您的回复可能不是验证json。 为此你可以在www.jsonlint.com上查看它。
接近 6 年之前 回复
douhao6271
douhao6271 我忘记添加我的互联网权限。我坏了。我现在添加原始代码logcat是11-21 10:08:41.030:E / JSON Parser(2487):解析数据时出错org.json.JSONException:Value < pre> of java.lang.String无法转换为JSONObject
接近 6 年之前 回复
dou47732
dou47732 这段代码给出了一些错误,它没有为JSONException运行Unreachable catch块。 永远不会从try语句主体和Unhandled异常类型JSONException抛出此异常
接近 6 年之前 回复
class AttemptLogin extends AsyncTask<String, String, JSONObject> {

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

    @Override
    protected JSONObject doInBackground(String... args) {

        String user_name = userName.getText().toString();
        String password = pass.getText().toString();
        String application = "wakensys";
        String language = "en-au";
        String notifyonsave = "true";

        try {
           HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(LOGIN_URL+ "UserAuthentication/");

            deviceId = pref.getDeviceID(context);
            JSONObject object = new JSONObject();
            object.put("user_auth", user_name );
            object.put("user_auth", password);
            object.put("application", application);
object.put("name_value_list", language);
            object.put("name_value_list", notifyonsave);
            String dat = object.toString();
            JSONObject object1 = new JSONObject();

            object1.put("userAuthentication", object);

            String dat1 = object1.toString();
            httppost.setEntity(new StringEntity(dat1, HTTP.US_ASCII));
            httppost.setHeader("Content-type", "application/json;" + HTTP.UTF_8);

            HttpResponse response = httpclient.execute(httppost);
            StatusLine statusLine = response.getStatusLine();

            HttpEntity entity = response.getEntity();
            InputStream content = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    content));
            String line;
            StringBuilder builder = new StringBuilder();
            while ((line = reader.readLine()) != null) {
                builder.append(line);
            }

            result = builder.toString();


        } catch (JSONException e) {
            e.printStackTrace();
        }
        return json;
    }
    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(JSONObject response) {
        // dismiss the dialog once product deleted
        pDialog.dismiss();
        if (response != null){
            Toast.makeText(Login.this, response.getString(TAG_MESSAGE), Toast.LENGTH_LONG).show();

            if (response.getInt(TAG_SUCCESS) == 1) {
                Log.d("Login Successful!", response.toString());
                Intent i = new Intent(Login.this, Success.class);
                startActivity(i);
                finish();
            }else{
                Log.d("Login Failure!", response.getString(TAG_MESSAGE));
            }
        }

    }
}
duanhua5523
duanhua5523 请删除行sharedprefrence没有必要实现这一行我真的为此道歉
接近 6 年之前 回复
duanbo1659
duanbo1659 这里什么是Sharedprefs? 它获取错误Sharedprefs无法解析为类型,上下文无法解析为变量
接近 6 年之前 回复
doz95923
doz95923 即时通讯在这段代码中得到的错误可以解决这个问题,这个sharedprefs无法解析为一个类型,上下文无法解析为变量,deviceId无法解析为变量,on on OnPostExecute方法未处理的异常类型JSONException
接近 6 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问