首页 新闻 赞助 找找看

Android怎么通过向PHP服务器发送json字符串来实现登录

0
悬赏园豆:5 [已解决问题] 解决于 2016-05-10 08:04

我们服务器的数据库当中有账号和密码信息,我怎么才能通过Android客户端向PHP发送json字符串来验证自己输入的账号和密码是否存在于数据库中。求详解有代码让自己琢磨也可,谢谢。

kang_ya_ping的主页 kang_ya_ping | 菜鸟二级 | 园豆:243
提问于:2016-05-06 15:58
< >
分享
最佳答案
0

 请求接口时,不就是提供 参数 ,访问接口吗?你是具体哪里搞不清楚?你现在能从服务器请求到数据吗

收获园豆:5
威廉姆斯·苑 | 初学一级 |园豆:125 | 2016-05-07 09:55
package com.itcast.test03;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;


public class MainActivity extends Activity {
    private EditText et_username;
    private EditText et_userPsd;
    private Button login;
    private Button signUp;
    private CheckBox save;
    private String user,pass;
    private InputMethodManager in;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);       
        setContentView(R.layout.activity_main);
        et_username = (EditText)findViewById(R.id.et_number);
        et_userPsd = (EditText)findViewById(R.id.et_password);
        login=(Button)findViewById(R.id.login);
        signUp=(Button)findViewById(R.id.signUp);
        in = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);      
        save = (CheckBox)findViewById(R.id.save);      
        login.setOnClickListener(new View.OnClickListener() {
            
               @Override
               public void onClick(View v) {
                // TODO Auto-generated method stub
                in.hideSoftInputFromWindow(v.getWindowToken(), 0);
                 
                String name =et_username.getText().toString();
                String pwd = et_userPsd.getText().toString();
                if(StringUtils.isEmpty(name)){
                 Toast.makeText(v.getContext(), R.string.login_uname_null, Toast.LENGTH_SHORT);
                 return;
                }
                if(StringUtils.isEmpty(pwd)){
                 Toast.makeText(v.getContext(), R.string.login_pwd_null, Toast.LENGTH_SHORT);
                 return;
                }
                 
                login(name, pwd);
               }
              });
             }
              
             private void login(final String name, final String pwd){
              final Handler handler = new Handler() {
               public void handleMessage(Message msg) {
                if(msg.what == 1){
                 //提示登陆成功
                 Toast.makeText(MainActivity.this, R.string.msg_login_success, Toast.LENGTH_SHORT).show();
                 finish();
                }else if(msg.what == 0){
                 Log.i(name, msg.toString());
                }else if(msg.what == -1){
                 Log.i("==============", msg.toString());
                }
               }
              };
              new Thread(){
               public void run() {
                Message msg =new Message();
                try {
                 Post po = new Post();
                 String infoo = po.logina(name, pwd);
                  
                             if(infoo != null){
                              msg.what = 1;//成功
                              msg.obj = infoo;
                             }else{
                              msg.what = 0;//失败
                              msg.obj = "2";
                             }
                         } catch (Exception e) {
                          e.printStackTrace();
                    msg.what = -1;
                    msg.obj = e;
                         }
                handler.sendMessage(msg);
               }
              }.start();
             }
    }
    
package com.itcast.test03;

import java.io.IOException;

import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class Post {
    public String logina(String name, String pwd)throws ParseException, IOException, JSONException{
          HttpClient httpClient = new DefaultHttpClient();
          String strurl = "http://10.6.78.88/xampp/sse/index.php/home/Index/login";
          HttpPost request = new HttpPost(strurl);
          request.addHeader("Accept","application/json");
          request.addHeader("Content-Type","application/json");//还可以自定义增加header
          JSONObject param = new JSONObject();//定义json对象
          param.put("sequenceId", "87620056570355357690");
          param.put("accType", "0");
          param.put("loginId", name);
          param.put("password", pwd);
          //param.put("thirdpartyAppId", "");
          //param.put("thirdpartyAccessToken", "");
          param.put("loginType", "1");
          Log.i("===========", param.toString());
          StringEntity se = new StringEntity(param.toString());
          request.setEntity(se);//发送数据
          HttpResponse httpResponse = httpClient.execute(request);//获得相应
          int code = httpResponse.getStatusLine().getStatusCode();
          System.out.print(code);
          String result = EntityUtils.toString(httpResponse.getEntity());
          JSONObject result1 = new JSONObject(result);
          String info = (String) result1.get("retInfo");
          Log.i("=============", info);
          return info;
         }

}

这是我写的代码,点击登录按钮没有任何反应

kang_ya_ping | 园豆:243 (菜鸟二级) | 2016-05-07 10:35

@kang_ya_ping: debug   在String result处打个断点看看有没有请求到数据啊,  如果报错就看看报的什么错

威廉姆斯·苑 | 园豆:125 (初学一级) | 2016-05-07 11:02

@kang_ya_ping: debug调试会不会?或者你把result的数据打印出来,看看也行,这样也省去了debug,最好调试的还是debug 。

威廉姆斯·苑 | 园豆:125 (初学一级) | 2016-05-07 11:12

@android小白: log打印的结果是;

 

这里面是获取到我在Android端的输入,可是请求不到服务器端的请求

kang_ya_ping | 园豆:243 (菜鸟二级) | 2016-05-07 11:23

@kang_ya_ping: {"accType":"0"........}不就是从服务器请求到的数据吗?   登陆就是传账号,密码到服务器,服务器返回这个账号的基本信息。 你说的“请求不到服务器的请求”是啥意思啊?     数据库是否有你输入的账号密码,那是后台判断的啊。他返回有就有,没有就是没有。

威廉姆斯·苑 | 园豆:125 (初学一级) | 2016-05-07 11:31

@威廉姆斯·苑: 我输库入的用户名是我自己编的,并不是数据库中确实存在的。如果用户名和密码不在数据中就返回登录失败的提示框,可是现在我的程序运行的时候一点反应都没有

kang_ya_ping | 园豆:243 (菜鸟二级) | 2016-05-08 16:27

@kang_ya_ping: Log.i("==============", );  打LOG不要这打。我看你代码中有多处用“=====”分不清到底是那部分的代码打印的,你把这写区分开,再打印一次,我看看各处的打印信息。网络请求部分的login 用Log.i(“http", ); 之类的,总之区分开。  其实用断点,最后走到哪步一步了然。

威廉姆斯·苑 | 园豆:125 (初学一级) | 2016-05-08 18:38

@kang_ya_ping: 你这个问题没有一点难度,只是你没定位到问题的所在而已。按照逻辑,一步一步往下走,逐步定位到哪步出的问题。请求网络后没啥反应。代码没问题那就是逻辑处问题了。

你在handler部分有三个判断情况。如果不会打断点那就再这三个部分打log信息,看它到底走了哪步。

如果都没有log信息,那就说明没走这个方法,那就是handler.sendmessage以上这部分的某处代码的问题了。

威廉姆斯·苑 | 园豆:125 (初学一级) | 2016-05-08 18:46

@威廉姆斯·苑: 确实是handler.sendmessage(msg)代码的问题。是这句话 

String info = po.logina(name, pwd);当调用po.logina()方法的时候不能返回一个String值通过打印log信息发现 HttpResponse httpResponse = httpClient.execute(request);程序运行到这个地方的时候日志信息就没有打印出来。但是打印request的值是存在的结果显示为:

但就是无法请求服务器并获取服务器返回的信息。是代码出错在什么地方了,恕我愚钝,我找了很久没有发现。求指点

kang_ya_ping | 园豆:243 (菜鸟二级) | 2016-05-08 20:34

@kang_ya_ping: System.out.print(code);   这个code 返回的是多少

威廉姆斯·苑 | 园豆:125 (初学一级) | 2016-05-08 21:07

@kang_ya_ping: 

public static String post(String path, Map<String, String> map,
String header, String token) {
BufferedReader in = null;
try {
HttpClient client = new DefaultHttpClient();
HttpPost request = new HttpPost(path);
client.getParams().setParameter(
CoreConnectionPNames.CONNECTION_TIMEOUT, 20000);
client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,
20000);
List<NameValuePair> postParams = new ArrayList<NameValuePair>();
System.out.println("出错了===========1==========");
for (Map.Entry<String, String> abc : map.entrySet()) {
if (null != abc.getValue()) {
postParams.add(new BasicNameValuePair(abc.getKey(), abc
.getValue()));
}
System.out.println(abc.getKey());
}
System.out.println("出错了===========2==========");
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(
postParams, HTTP.UTF_8);
request.setEntity(formEntity);
request.setHeader("Content-Type",
"application/x-www-form-urlencoded");
if (null != header) {
request.setHeader("Authorization", header);
}
if (null != token) {
request.setHeader("X-CSRF-Token", token);
}
request.addHeader("cache-control", "no-cache");

System.out.println("出错了===========3==========");
HttpResponse response = client.execute(request);
System.out.println("出错了===========4==========");

System.out.println(response.getStatusLine().getStatusCode()
+ "===================================");
path = null;

in = new BufferedReader(new InputStreamReader(response.getEntity()
.getContent()));
StringBuffer sb = new StringBuffer("");
String line = "";
String NL = System.getProperty("line.separator");
while ((line = in.readLine()) != null) {
sb.append(line + NL);
}
in.close();
String result = sb.toString();
System.out.println(result + "===================================");
// result = URLDecoder.decode(result, "utf-8");
return result;
} catch (Exception e) {
System.out.println(e.toString());
System.out.println("网络超时=====================");
} finally {
if (in != null) {
try {

in.close();
} catch (IOException ioe) {

System.out.println(ioe.toString());
}
}
}
return null;
}

 

你用我的这个请求数据类试一试。map是把你的参数的键值对

Map<String, String> map = new HashMap<String, String>();

map.put("password", pwd);

就这样的格式,把你的几个参数写好后,

post(path, map,null,null) ;

威廉姆斯·苑 | 园豆:125 (初学一级) | 2016-05-08 21:19

@威廉姆斯·苑: 你好,你的方法我已经试验过了。之前一直解决不了的问题已经解决了。真的很谢谢你。下面是日志文件打印的结果:我想Android端的程序已经没有问题。服务器链接超时,是因为我们服务器端的代码没有写好。但是我还得麻烦你一下。虽然程序没有问题了,但是跟我们团队老师要求的不太一样。我们老师要求把用户输入的用户名和密码封装成JSON发送给服务器。然后服务器跟数据库中的信息进行比对,然后返回1登录成功,0登录失败。

但是这个程序跟我们老师要求的不太一样,老师的想法,我已经画了一张图片粘贴在下面了。

 

 

 

kang_ya_ping | 园豆:243 (菜鸟二级) | 2016-05-09 18:17

@kang_ya_ping: 那就把账号和密码拼凑成json对象。作为map键值对的value 。用这个类

private JSON getJsonMessage() {

JSONObject params = new JSONObject();

params.put("username", username);

params.put("password",password)

 

return params;

 

}

Map<String ,Object> map = new HashMap<String,Object>();

map.put("后台接口所要的key",getJsonMessage() );

sendPost(url, "application/x-www-form-urlencoded", map, null );

 

public static String sendPost(String url,String contentType,Map<String,Object> params,String header){
        if(params==null) return null;
        
        String bodyContennt="";
        try {
            if(contentType!=null && contentType.equals(HttpUtil.CONTENTTYPE_WWWFORM)){
                StringBuffer paramsContent = new StringBuffer();
                for (Map.Entry<String, Object> abc : params.entrySet()) {
                    paramsContent.append(URLEncoder.encode(abc.getKey(), "UTF-8"))
                    .append("=");
                    if(abc.getValue()!=null && (abc.getValue() instanceof List)){
                        StringBuilder values=new StringBuilder();
                        List<? extends Object> valueList= (List<? extends Object>) abc.getValue();
                        for(Object ovalue : valueList){
                            values.append(ovalue.toString()).append(",");
                        }
                        values.delete(values.length()-1, values.length());
                        paramsContent.append(URLEncoder.encode(values.toString(), "UTF-8"));
                    }else{
                        paramsContent.append(URLEncoder.encode(String.valueOf(abc.getValue()), "UTF-8"));
                    }
                    paramsContent.append("&");
                }
                paramsContent.delete(paramsContent.length()-1, paramsContent.length());
                bodyContennt=paramsContent.toString();
            }else if(contentType!=null && contentType.equals(HttpUtil.CONTENTTYPE_JSON)){
                bodyContennt=JsonTool.mapToJSON(params).toString();
                JSONObject obj=new JSONObject();
            }
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
        return sendPost(url, contentType, bodyContennt.toString(),header);
    }
    
    public static String sendPost(String url,String contentType, String params, String header) {
        PrintWriter out = null;
        BufferedReader in = null;
        StringBuilder result = new StringBuilder();
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
            // 设置通用的请求属性
            // 发送POST请求必须设置如下两行
            conn.setRequestMethod("POST");// 设置请求方法为post
            conn.setRequestProperty("Content-Type", contentType);
            conn.setReadTimeout(20000);// 设置读取超时为5秒
            conn.setConnectTimeout(50000);// 设置连接网络超时为10秒
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setRequestProperty("Authorization", header);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            // 发送请求参数
            out.print(params);
            // flush输出流的缓冲
            out.flush();
            out.close();
            
            int responseCode = conn.getResponseCode();
            // 定义BufferedReader输入流来读取URL的响应
            if (responseCode == 200) {
                in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String line;
                while ((line = in.readLine()) != null) {
                    result.append("\n").append(line);
                }
            }
            
        } catch (Exception e) {
            System.out.println("发送POST请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输出流、输入流
        finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return result.toString();
    }

 

)

return params;

}

