亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

淺談java調用Restful API接口的方式

2024-07-13 10:14:59
字體:
來源:轉載
供稿:網友

摘要:最近有一個需求,為客戶提供一些RestfulAPI接口,QA使用postman進行測試,但是postman的測試接口與java調用的相似但并不相同,于是想自己寫一個程序去測試RestfulAPI接口,由于使用的是HTTPS,所以還要考慮到對于HTTPS的處理。由于我也是首次使用Java調用restful接口,所以還要研究一番,自然也是查閱了一些資料。

分析:這個問題與模塊之間的調用不同,比如我有兩個模塊frontend和backend,frontend提供前臺展示,backend提供數據支持。之前使用過Hession去把backend提供的服務注冊成遠程服務,在frontend端可以通過這種遠程服務直接調到backend的接口。但這對于一個公司自己的一個項目耦合性比較高的情況下使用,沒有問題。但是如果給客戶注冊這種遠程服務,似乎不太好,耦合性太高。所以就考慮用一下方式進行處理。

基本介紹

Restful接口的調用,前端一般使用ajax調用,后端可以使用的方法比較多,

本次介紹三種:

1.HttpURLConnection實現

2.HttpClient實現

3.Spring的RestTemplate

一、HttpClient

HttpClient大家也許比較熟悉但又比較陌生,熟悉是知道他可以遠程調用比如請求一個URL,然后在response里獲取到返回狀態和返回信息,但是今天講的稍微復雜一點,因為今天的主題是HTTPS,這個牽涉到證書或用戶認證的問題。

確定使用HttpClient之后,查詢相關資料,發現HttpClient的新版本與老版本不同,隨然兼容老版本,但已經不提倡老版本是使用方式,很多都已經標記為過時的方法或類。今天就分別使用老版本4.2和最新版本4.5.3來寫代碼。

老版本4.2

需要認證

在準備證書階段選擇的是使用證書認證

