Java模拟http请求的方法很多,一般使用功能强大apache http client,能够方便为我们做很多事情,不过它基于很深层的封装,也有其复杂之处。

        这里演示一个Java原生方法http请求代码示例,个人感觉很清晰和小巧,作为记忆留存。

public class HttpClient {
 /**
  * @param args
  */
 public static void main(String[] args) {
  try {
   //需要放入请求流中的字符串
   String s = "123=ABCD你好hello流";
   System.out.println(s);
   
   //从这里开始起http请求
   //构造节点流
   ByteArrayInputStream in = new ByteArrayInputStream(
     s.getBytes("utf-8"));
   URL url = new URL("http://eim.soyoung.com.cn/sys/wechat");
   //openConnection打开连接,此处并没有真正开始请求
   URLConnection urlConnection = url.openConnection();
   //将URLConnection对象转化为HttpURLConnection对象
   HttpURLConnection httpUrlConnection = (HttpURLConnection) urlConnection;
   //设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在流里,需要设置为true,默认false
   httpUrlConnection.setDoInput(true);
   //设置是否从httpUrlConnection读入(response内容),默认true
   httpUrlConnection.setDoOutput(true);
   //Post 请求不能使用缓存
   httpUrlConnection.setUseCaches(false);   
   httpUrlConnection.setConnectTimeout(5000);
   // 设置request headers属性,Content-type属性很重要,服务器端根据这个值来处理消息内容,可自定义扩展;对应的还有一个Content-length,如果不清楚则不要填写
   httpUrlConnection.setRequestProperty("Content-type","application/json");
   //请求类型POST或GET,默认是GET   
   httpUrlConnection.setRequestMethod("POST");
   
   // 连接,从上述url.openConnection()至此的配置必须要在connect之前完成
   httpUrlConnection.connect();
   //打开http流管道,写入数据(post给服务器端的数据)。此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,所以在开发中不调用上述的connect()也可以)
   OutputStream outStrm = httpUrlConnection.getOutputStream();
   //写入数据流的方法
   int count = 0;
   byte[] buffer = new byte[1024];
   while ((count = in.read(buffer)) != -1) {
    outStrm.write(buffer, 0, count);
   }
   outStrm.flush();
   outStrm.close();
   //<===注意,实际发送请求的代码段就在这里,将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端
   InputStream inStrm = httpUrlConnection.getInputStream();

   //再次实用节点流,接收response回来的信息
   ByteArrayOutputStream outStream = new ByteArrayOutputStream();
   byte[] retdata = new byte[1024];
   int c = -1;
   while ((c = inStrm.read(retdata, 0, 1024)) != -1)
    outStream.write(retdata, 0, c);
   outStream.flush();
   outStream.close();
   retdata = null;
   String rets = new String(outStream.toByteArray(), "utf-8");
   System.out.println("=============================inStrm:" + rets);
   if (httpUrlConnection.getResponseCode() == 200) {
    System.out.println("ok");
   } else {
    System.out.println("fail");
   }
  } catch (MalformedURLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ProtocolException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }