Java 利用HttpURLConnection发送http请求
写了一个简单的 Http 请求的Class,实现了 get, post ,postfile
package com.asus.uts.util; import org.json.JSONException; import org.json.JSONObject; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; /** * Created by jiezhou on 16/2/22. */ public class HttpHelper { public static void main(String[] args) throws JSONException{ JSONObject json = new JSONObject(); json.put("un", "bruce"); json.put("pwd", "123456"); //get request r = get("http://127.0.0.1:5000/index/user/1/m", json); System.out.println(r.status_code); System.out.println(r.text); //post json data String s = "{'sex': 'm', 'name': '', 'id': 1}"; JSONObject json2 = new JSONObject(s);
request r2 = post("http://127.0.0.1:5000/index/user/1/m", json2);
//post File String path = "/Users/jiezhou/Documents/test.py"; postFile("http://127.0.0.1:5000/fileupload", "temp.txt", "/Users/jiezhou/Documents/temp.txt"); } /** * 请求返回的对象 * @author jiezhou * */ public static class request{ //状态码 public int status_code; //返回数据 public String text; } private HttpHelper(){ } /** * 从服务器get 数据 * @param getUrl URL地址 * @param params JSONObject类型的数据格式 * @return request */ public static request get(String getUrl, JSONObject params){ request r = new request(); HttpURLConnection conn = null; try { //拼接参数 if (params != null) { String per = null; for (int i=0; i< params.names().length(); i++){ per = i == 0? "?" : "&"; getUrl += per + params.names().get(i).toString() + "=" + params.get(params.names().get(i).toString()); } } URL url = new URL(getUrl); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setReadTimeout(5000); conn.setConnectTimeout(10000); int status_code = conn.getResponseCode(); r.status_code = status_code; if (status_code == 200){ InputStream is = conn.getInputStream(); r.text = getStringFromInputStream(is); } } catch (Exception e) { } return r; } /** * post 数据 * @param getUrl URL地址 * @param params JSONObject类型的数据格式 * @return request */ public static request post(String getUrl, JSONObject params){ request r = new request(); HttpURLConnection conn = null; try { URL url = new URL(getUrl); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setReadTimeout(5000); conn.setConnectTimeout(10000); conn.setDoOutput(true);// 设置此方法,允许向服务器输出内容 // post请求的参数 String data = null; //拼接参数 if (params != null) { data = params.toString(); } // 获得一个输出流,向服务器写数据,默认情况下,系统不允许向服务器输出内容 OutputStream out = conn.getOutputStream();// 获得一个输出流,向服务器写数据 out.write(data.getBytes()); out.flush(); out.close(); int status_code = conn.getResponseCode(); r.status_code = status_code; if (status_code == 200){ InputStream is = conn.getInputStream(); r.text = getStringFromInputStream(is); } } catch (Exception e) { System.out.println(e.getMessage().toString()); } return r; } /** * post上传文件 * @param getUrl url 地址 * @param fileName 文件名 * @param filePath 文件路径 * @return request */ public static request postFile(String getUrl, String fileName, String filePath){ request r = new request(); HttpURLConnection conn = null; try { String end = "\r\n"; String twoHyphens = "--"; String boundary = "******"; // 定义数据分隔线 URL url = new URL(getUrl); conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true);// 设置此方法,允许向服务器输出内容 conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestMethod("POST"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setReadTimeout(5000); conn.setConnectTimeout(10000); conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); // post请求的参数 DataOutputStream ds = new DataOutputStream(conn.getOutputStream()); ds.writeBytes(twoHyphens + boundary + end); ds.writeBytes("Content-Disposition: form-data; " + "name=\"file\";filename=\"" + fileName + "\"" + end); ds.writeBytes(end); /* 取得文件的FileInputStream */ FileInputStream fStream = new FileInputStream(filePath); /* 设置每次写入1024bytes */ int bufferSize = 1024; byte[] buffer = new byte[bufferSize]; int length = -1; /* 从文件读取数据至缓冲区 */ while ((length = fStream.read(buffer)) != -1) { /* 将资料写入DataOutputStream中 */ ds.write(buffer, 0, length); } ds.writeBytes(end); ds.writeBytes(twoHyphens + boundary + twoHyphens + end); /* close streams */ fStream.close(); ds.flush(); int status_code = conn.getResponseCode(); r.status_code = status_code; if (status_code == 200){ InputStream is = conn.getInputStream(); r.text = getStringFromInputStream(is); } } catch (Exception e) { System.out.println(e.getMessage().toString()); } return r; } /** * 装换InputStream * @param is * @return * @throws IOException */ private static String getStringFromInputStream(InputStream is) throws IOException { ByteArrayOutputStream os = new ByteArrayOutputStream(); // 模板代码 必须熟练 byte[] buffer = new byte[1024]; int len = -1; // 一定要写len=is.read(buffer) // 如果while((is.read(buffer))!=-1)则无法将数据写入buffer中 while ((len = is.read(buffer)) != -1) { os.write(buffer, 0, len); } is.close(); String state = os.toString();// 把流中的数据转换成字符串,采用的编码是utf-8(模拟器默认编码) os.close(); return state; } }