您的位置:首页 > 理论基础 > 计算机网络

网络编程用别人提供的接口(安卓常用)

2016-06-18 23:17 621 查看
在android开发中,我们难免需要向后台请求数据,需要底层人员开发好给我们提供一个接口,首先我们来看一个Demo。看如何java如何请求url接口得到数据的

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

public class URLDemo {

/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {

String str_url = "http://localhost:8080/spring-7/index.jsp";

URL url = new URL(str_url);

System.out.println("getProtocol:"+url.getProtocol());
System.out.println("getHost:"+url.getHost());
System.out.println("getPort:"+url.getPort());
System.out.println("getFile:"+url.getFile());
System.out.println("getPath:"+url.getPath());
System.out.println("getQuery:"+url.getQuery());

//		InputStream in = url.openStream();

//获取url对象的Url连接器对象。将连接封装成了对象:java中内置的可以解析的具体协议的对象+socket.
URLConnection conn = url.openConnection();

//		String value = conn.getHeaderField("Content-Type");
//		System.out.println(value);

//		System.out.println(conn);

InputStream in = conn.getInputStream();

byte[] buf = new byte[1024];
int len = in.read(buf);

String text = new String(buf,0,len);

System.out.println(text);

in.close();

}

}
我们继续自己写一个封装类来

1、利用jdk提供的原生接口实现http访问

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* 利用jdk提供的原生接口实现http访问
* @author luowenguan
*
*/
public class HttpClient {

private final URL url;

public HttpClient (String _url) throws MalformedURLException {
this.url = new URL(_url);
}

public byte[] post(String data) throws IOException {

HttpURLConnection con = (HttpURLConnection) url.openConnection();
OutputStreamWriter out = null;
BufferedReader reader = null;
try {
con.setRequestMethod("POST");
// 设置是否向HttpURLConnection输出,因为这个是post请求,参数要放在
// http正文内,因此需要设为true, 默认情况下是false;
con.setDoOutput(true);
con.setConnectTimeout(3 * 1000);
out = new OutputStreamWriter(con.getOutputStream());
out.write(data);

// 刷新输出流,将任何字符都写入潜在的流中
out.flush();
// 连接,url.openConnection()至此的配置必须要在connect之前完成,
// 实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。
con.connect();

if (con.getResponseCode() == 200) {
System.out.println("Response OK");
StringBuffer resultData = new StringBuffer();
if (con.getResponseCode() == 200) {
reader = new BufferedReader(new InputStreamReader(
con.getInputStream(), "utf-8"));
String line;
while ((line = reader.readLine()) != null) {
resultData.append(line);
}

byte[] bts = resultData.toString().getBytes();
return bts;
}

}
return null;
} finally {
if (out != null) {
out.close();
}
if (reader != null) {
reader.close();
}
}
}

public static void main(String []args) throws IOException{
HttpClient h = new HttpClient("http://localhost:8080/spring-7/test");
byte[] s = h.post("name=哈哈&age=12");
System.out.println(new String(s));
}
}


别人写好的封装,一般工作中我们都用这个,封装得更好

2、基于 httpclient 4.3.3版本的 http工具类


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import axer.exception.AppException;

/**
* 基于 httpclient 4.3.3版本的 http工具类
*/
public class HttpClientUtil {

private static final CloseableHttpClient httpClient;
public static final String CHARSET = "UTF-8";

static {
//setRedirectsEnabled 禁止自动跳转
RequestConfig config = RequestConfig.custom().setConnectTimeout(60000*100).setSocketTimeout(15000*100).setRedirectsEnabled(false).build();
httpClient = HttpClientBuilder.create().setDefaultRequestConfig(config).build();
}

public static String doGet(String url, Map<String, String> params){
return doGet(url, params,CHARSET);
}
public static String doPost(String url, Map<String, String> params){
return doPost(url, params,CHARSET);
}
/**
* HTTP Get 获取内容
* @param url  请求的url地址 ?之前的地址
* @param params	请求的参数
* @param charset	编码格式
* @return	页面内容
*/
public static String doGet(String url,Map<String,String> params,String charset){
if(StringUtils.isBlank(url)){
return null;
}
try {
if(params != null && !params.isEmpty()){
List<NameValuePair> pairs = new ArrayList<NameValuePair>(params.size());
for(Map.Entry<String,String> entry : params.entrySet()){
String value = entry.getValue();
if(value != null){
pairs.add(new BasicNameValuePair(entry.getKey(),value));
}
}
url += "?" + EntityUtils.toString(new UrlEncodedFormEntity(pairs, charset));
}
HttpGet httpGet = new HttpGet(url);

CloseableHttpResponse response = httpClient.execute(httpGet);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200) {
httpGet.abort();
throw new RuntimeException("HttpClient,error status code :" + statusCode);
}
HttpEntity entity = response.getEntity();
String result = null;
if (entity != null){
result = EntityUtils.toString(entity, "utf-8");
}
EntityUtils.consume(entity);
response.close();
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

/**
* HTTP Post 获取内容
* @param url  请求的url地址 ?之前的地址
* @param params	请求的参数
* @param charset	编码格式
* @return	页面内容
*/
public static String doPost(String url,Map<String,String> params,String charset){
if(StringUtils.isBlank(url)){
return null;
}
try {
List<NameValuePair> pairs = null;
if(params != null && !params.isEmpty()){
pairs = new ArrayList<NameValuePair>(params.size());
for(Map.Entry<String,String> entry : params.entrySet()){
String value = entry.getValue();
if(value != null){
pairs.add(new BasicNameValuePair(entry.getKey(),value));
}
}
}
HttpPost httpPost = new HttpPost(url);
if(pairs != null && pairs.size() > 0){
httpPost.setEntity(new UrlEncodedFormEntity(pairs,CHARSET));
}
CloseableHttpResponse response = httpClient.execute(httpPost);

int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200) {
httpPost.abort();
throw new RuntimeException("HttpClient,error status code :" + statusCode);
}
HttpEntity entity = response.getEntity();
String result = null;
if (entity != null){
result = EntityUtils.toString(entity, "utf-8");
}
EntityUtils.consume(entity);
response.close();
return result;
} catch (Exception e) {
throw new AppException(e);
}
}
public static void main(String []args){
Map<String,String> pa = new HashMap<String, String>();
pa.put("name", "张飞");
pa.put("age", "121");
String getData = doPost("http://localhost:8080/spring-7/test",pa);
System.out.println(getData);
System.out.println("----------------------分割线-----------------------");
//    	String postData = doPost("http://www.oschina.net/",null);
//    	System.out.println(postData);
}

}
一般都是用第二种,封装更好,别人封装好的方法。代码中地址灵活修改,可以请求action返回json或者xml。这种方法在安卓中比较常用,当应用层想让底层帮弄一个接口基本上都是这样去实现接口,然后使用接口返回的数据

学习小记,如有不对之处请大神指点。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: