http-client學習心得

先上代碼

服務器端

package com.yan.intf.helloworld.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sun.org.apache.bcel.internal.generic.NEW;

public class HelloWorldServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public HelloWorldServlet() {
		super();
	}


	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}


	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request , response);
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String requestXml = request.getParameter("requestXml");
        java.io.ObjectInputStream oi = null;
        java.io.ObjectOutputStream ot = null;
        System.out.println("server:\n"+requestXml);
        try
        {
            oi = new java.io.ObjectInputStream(request.getInputStream());
            Object o = oi.readObject();
            System.out.println("server:\n"+o.toString());
            
            oi.close();
            oi = null;

            String outObj = requestXml + o.toString();
            ot = new java.io.ObjectOutputStream(response.getOutputStream());
            ot.writeObject(outObj);
            ot.flush();
            ot.close();
            ot = null;
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if (oi != null)
                {
                    oi.close();
                    oi = null;
                }
                if (ot != null)
                {
                    ot.close();
                    ot = null;
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
	}

	public void init() throws ServletException {
		// Put your code here
	}

}

客戶端

package test;


import java.io.IOException;
import java.io.Serializable;
import java.util.Date;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;

import com.yan.intf.helloworld.common.XmlDtoUtil;
import com.yan.intf.helloworld.dto.BizMainDto;
import com.yan.intf.helloworld.dto.RequestBodyDto;
import com.yan.intf.helloworld.dto.RequestDto;
import com.yan.intf.helloworld.dto.RequestHeadDto;

public class MyTest {
	public static void main(String[] args) throws IOException, ClassNotFoundException
    {
		RequestDto requestDto = new RequestDto();
		RequestHeadDto requestHeadDto = new RequestHeadDto();
		requestHeadDto.setRequest_type("01010001");
		requestHeadDto.setServer_version("1.0");
		requestHeadDto.setSender("yan");
		requestHeadDto.setPassworld("123456");
		requestHeadDto.setFlowintime(new Date());
		requestHeadDto.setUuid("11111111");

		RequestBodyDto requestBodyDto = new RequestBodyDto();
		BizMainDto bizMainDto = new BizMainDto();
		bizMainDto.setBizNo("0001");
		bizMainDto.setBizName("費率");
		bizMainDto.setOperater("yan");
		bizMainDto.setBizValue("0.03");
		requestBodyDto.setBizMainDto(bizMainDto);
		
		requestDto.setRequestHeadDto(requestHeadDto);
		requestDto.setRequestBodyDto(requestBodyDto);
		
		String requestXml = XmlDtoUtil.dtoToXml(requestDto);
		
		
		String url = "http://localhost:8090/ws/servlet/HelloWorldServlet";
        String queryString = "requestXml=hello";
        String inputObj = requestXml;
        Serializable s = getObjFromServer(url, queryString, inputObj);
        System.out.println(s.toString());
    }
    /**
     * @param url
     * @param queryString 類似a=b&c=d 形式的參數
     *
     * @param inputObj   發送到服務器的對象。
     *    
     * @return 服務器返回到客戶端的對象。
     * @throws IOException
     */
    public static Serializable getObjFromServer(String url, String queryString, Serializable inputObj) throws IOException
    {
        HttpClient client = new HttpClient();
        PostMethod post = new PostMethod(url);
        post.setQueryString(queryString);
        post.setRequestHeader("Content-Type", "application/octet-stream");
        java.io.ByteArrayOutputStream bOut = new java.io.ByteArrayOutputStream(1024);
        java.io.ByteArrayInputStream bInput = null;
        java.io.ObjectOutputStream out = null;
        Serializable returnObj = null;
        try
        {
            out = new java.io.ObjectOutputStream(bOut);
            out.writeObject(inputObj);
            out.flush();
            out.close();
            out = null;
            bInput = new java.io.ByteArrayInputStream(bOut.toByteArray());
            RequestEntity re = new InputStreamRequestEntity(bInput);
            post.setRequestEntity(re);
            client.executeMethod(post);
            java.io.InputStream in = post.getResponseBodyAsStream();
            java.io.ObjectInputStream oInput = new java.io.ObjectInputStream(in);
            returnObj = (Serializable) oInput.readObject();
            oInput.close();
            oInput = null;
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (ClassNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally
        {
            if (out != null)
            {
                out.close();
                out = null;
            }
            if (bInput != null)
            {
                bInput.close();
                bInput = null;
            }
            //釋放連接
            post.releaseConnection();
        }
        return returnObj;
    }
}


客戶端代碼中

String queryString = "requestXml=hello";

post.setQueryString(queryString);

這中方式是將參數以get的方式傳給服務器端。

get方式穿參數會有長度限制,url的長度超過255的會報錯,org.apache.commons.httpclient.URIException: Invalid query


java.io.ByteArrayOutputStream bOut = new java.io.ByteArrayOutputStream(1024);

java.io.ObjectOutputStream out = null;

out = new java.io.ObjectOutputStream(bOut);
out.writeObject(inputObj);
out.flush();
out.close();
這種方式是以post的方式穿參數給服務器端。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章