URLEncode 简单一句话,URLEncoding 就是为了将网址中的非ASCII码内容,转换成可以传输字符
在编码的时候,保留所有英文字母,数字,以及特定的字符,(这些字符全部都是ASCII中的),除此之外将会转换为十六进制标识,并且在每一个十六进制之前加上%,内容中的' '空格,全部采用加号+替换
URLEncoding 的格式,将要转换的内容,用十六进制表示法转换出来,然后每一个字节表示之前,用%开头;例如0x9c字节经过URLEncoding 就变成了%9C
编码的时候使用URLEncoder,解码的时候使用URLDecoder
编码 String encode = URLEncoder.encode("千雅爸爸", "UTF-8");//第二个参数一定要是服务器段支持的格式
解码 String decoderString = URLDecoder.decode("%E5%8D%83%E9%9B%85%E7%88%B8%E7%88%B8","UTF-8");
package tech.androidstudio.encodecryp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Arrays;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
urlEncodingTest();
}
/**
*URLEncode 简单一句话,URLEncoding 就是为了将网址中的非ASCII码内容,转换成可以传输字符
在编码的时候,保留所有英文字母,数字,以及特定的字符,(这些字符全部都是ASCII中的),除此之外将会转换为十六进制标识,并且在每一个十六进制之前加上%
内容中的' '空格,全部采用加号+替换
URLEncoding 的格式,将要转换的内容,用十六进制表示法转换出来,然后每一个字节表示之前,用%开头;例如0x9c字节经过URLEncoding 就变成了%9C
应用场景:所有GET请求,网址用到中文的情况,以及POST请求中,所有的Key 和Value,在提交之前,必须要经过URLEncoding
*/
public void urlEncodingTest(){
try {
//URLEncoder的编码
String encode = URLEncoder.encode("千雅爸爸", "UTF-8");//第二个参数一定要是服务器段支持的格式
Log.d("kodulf","千雅爸爸 的URLEncoding 是"+encode);
//URLDecoder的解码:
String decoderString = URLDecoder.decode("%E5%8D%83%E9%9B%85%E7%88%B8%E7%88%B8","UTF-8");
Log.d("kodulf","%E5%8D%83%E9%9B%85%E7%88%B8%E7%88%B8 URLDecoder的解码为:"+decoderString);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
03-22 06:18:27.934 366-366/? D/kodulf: 千雅爸爸 的URLEncoding 是%E5%8D%83%E9%9B%85%E7%88%B8%E7%88%B8
03-22 06:18:27.945 366-366/? D/kodulf: %E5%8D%83%E9%9B%85%E7%88%B8%E7%88%B8 的解码为:千雅爸爸
应用场景:所有GET请求,网址用到中文的情况,以及POST请求中,所有的Key 和Value,在提交之前,必须要经过URLEncoding
package tech.androidstudio.readfileshttpurlconnection;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity implements Runnable {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Thread thread = new Thread(this);
// thread.start();
URL url = null;
try {
//定义存储要提交的数据的Map
//如果 仅仅是为了测试那么直接使用
//测试的请求+++++++++++++开始+++++++++++++++
//StringBuilder sb = new StringBuilder("username=哈哈&password=psw");
//测试的请求++++++++++++++结束++++++++++++++
//如果为了模拟真实的请求,那么就使用下面的
//模拟真实的请求+++++++++++++开始+++++++++++++++
HashMap<String,String> params = new HashMap<String,String>();
params.put("username", "哈哈");
params.put("password", "psw");
//把要提交的 数据类型定义为 username=哈哈&password=psw的格式
StringBuilder sb = new StringBuilder();
//通过Map的遍历的到
for(Map.Entry<String,String> en:params.entrySet()){
sb.append(en.getKey())
.append("=")
.append(URLEncoder.encode(en.getValue(), "utf-8"))
.append("&");
}
//删除最后一个&,注意 这里是 length-1,因为是从0开始计数的。
sb.deleteCharAt(sb.length()-1);
//模拟真实的请求++++++++++++++结束++++++++++++++
url = new URL("http://192.168.1.106:8080/ServerDemo/servlet/LoginServlert");
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setConnectTimeout(5000);
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);//设置可以向服务器传递数据
//设置提交的内容的类型
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//设置提交的内容的长度
byte[] data = sb.toString().getBytes("utf-8");//注意这里的编码utf-8
urlConnection.setRequestProperty("Content-Length", String.valueOf(data.length));
//提交数据
OutputStream outputStream = urlConnection.getOutputStream();
outputStream.write(data);
outputStream.close();
//判断服务器端的响应码是不是200
InputStream in = urlConnection.getInputStream();
if(urlConnection.getResponseCode()==200){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] arr = new byte[1024];
int len=0;
while((len=in.read(arr))!=-1){
bos.write(arr,0,len);
}
byte[] b = bos.toByteArray();
String ss = new String(b,"utf-8");
Log.d("kodulf","kodulf"+ss);
}
//关闭流
in.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
//配置 HttpURLConnection
//TODO 这里的ip 地址一定不能使localhost 一定要是电脑的或者是正式ip地址.
//如果写成了localhost,那么就会报错java.net.ConnectException: localhost/127.0.0.1:8080 - Connection refused
//URL url = new URL("http://localhost:8080/tomcat.png");
URL url = new URL("http://192.168.1.106:8080/tomcat.png");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");
httpURLConnection.setConnectTimeout(5000);
//Sets the flag indicating whether this URLConnection allows input. It cannot be set after the connection is established.
httpURLConnection.setDoInput(true);
//获取返回的文件
InputStream in = null;
FileOutputStream fos = null;
if (httpURLConnection.getResponseCode() == 200) {
in = httpURLConnection.getInputStream();
//一定不能直接在FileOutputStream里面写文件名,需要添加路径
//错误的写法:fos = new FileOutputStream("a.bmp");
//下面存储到内部存储的私有的cache目录里面,注意了生成的文件名是cachea.bmp
fos = new FileOutputStream(getCacheDir().getPath()+"a.bmp");
byte[] arr = new byte[1024];
int len = 0;
//每次读取 1024个字节,如果读取返回为-1说明到了文件的末尾,结束读取
while ((len = in.read(arr)) != -1) {
fos.write(arr, 0, len);
}
//一定要记住要关闭读取流。
in.close();
fos.close();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}