我们服务器的数据库当中有账号和密码信息,我怎么才能通过Android客户端向PHP发送json字符串来验证自己输入的账号和密码是否存在于数据库中。求详解有代码让自己琢磨也可,谢谢。
请求接口时,不就是提供 参数 ,访问接口吗?你是具体哪里搞不清楚?你现在能从服务器请求到数据吗
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: debug 在String result处打个断点看看有没有请求到数据啊, 如果报错就看看报的什么错
@kang_ya_ping: debug调试会不会?或者你把result的数据打印出来,看看也行,这样也省去了debug,最好调试的还是debug 。
@android小白: log打印的结果是;
这里面是获取到我在Android端的输入,可是请求不到服务器端的请求
@kang_ya_ping: {"accType":"0"........}不就是从服务器请求到的数据吗? 登陆就是传账号,密码到服务器,服务器返回这个账号的基本信息。 你说的“请求不到服务器的请求”是啥意思啊? 数据库是否有你输入的账号密码,那是后台判断的啊。他返回有就有,没有就是没有。
@威廉姆斯·苑: 我输库入的用户名是我自己编的,并不是数据库中确实存在的。如果用户名和密码不在数据中就返回登录失败的提示框,可是现在我的程序运行的时候一点反应都没有
@kang_ya_ping: Log.i("==============", ); 打LOG不要这打。我看你代码中有多处用“=====”分不清到底是那部分的代码打印的,你把这写区分开,再打印一次,我看看各处的打印信息。网络请求部分的login 用Log.i(“http", ); 之类的,总之区分开。 其实用断点,最后走到哪步一步了然。
@kang_ya_ping: 你这个问题没有一点难度,只是你没定位到问题的所在而已。按照逻辑,一步一步往下走,逐步定位到哪步出的问题。请求网络后没啥反应。代码没问题那就是逻辑处问题了。
你在handler部分有三个判断情况。如果不会打断点那就再这三个部分打log信息,看它到底走了哪步。
如果都没有log信息,那就说明没走这个方法,那就是handler.sendmessage以上这部分的某处代码的问题了。
@威廉姆斯·苑: 确实是handler.sendmessage(msg)代码的问题。是这句话
String info = po.logina(name, pwd);当调用po.logina()方法的时候不能返回一个String值通过打印log信息发现 HttpResponse httpResponse = httpClient.execute(request);程序运行到这个地方的时候日志信息就没有打印出来。但是打印request的值是存在的结果显示为:
但就是无法请求服务器并获取服务器返回的信息。是代码出错在什么地方了,恕我愚钝,我找了很久没有发现。求指点
@kang_ya_ping: System.out.print(code); 这个code 返回的是多少
@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) ;
@威廉姆斯·苑: 你好,你的方法我已经试验过了。之前一直解决不了的问题已经解决了。真的很谢谢你。下面是日志文件打印的结果:我想Android端的程序已经没有问题。服务器链接超时,是因为我们服务器端的代码没有写好。但是我还得麻烦你一下。虽然程序没有问题了,但是跟我们团队老师要求的不太一样。我们老师要求把用户输入的用户名和密码封装成JSON发送给服务器。然后服务器跟数据库中的信息进行比对,然后返回1登录成功,0登录失败。
但是这个程序跟我们老师要求的不太一样,老师的想法,我已经画了一张图片粘贴在下面了。
@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;
}
@威廉姆斯·苑: 对不起,我没有能领会这段代码的意思。还有这段代码中需要创建JSONtool但我不知道应该需要实现什么方法。如果你有时间的话,能不能详细说一下。拜托了。
@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对象
你先这么请求,等后台写好了,你试一试。我的接口就是这么写的
}
@威廉姆斯·苑: 我就是把你的那段代码写到一个类中,可是报错了。说是需要创建JSONTool类
@威廉姆斯·苑: 如果你现在方便的话,我们可不可qq上讨论一下这个问题。因为我有好多疑问。如果你现在方便并且相信我是真心请教的话。QQ:1531698802
让php给你写一个接口.接口的意思就是给你一个url.让你以规定的格式传入数据(帐号密码)返回给你一个布尔值,表示帐号密码是否正确.
本人是初学者今年大二,Android知识不是太扎实,您能再详细说一下嘛,或者推荐几个例子给我可以吗?谢谢了。
@kang_ya_ping: 这个跟安卓没关系.是后台开发的问题.你需要学的是http客户端的使用.怎么使用http客户端发起一个请求并获取响应.百度下安卓的http客户端用法就好.
@吴瑞祥: Android客户端的用法不是有GET 和 POST两种方式吗?可是我把Android的方法写好,可还是不能实现登录。我能不能把我的代码发给你,您帮我看一下可以吗?
@kang_ya_ping: 你先弄清楚什么登陆.
在浏览器上的登陆是在cookie中记录了你已经验证过帐号密码.你在安卓里客户端应该是不会在cookie里保持会话.所以一般都是用token授权的方式.百度;oauth