威廉姆斯·苑 | 园豆:125 (初学一级) | 2016-05-09 19:33

@威廉姆斯·苑: 对不起,我没有能领会这段代码的意思。还有这段代码中需要创建JSONtool但我不知道应该需要实现什么方法。如果你有时间的话,能不能详细说一下。拜托了。

kang_ya_ping | 园豆:243 (菜鸟二级) | 2016-05-09 19:48

@kang_ya_ping: 不管是什么样的接口,我们android端的只需要按照后台提供的接口文档,传相应格式参数,能从后台获取数据就行。responseCode这个服务器响应值位200就行。   

你们后台给你们的接口所需要的参数格式是什么样的?json字符串吗?

我插入的代码你不用管,你放在一个类中,直接调这个方法就行。

sendPost(url, "application/x-www-form-urlencoded", map, null ); //url就是你们接口路径,map键值对就是你们接口需要的参数,

而map的写法我也已经给你写好了:

Map<String ,Object> map = new HashMap<String,Object>();

map.put("后台接口所要的key",getJsonMessage() );//getJsonMessage() 这个方法返回的就是你所需要的所谓的封装的JSON对象。

 

private JSON getJsonMessage() {
JSONObject params = new JSONObject();

params.put("username", username);//这个就是你输入的账号

params.put("password",password); //这个就是你输入的密码

return params;//返回的就是JSON对象

 

你先这么请求,等后台写好了,你试一试。我的接口就是这么写的

}

 

 

 

 

威廉姆斯·苑 | 园豆:125 (初学一级) | 2016-05-09 20:27

@威廉姆斯·苑: 我就是把你的那段代码写到一个类中,可是报错了。说是需要创建JSONTool类

kang_ya_ping | 园豆:243 (菜鸟二级) | 2016-05-09 20:32

@威廉姆斯·苑: 如果你现在方便的话,我们可不可qq上讨论一下这个问题。因为我有好多疑问。如果你现在方便并且相信我是真心请教的话。QQ:1531698802

kang_ya_ping | 园豆:243 (菜鸟二级) | 2016-05-09 20:37
其他回答(1)
0

让php给你写一个接口.接口的意思就是给你一个url.让你以规定的格式传入数据(帐号密码)返回给你一个布尔值,表示帐号密码是否正确.

吴瑞祥 | 园豆:29449 (高人七级) | 2016-05-06 16:07

本人是初学者今年大二,Android知识不是太扎实,您能再详细说一下嘛,或者推荐几个例子给我可以吗?谢谢了。

支持(0) 反对(0) kang_ya_ping | 园豆:243 (菜鸟二级) | 2016-05-06 16:12

@kang_ya_ping: 这个跟安卓没关系.是后台开发的问题.你需要学的是http客户端的使用.怎么使用http客户端发起一个请求并获取响应.百度下安卓的http客户端用法就好.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2016-05-06 16:40

@吴瑞祥: Android客户端的用法不是有GET 和 POST两种方式吗?可是我把Android的方法写好,可还是不能实现登录。我能不能把我的代码发给你,您帮我看一下可以吗?

支持(0) 反对(0) kang_ya_ping | 园豆:243 (菜鸟二级) | 2016-05-06 16:46

@kang_ya_ping: 你先弄清楚什么登陆.

在浏览器上的登陆是在cookie中记录了你已经验证过帐号密码.你在安卓里客户端应该是不会在cookie里保持会话.所以一般都是用token授权的方式.百度;oauth

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2016-05-07 06:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册