restful
用yii2.0的restful 写完了被各种指责风格的问题。呵呵!这个世界上有了路,就一定要从路上走是不是,野径芬芳好不。
所谓restful 就是让服务器开一个 口子 !! 没错,网页连接的是服务器,服务器分配资源呗,既然就是一个口子就做好大门的事情就行了呗
我有钥匙 你就让我进去呗,干嘛一定要用身份证。
android http 协议的使用
1,http 直接访问喽 post/get(不用身份证类型的)
2,http 协议包括报头中 的 [用户名:密码] 的base64的加密 访问,以及设置参数访问形式(贴身份证类型的)
调用方法 和上面的一样在一个子线程中调用即可 返回的还是一个arraylist的数组哦
总结 :1 采用了access_token的形式
2 返回的值进行了编码 (数组了,但是我还是在想我的视频)
3 对我而言这两种 都没有什么区别只是 服务器的验证方式的问题.
用yii2.0的restful 写完了被各种指责风格的问题。呵呵!这个世界上有了路,就一定要从路上走是不是,野径芬芳好不。
所谓restful 就是让服务器开一个 口子 !! 没错,网页连接的是服务器,服务器分配资源呗,既然就是一个口子就做好大门的事情就行了呗
我有钥匙 你就让我进去呗,干嘛一定要用身份证。
android http 协议的使用
1,http 直接访问喽 post/get(不用身份证类型的)
2,http 协议包括报头中 的 [用户名:密码] 的base64的加密 访问,以及设置参数访问形式(贴身份证类型的)
/**
* 向指定URL发送POST方法的请求
* @param url 发送请求的URL
* @param params 请求参数,请求参数应该是name1=value1&name2=value2的形式。
* @return URL所代表远程资源的响应
*/
public static String sendPost(String url, String params)
{
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try
{
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
// 连接模式
conn.setRequestProperty("connection", "Keep-Alive");
// 连接的用户设置
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(params); //②
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null)
{
result += "\n" + 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;
}
调用
new Thread() // 要避免在主线程中发送 这个 所以新建了一个线程
{
@Override
public void run()
{
response = GetPostUtil.sendPost(
"url"
,"name="+namevalue+"&"+"pwd="+pwdvalue+"&studentnumber="+studentnumbervalue"); // url 和参数
handler.sendEmptyMessage(0x123);
}
}.start();
public void handleMessage(Message msg)
{
if(msg.what == 0x123)
{
// 这个地方 你就可以写对response 的处理了
response = 呀 什么的处理
}
}
这个可以写在一个工具函数里面
总结 显而易见:1,接受的是字符串形式的,而我们通常不光使用这种类型的怎么办勒!解析成别的模式呗(下面有解析成json模式的)
2,传送是比特形式的getInputStream(缓冲流 如果是视频怎么办勒,(图片可以是一连串的二进制代码组成,而视频用二进制的代码是不是有些疯狂。))
3,这种是不包含 header 的, 但是你可以加 一个特别的参数,在params 里面啊,服务器端接受到请求的时候直接 先判断这个参数的合法性,不就可以进去了吗,干嘛一定要用
access_token 做判断。 我知道格式很重要是不是,你想说。其实原理上都是一样的。服务器都做了反应处理
第二种用httpurlconnection 没错就是加一个http
上代码:
public static ArrayList sendGet(String url, String params,String name,String pwd)
{ //这个params基本上没有什么用我一般都是空着 直接写在url的后面的参数,一般都是不重要的参数
//没错 这个是返回后解析成数组的形式,别急 还有json
String result = "";
String ap="";
BufferedReader in = null;
InputStream is = null;
JSONArray array1 = null;
ArrayList List = new ArrayList();
try
{
String urlName = url ;
URL realUrl = new URL(urlName);
// 打开和URL之间的连接
HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();
//进行编码
String author =Base64.encodeToString((name + ":" + pwd).getBytes(),Base64.DEFAULT);
ap=author;
// 设置通用的请求属性
//conn.setRequestProperty("connection", "application/x-www-form-urlencoded;charset=utf-8");
conn.setRequestProperty("content-type", "application/json; charset=UTF-8");
// 在设置Authorization 的时候一定要在 base64的边玩完成后的 前面加 ("Basic " + ) 要不你试试 永远是401错误
conn.setRequestProperty("Authorization", "Basic " + author);
//接受形式换成json
conn.setRequestProperty("Accept", "application/json");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("User-Agent", "MSIE 7.0");
//conn.setRequestProperty("user-agent",
//"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
// 建立实际的连接
conn.connect(); //①
// 获取所有响应头字段
Map<String, List<String>> map = conn.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet())
{
System.out.println(key + "--->" + map.get(key));
}
//定义输出数组的键值
is = conn.getInputStream(); //得到网络返回的输入流
//result = readData(is, "UTF-8"); //解析获取字符串
//调用数据流处理方法
if(conn.getResponseCode()==200){ //如果连接ok的时候
byte[] data = StreamTool.readInputStream(is);
String json = new String(data);
//构建JSON数组对象
array1 = new JSONArray(json);
byte unencode[] = Base64.decode(author,Base64.DEFAULT);
List.add(0, unencode); // 不用看 这个是我加上去玩的。
List.add(1, array1); // 加入到数组中去
}else{
return null;
}
conn.disconnect(); // 释放
}
catch (Exception e)
{
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally
{
try
{
if (in != null)
{
in.close();
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
return List;
}
public static class StreamTool // 工具函数
{
public static byte[] readInputStream(InputStream inStream) throws Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while( (len=inStream.read(buffer)) != -1 ){
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
}
activity
中 使用 解析出 json数组中的键值
JSONObject item = null;
try {
item = ((JSONArray) response.get(1)).getJSONObject(0);
result = item.getString("access_token");
ceshi = Base64.decode(result,Base64.DEFAULT); //反向解析完的access_token
result = new String(ceshi);
System.out.println(result);
user_id = item.getInt("user_id"); // 你可以不断的get什么 都是可以的
//解析发送的projects 是json中的一个数组 没错 就是这个键对应的值是一个数组
projects = item.getString("projects");
JSONArray array1 = new JSONArray(projects); //放在一个数组里面
p_name = new String[array1.length()];
p_id = new String [array1.length()];
for(int i=0 ; i < array1.length() ; i++)
{
//获取各个属性的值 这里就表明了 键值的键名其实是已经规定好的,需要做的应该是怎么获取到值
JSONObject item1 = array1.getJSONObject(i);
String id = item1.getString("id");
p_id[i] = id;
String title = item1.getString("project_name");
p_name[i] = title;
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
调用方法 和上面的一样在一个子线程中调用即可 返回的还是一个arraylist的数组哦
总结 :1 采用了access_token的形式
2 返回的值进行了编码 (数组了,但是我还是在想我的视频)
3 对我而言这两种 都没有什么区别只是 服务器的验证方式的问题.
明天再写 我在yii上面写的接受部分的程序