OkHttp——简单使用

一、GET传输

①、OkHttp默认使用GET传输
②、使用Request发送请求。
③、使用Response接收服务器的请求。
④、通过CallBack接口回调来处理接收的时候。 OkHttp提供异步,和非异步两种方式。
示例:
public static void main(String[]args){
		//创建OkHttpClient
		OkHttpClient client = new OkHttpClient();
		//创建请求类。通过使用Builder来构造Request类,默认GET传输
		Request request = new Request.Builder()
						.url("https://www.zhihu.com/")
						.build();
		//创建用来连接服务器的Call类
		Call call = client.newCall(request);
		//将Callback回调,放入队列中。  执行异步任务
		call.enqueue(new Callback() {
			
			@Override
			public void onResponse(Call arg0, Response arg1) throws IOException {
				// TODO Auto-generated method stub
				//判断是否成功连接服务器,并返回数据
				if (arg1.isSuccessful()){
					//获取返回数据的内容
					System.out.println(arg1.body().string());
				}
			}
			
			@Override
			public void onFailure(Call arg0, IOException arg1) {
				// TODO Auto-generated method stub
				
			}
		});

		try {
			//直接在该线程中执行任务,阻塞队列,等待服务器返回结果生成Response对象
			Response response = call.execute();
			System.out.println(response.body().string());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

补充基础
①、如何设置Header
		Request request = new Request.Builder()
						.addHeader("Content-Type", "text-plain")
						.header("host", "...")
						.build();
通过使用addHeader()和header()方法通过键值对的形式来创建请求的头部。
addHeader()的header()的区别:
addHeader():当存在相同的键名时候,不会覆盖该键名的数据,而是添加数据。
header():会覆盖当前相同键名的数据

②、如何通过Response获取服务器传回的数据
//获取全部的头部数据
Headers headers = response.headers();
//遍历数据(详细方法请参照api文档)
for(String name : headers.names()){
   System.out.println(headers.get(name));
}
					
//获取全部的内容数据
ResponseBody body = response.body();
//由于数据是存放在内存的,所以当内容数据小于1M就能直接接收。
String str = body.string();
//但是当大于1M的时候,就要通过流,传输到硬盘中
InputStream is = body.byteStream();

二、POST传输(仿表单传输)
①、上传简单key-value
OkHttpClient client = new OkHttpClient();
		//创建上传的数据(仿表单的形式)
FormBody body = new FormBody.Builder()
		.add("name", "chen")
		.add("pwd", "hello")
		.build();
//创建请求类,设定为Post请求,并放入要上传的数据
Request request = new Request.Builder()
		.url("https://www.zhihu.com/")
		.post(body)
		.build();
②、上传单个文件
public static final MediaType MEDIA_TYPE_FILE = MediaType.parse("application/octet-stream;charset:utf-8");
public static void main(String[]args){
        OkHttpClient client = new OkHttpClient();
	//将Body设置为表单,然后通过addFormDataPart()上传表单。
	MultipartBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
			   .addFormDataPart("data", "da.txt", RequestBody.create(MEDIA_TYPE_FILE, new File("asda")))
			   .build();
	Request request = new Request.Builder()
			.url("https://www.zhihu.com/")
			.post(body)
		        .build();
	}
原理:
表单上传文件的html表示:
Content-Disposition:form-data;name="images"                  
filename="storage/emulated/0/Camera/picture/tempeter.jpg"
Content-Type: application/octet-stream           

这里是文件的二进制数据...
name = "data"   fileName = "da.txt"   Content-Type:  MEDIA_TYPE_FILE
数据就是:new File("asda");

③、通过表单上传多个数据(文件,普通键值对)    (简称复合请求)
RequestBody body = new MultipartBody.Builder()
		.setType(MultipartBody.FORM)
		//上传文件
		.addPart(Headers.of("Content-Disposition","format-data;name=\"image\";filename=\"icon.png\""),
		RequestBody.create(MEDIA_TYPE_FILE, new File("image.png")))
		//上传普通键值对。
		.addPart(Headers.of("Content-Disposition","format-data;name=\"name\""),
		RequestBody.create(null, "chen"))
		.build();
}










你可能感兴趣的:(Android)