package com.darren.test.https.v42;import java.io.File;import java.io.FileInputStream;import java.security.KeyStore;import org.apache.http.conn.ssl.SSLSocketFactory;public class HTTPSCertifiedClient extends HTTPSClient {	public HTTPSCertifiedClient() {	}	@Override 	  public void prepareCertificate() throws Exception {		// 獲得密匙庫 		KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());		FileInputStream instream = new FileInputStream( 		        new File("C:/Users/zhda6001/Downloads/software/xxx.keystore"));		// FileInputStream instream = new FileInputStream(new File("C:/Users/zhda6001/Downloads/xxx.keystore")); 		// 密匙庫的密碼 		trustStore.load(instream, "password".toCharArray());		// 注冊密匙庫 		this.socketFactory = new SSLSocketFactory(trustStore);		// 不校驗域名 		socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);	}}

跳過認證

在準備證書階段選擇的是跳過認證

package com.darren.test.https.v42;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import org.apache.http.conn.ssl.SSLSocketFactory;public class HTTPSTrustClient extends HTTPSClient {	public HTTPSTrustClient() {	}	@Override 	  public void prepareCertificate() throws Exception {		// 跳過證書驗證 		SSLContext ctx = SSLContext.getInstance("TLS");		X509TrustManager tm = new X509TrustManager() {			@Override 			      public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {			}			@Override 			      public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {			}			@Override 			      public X509Certificate[] getAcceptedIssuers() {				return null;			}		}		;		// 設置成已信任的證書 		ctx.init(null, new TrustManager[] {			tm		}		, null);		// 穿件SSL socket 工廠,并且設置不檢查host名稱 		this.socketFactory = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);	}}

總結

現在發現這兩個類都繼承了同一個類HTTPSClient,并且HTTPSClient繼承了DefaultHttpClient類,可以發現,這里使用了模板方法模式。

package com.darren.test.https.v42;import org.apache.http.conn.ClientConnectionManager;import org.apache.http.conn.scheme.Scheme;import org.apache.http.conn.scheme.SchemeRegistry;import org.apache.http.conn.ssl.SSLSocketFactory;import org.apache.http.impl.client.DefaultHttpClient;public abstract class HTTPSClient extends DefaultHttpClient {	protected SSLSocketFactory socketFactory;	/**    * 初始化HTTPSClient    *    * @return 返回當前實例    * @throws Exception    */	public HTTPSClient init() throws Exception {		this.prepareCertificate();		this.regist();		return this;	}	/**    * 準備證書驗證    *    * @throws Exception    */	public abstract void prepareCertificate() throws Exception;	/**    * 注冊協議和端口, 此方法也可以被子類重寫    */	protected void regist() {		ClientConnectionManager ccm = this.getConnectionManager();		SchemeRegistry sr = ccm.getSchemeRegistry();		sr.register(new Scheme("https", 443, socketFactory));	}}

下邊是工具類

package com.darren.test.https.v42;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.Set;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.methods.HttpRequestBase;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;public class HTTPSClientUtil {	private static final String DEFAULT_CHARSET = "UTF-8";	public static String doPost(HTTPSClient httpsClient, String url, Map<String, String> paramHeader, 	      Map<String, String> paramBody) throws Exception {		return doPost(httpsClient, url, paramHeader, paramBody, DEFAULT_CHARSET);	}	public static String doPost(HTTPSClient httpsClient, String url, Map<String, String> paramHeader, 	      Map<String, String> paramBody, String charset) throws Exception {		String result = null;		HttpPost httpPost = new HttpPost(url);		setHeader(httpPost, paramHeader);		setBody(httpPost, paramBody, charset);		HttpResponse response = httpsClient.execute(httpPost);		if (response != null) {			HttpEntity resEntity = response.getEntity();			if (resEntity != null) {				result = EntityUtils.toString(resEntity, charset);			}		}		return result;	}	public static String doGet(HTTPSClient httpsClient, String url, Map<String, String> paramHeader, 	      Map<String, String> paramBody) throws Exception {		return doGet(httpsClient, url, paramHeader, paramBody, DEFAULT_CHARSET);	}	public static String doGet(HTTPSClient httpsClient, String url, Map<String, String> paramHeader, 	      Map<String, String> paramBody, String charset) throws Exception {		String result = null;		HttpGet httpGet = new HttpGet(url);		setHeader(httpGet, paramHeader);		HttpResponse response = httpsClient.execute(httpGet);		if (response != null) {			HttpEntity resEntity = response.getEntity();			if (resEntity != null) {				result = EntityUtils.toString(resEntity, charset);			}		}		return result;	}	private static void setHeader(HttpRequestBase request, Map<String, String> paramHeader) {		// 設置Header 		if (paramHeader != null) {			Set<String> keySet = paramHeader.keySet();			for (String key : keySet) {				request.addHeader(key, paramHeader.get(key));			}		}	}	private static void setBody(HttpPost httpPost, Map<String, String> paramBody, String charset) throws Exception {		// 設置參數 		if (paramBody != null) {			List<NameValuePair> list = new ArrayList<NameValuePair>();			Set<String> keySet = paramBody.keySet();			for (String key : keySet) {				list.add(new BasicNameValuePair(key, paramBody.get(key)));			}			if (list.size() > 0) {				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, charset);				httpPost.setEntity(entity);			}		}	}}

然后是測試類:

package com.darren.test.https.v42;import java.util.HashMap;import java.util.Map;public class HTTPSClientTest {	public static void main(String[] args) throws Exception {		HTTPSClient httpsClient = null;		httpsClient = new HTTPSTrustClient().init();		//httpsClient = new HTTPSCertifiedClient().init(); 		String url = "https://1.2.6.2:8011/xxx/api/getToken";		//String url = "https://1.2.6.2:8011/xxx/api/getHealth"; 		Map<String, String> paramHeader = new HashMap<>();		//paramHeader.put("Content-Type", "application/json"); 		paramHeader.put("Accept", "application/xml");		Map<String, String> paramBody = new HashMap<>();		paramBody.put("client_id", "ankur.tandon.ap@xxx.com");		paramBody.put("client_secret", "P@ssword_1");		String result = HTTPSClientUtil.doPost(httpsClient, url, paramHeader, paramBody);		//String result = HTTPSClientUtil.doGet(httpsClient, url, null, null); 		System.out.println(result);	}}

返回信息:

<?xml version="1.0" encoding="utf-8"?>  <token>jkf8RL0sw+Skkflj8RbKI5hP1bEQK8PrCuTZPpBINqMYKRMxY1kWCjmCfT191Zpp88VV1aGHW8oYNWjEYS0axpLuGAX89ejCoWNbikCc1UvfyesXHLktcJqyUFiVjevhrEQxJPHncLQYWP+Xse5oD9X8vKFKk7InNTMRzQK7YBTZ/e3U7gswM/5cvAHFl6o9rEq9cWPXavZNohyvnXsohSzDo+BXAtXxa1xpEDLy/8h/UaP4n4dlZDJJ3B8t1Xh+CRRIoMOPxf7c5wKhHtOkEOeXW+xoPQKKSx5CKWwJpPuGIIFWF/PaqWg+JUOsVT7QGdPv8PMWJ9DwEwjTdxguDg==</token> 

新版本4.5.3

需要認證

package com.darren.test.https.v45;import java.io.File;import java.io.FileInputStream;import java.security.KeyStore;import javax.net.ssl.SSLContext;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.conn.ssl.TrustSelfSignedStrategy;import org.apache.http.ssl.SSLContexts;public class HTTPSCertifiedClient extends HTTPSClient {	public HTTPSCertifiedClient() {	}	@Override 	  public void prepareCertificate() throws Exception {		// 獲得密匙庫 		KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());		FileInputStream instream = new FileInputStream( 		        new File("C:/Users/zhda6001/Downloads/software/xxx.keystore"));		// FileInputStream instream = new FileInputStream(new File("C:/Users/zhda6001/Downloads/xxx.keystore")); 		try {			// 密匙庫的密碼 			trustStore.load(instream, "password".toCharArray());		}		finally {			instream.close();		}		SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, TrustSelfSignedStrategy.INSTANCE) 		        .build();		this.connectionSocketFactory = new SSLConnectionSocketFactory(sslcontext);	}}

跳過認證

package com.darren.test.https.v45;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;public class HTTPSTrustClient extends HTTPSClient {	public HTTPSTrustClient() {	}	@Override 	  public void prepareCertificate() throws Exception {		// 跳過證書驗證 		SSLContext ctx = SSLContext.getInstance("TLS");		X509TrustManager tm = new X509TrustManager() {			@Override 			      public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {			}			@Override 			      public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {			}			@Override 			      public X509Certificate[] getAcceptedIssuers() {				return null;			}		}		;		// 設置成已信任的證書 		ctx.init(null, new TrustManager[] {			tm		}		, null);		this.connectionSocketFactory = new SSLConnectionSocketFactory(ctx);	}}

總結

package com.darren.test.https.v45;import org.apache.http.config.Registry;import org.apache.http.config.RegistryBuilder;import org.apache.http.conn.socket.ConnectionSocketFactory;import org.apache.http.conn.socket.PlainConnectionSocketFactory;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClientBuilder;import org.apache.http.impl.client.HttpClients;import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;public abstract class HTTPSClient extends HttpClientBuilder {	private CloseableHttpClient client;	protected ConnectionSocketFactory connectionSocketFactory;	/**    * 初始化HTTPSClient    *    * @return 返回當前實例    * @throws Exception    */	public CloseableHttpClient init() throws Exception {		this.prepareCertificate();		this.regist();		return this.client;	}	/**    * 準備證書驗證    *    * @throws Exception    */	public abstract void prepareCertificate() throws Exception;	/**    * 注冊協議和端口, 此方法也可以被子類重寫    */	protected void regist() {		// 設置協議http和https對應的處理socket鏈接工廠的對象 		Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() 		        .register("http", PlainConnectionSocketFactory.INSTANCE) 		        .register("https", this.connectionSocketFactory) 		        .build();		PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);		HttpClients.custom().setConnectionManager(connManager);		// 創建自定義的httpclient對象 		this.client = HttpClients.custom().setConnectionManager(connManager).build();		// CloseableHttpClient client = HttpClients.createDefault();	}}

工具類:

package com.darren.test.https.v45;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.Set;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.methods.HttpRequestBase;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;public class HTTPSClientUtil {	private static final String DEFAULT_CHARSET = "UTF-8";	public static String doPost(HttpClient httpClient, String url, Map<String, String> paramHeader, 	      Map<String, String> paramBody) throws Exception {		return doPost(httpClient, url, paramHeader, paramBody, DEFAULT_CHARSET);	}	public static String doPost(HttpClient httpClient, String url, Map<String, String> paramHeader, 	      Map<String, String> paramBody, String charset) throws Exception {		String result = null;		HttpPost httpPost = new HttpPost(url);		setHeader(httpPost, paramHeader);		setBody(httpPost, paramBody, charset);		HttpResponse response = httpClient.execute(httpPost);		if (response != null) {			HttpEntity resEntity = response.getEntity();			if (resEntity != null) {				result = EntityUtils.toString(resEntity, charset);			}		}		return result;	}	public static String doGet(HttpClient httpClient, String url, Map<String, String> paramHeader, 	      Map<String, String> paramBody) throws Exception {		return doGet(httpClient, url, paramHeader, paramBody, DEFAULT_CHARSET);	}	public static String doGet(HttpClient httpClient, String url, Map<String, String> paramHeader, 	      Map<String, String> paramBody, String charset) throws Exception {		String result = null;		HttpGet httpGet = new HttpGet(url);		setHeader(httpGet, paramHeader);		HttpResponse response = httpClient.execute(httpGet);		if (response != null) {			HttpEntity resEntity = response.getEntity();			if (resEntity != null) {				result = EntityUtils.toString(resEntity, charset);			}		}		return result;	}	private static void setHeader(HttpRequestBase request, Map<String, String> paramHeader) {		// 設置Header 		if (paramHeader != null) {			Set<String> keySet = paramHeader.keySet();			for (String key : keySet) {				request.addHeader(key, paramHeader.get(key));			}		}	}	private static void setBody(HttpPost httpPost, Map<String, String> paramBody, String charset) throws Exception {		// 設置參數 		if (paramBody != null) {			List<NameValuePair> list = new ArrayList<NameValuePair>();			Set<String> keySet = paramBody.keySet();			for (String key : keySet) {				list.add(new BasicNameValuePair(key, paramBody.get(key)));			}			if (list.size() > 0) {				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, charset);				httpPost.setEntity(entity);			}		}	}}

測試類:

package com.darren.test.https.v45;import java.util.HashMap;import java.util.Map;import org.apache.http.client.HttpClient;public class HTTPSClientTest {	public static void main(String[] args) throws Exception {		HttpClient httpClient = null;		//httpClient = new HTTPSTrustClient().init(); 		httpClient = new HTTPSCertifiedClient().init();		String url = "https://1.2.6.2:8011/xxx/api/getToken";		//String url = "https://1.2.6.2:8011/xxx/api/getHealth"; 		Map<String, String> paramHeader = new HashMap<>();		paramHeader.put("Accept", "application/xml");		Map<String, String> paramBody = new HashMap<>();		paramBody.put("client_id", "ankur.tandon.ap@xxx.com");		paramBody.put("client_secret", "P@ssword_1");		String result = HTTPSClientUtil.doPost(httpClient, url, paramHeader, paramBody);		//String result = HTTPSClientUtil.doGet(httpsClient, url, null, null); 		System.out.println(result);	}}

結果:

<?xml version="1.0" encoding="utf-8"?>  <token>RxitF9//7NxwXJS2cjIjYhLtvzUNvMZxxEQtGN0u07sC9ysJeIbPqte3hCjULSkoXPEUYGUVeyI9jv7/WikLrzxYKc3OSpaTSM0kCbCKphu0TB2Cn/nfzv9fMLueOWFBdyz+N0sEiI9K+0Gp7920DFEncn17wUJVmC0u2jwvM5FAjQKmilwodXZ6a0Dq+D7dQDJwVcwxBvJ2ilhyIb3pr805Vppmi9atXrVAKO0ODa006wEJFOfcgyG5p70wpJ5rrBL85vfy9WCvkd1R7j6NVjhXgH2gNimHkjEJorMjdXW2gKiUsiWsELi/XPswao7/CTWNwTnctGK8PX2ZUB0ZfA==</token> 

二、HttpURLConnection

@Controllerpublic class RestfulAction {	@Autowired	  private UserService userService;	// 修改	@RequestMapping(value = "put/{param}", method = RequestMethod.PUT)	  public @ResponseBody String put(@PathVariable String param) {		return "put:" + param;	}	// 新增	@RequestMapping(value = "post/{param}", method = RequestMethod.POST)	  public @ResponseBody String post(@PathVariable String param,String id,String name) {		System.out.println("id:"+id);		System.out.println("name:"+name);		return "post:" + param;	}	// 刪除	@RequestMapping(value = "delete/{param}", method = RequestMethod.DELETE)	  public @ResponseBody String delete(@PathVariable String param) {		return "delete:" + param;	}	// 查找	@RequestMapping(value = "get/{param}", method = RequestMethod.GET)	  public @ResponseBody String get(@PathVariable String param) {		return "get:" + param;	}	// HttpURLConnection 方式調用Restful接口	// 調用接口	@RequestMapping(value = "dealCon/{param}")	  public @ResponseBody String dealCon(@PathVariable String param) {		try {			String url = "http://localhost:8080/tao-manager-web/";			url+=(param+"/xxx");			URL restServiceURL = new URL(url);			HttpURLConnection httpConnection = (HttpURLConnection) restServiceURL			          .openConnection();			//param 輸入小寫,轉換成 GET POST DELETE PUT 			httpConnection.setRequestMethod(param.toUpperCase());			//      httpConnection.setRequestProperty("Accept", "application/json");			if("post".equals(param)){				//打開輸出開關				httpConnection.setDoOutput(true);				//        httpConnection.setDoInput(true);				//傳遞參數				String input = "&id="+ URLEncoder.encode("abc", "UTF-8");				input+="&name="+ URLEncoder.encode("啊啊啊", "UTF-8");				OutputStream outputStream = httpConnection.getOutputStream();				outputStream.write(input.getBytes());				outputStream.flush();			}			if (httpConnection.getResponseCode() != 200) {				throw new RuntimeException(				            "HTTP GET Request Failed with Error code : "				                + httpConnection.getResponseCode());			}			BufferedReader responseBuffer = new BufferedReader(			          new InputStreamReader((httpConnection.getInputStream())));			String output;			System.out.println("Output from Server: /n");			while ((output = responseBuffer.readLine()) != null) {				System.out.println(output);			}			httpConnection.disconnect();		}		catch (MalformedURLException e) {			e.printStackTrace();		}		catch (IOException e) {			e.printStackTrace();		}		return "success";	}}

三、Spring的RestTemplate

springmvc.xml增加

<!-- 配置RestTemplate -->  <!--Http client Factory -->  <bean id="httpClientFactory"    class="org.springframework.http.client.SimpleClientHttpRequestFactory">    <property name="connectTimeout" value="10000" />    <property name="readTimeout" value="10000" />  </bean>  <!--RestTemplate -->  <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">    <constructor-arg ref="httpClientFactory" />  </bean>

controller

@Controllerpublic class RestTemplateAction {	@Autowired	  private RestTemplate template;	@RequestMapping("RestTem")	  public @ResponseBody User RestTem(String method) {		User user = null;		//查找		if ("get".equals(method)) {			user = template.getForObject(			          "http://localhost:8080/tao-manager-web/get/{id}",			          User.class, "嗚嗚嗚嗚");			//getForEntity與getForObject的區別是可以獲取返回值和狀態、頭等信息			ResponseEntity<User> re = template.			          getForEntity("http://localhost:8080/tao-manager-web/get/{id}",			          User.class, "嗚嗚嗚嗚");			System.out.println(re.getStatusCode());			System.out.println(re.getBody().getUsername());			//新增		} else if ("post".equals(method)) {			HttpHeaders headers = new HttpHeaders();			headers.add("X-Auth-Token", UUID.randomUUID().toString());			MultiValueMap<String, String> postParameters = new LinkedMultiValueMap<String, String>();			postParameters.add("id", "啊啊啊");			postParameters.add("name", "部版本");			HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(			          postParameters, headers);			user = template.postForObject(			          "http://localhost:8080/tao-manager-web/post/aaa", requestEntity,			          User.class);			//刪除		} else if ("delete".equals(method)) {			template.delete("http://localhost:8080/tao-manager-web/delete/{id}","aaa");			//修改		} else if ("put".equals(method)) {			template.put("http://localhost:8080/tao-manager-web/put/{id}",null,"bbb");		}		return user;	}}

以上就是本文關于淺談java調用Restful API接口的方式的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他Java相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
热久久这里只有| 国产精品福利片| 秋霞成人午夜鲁丝一区二区三区| 国产91色在线免费| 久久精品电影网| 久99久在线视频| 亚洲欧美综合图区| 狠狠做深爱婷婷久久综合一区| 国产精品专区一| 精品久久久香蕉免费精品视频| 中文字幕亚洲激情| 欧美性生交大片免网| 午夜精品免费视频| 亚洲精品有码在线| 2019国产精品自在线拍国产不卡| 国产精品视频播放| 啊v视频在线一区二区三区| 91久久精品国产91久久性色| 亚洲精品98久久久久久中文字幕| 精品欧美aⅴ在线网站| 亚洲成人精品av| 国模精品系列视频| 亚洲桃花岛网站| 亚洲自拍偷拍色图| 久久久久久亚洲精品不卡| 日本久久久久久| 欧美成年人视频| 亚洲人成电影网站色xx| 91久久精品国产91久久性色| 欧美视频裸体精品| 国产91色在线|| 91在线免费视频| 精品久久久久久电影| 韩国精品美女www爽爽爽视频| 国产精品久久久久久久久久小说| 在线精品国产成人综合| 最近2019中文字幕大全第二页| 欧美激情在线视频二区| 国产日韩欧美在线观看| 国产精品久久久久久久久久久久久久| 亚洲国产精品久久久久秋霞蜜臀| 成人av在线网址| 影音先锋欧美在线资源| 国产精品久久在线观看| 亚洲美女av黄| 国产成人精品日本亚洲专区61| 欧美xxxx18国产| 日韩欧美精品中文字幕| 日本精品久久久久影院| 中文字幕亚洲欧美日韩在线不卡| 亚洲一区二区久久| 亚洲aaaaaa| 欧美成人精品h版在线观看| 日韩精品免费在线视频| 精品调教chinesegay| 91精品视频在线播放| 亚洲变态欧美另类捆绑| 久久精品99久久香蕉国产色戒| 国产精品丝袜久久久久久高清| 日韩激情视频在线播放| 国产精品福利在线| 日韩精品日韩在线观看| 日韩av最新在线| 日韩免费在线免费观看| 亚洲一区二区三区成人在线视频精品| 亚洲精品影视在线观看| 亚洲精品www久久久久久广东| 亚洲精品一区二区网址| 全球成人中文在线| 中文字幕日韩专区| 国产视频精品va久久久久久| 欧美极品少妇xxxxⅹ喷水| 91在线|亚洲| 亚洲女人天堂成人av在线| 中文字幕亚洲情99在线| 亚洲国产精品yw在线观看| 国模极品一区二区三区| 午夜精品视频在线| 国产精品对白刺激| 亚洲欧美一区二区精品久久久| 九九视频直播综合网| 国产91ⅴ在线精品免费观看| 欧美性xxxx18| 精品国产欧美一区二区三区成人| 国产成人精品日本亚洲专区61| 欧美福利视频在线| 国模精品一区二区三区色天香| 色噜噜国产精品视频一区二区| 色视频www在线播放国产成人| 久久天天躁狠狠躁夜夜av| 国产精品jvid在线观看蜜臀| 国产欧美韩国高清| 欧美不卡视频一区发布| 51精品在线观看| 国产视频精品自拍| 日韩免费在线播放| 在线观看日韩视频| 国产精品久久久久久一区二区| 一区二区三区国产视频| 日韩av中文字幕在线播放| 精品成人久久av| 久久精品国产欧美亚洲人人爽| 久久99热精品这里久久精品| 国产精品九九九| 国产精品久久久久久中文字| 国自在线精品视频| 日韩欧美在线观看视频| 黑人巨大精品欧美一区二区一视频| 久久免费国产视频| 欧美日本精品在线| 日韩av毛片网| 国产成人aa精品一区在线播放| 日韩av高清不卡| 色99之美女主播在线视频| 热re91久久精品国99热蜜臀| 国产色婷婷国产综合在线理论片a| 欧美黄网免费在线观看| 国产精品久久久久久久久久新婚| 欧美亚洲视频一区二区| 亚洲精品视频免费在线观看| 亚洲va男人天堂| 成人在线一区二区| 日韩美女av在线| 91av成人在线| 狠狠做深爱婷婷久久综合一区| 午夜精品福利电影| 欧美性猛交xxxx乱大交极品| 97高清免费视频| 欧美日韩一二三四五区| 成人高清视频观看www| 日韩av高清不卡| 亚洲欧美制服综合另类| 成人免费观看a| 97色在线观看| 亚洲区一区二区| 不卡av日日日| 69av视频在线播放| 国产视频综合在线| 精品无人国产偷自产在线| 欧美成人激情在线| 日本a级片电影一区二区| 欧美专区国产专区| 久久精品国产久精国产思思| 97精品视频在线观看| 精品女厕一区二区三区| 亚洲天天在线日亚洲洲精| 色噜噜亚洲精品中文字幕| 国产日韩在线精品av| 日韩女优人人人人射在线视频| 欧洲精品在线视频| 国产精品色午夜在线观看| 午夜精品一区二区三区视频免费看| 亚洲欧美国产日韩天堂区| 日本一区二区在线播放| 亚洲欧美在线x视频| 亚洲精品成人av| 日韩高清电影免费观看完整| 国产精品色视频| 色av中文字幕一区| 精品动漫一区二区| 久久久久久国产三级电影| 国内精品久久久久影院 日本资源| 日韩高清电影免费观看完整版| 精品国产91乱高清在线观看|