美文网首页
使用HttpClient实现文件上传

使用HttpClient实现文件上传

作者: 小灰灰_加油 | 来源:发表于2018-05-13 20:41 被阅读0次
    package com.pinyougou.httpclient.login;
    
    import org.apache.commons.httpclient.Cookie;
    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.NameValuePair;
    import org.apache.commons.httpclient.cookie.CookiePolicy;
    import org.apache.commons.httpclient.methods.GetMethod;
    import org.apache.commons.httpclient.methods.PostMethod;
    import org.apache.http.HttpEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.mime.MultipartEntityBuilder;
    import org.apache.http.entity.mime.content.FileBody;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.util.EntityUtils;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by xiaohuihui on 2018-05-12
     */
    
    
    public static void main(String[] args) {
        String respStr = null;
    
        // 1. 登录pinyougou,同时存入cookie
    //  HttpClient httpClient = getCookie("http://localhost:9102/login");
        TestHttpClient testHttpClient = new TestHttpClient();
        CloseableHttpClient httpClient = null;
        try {
            httpClient = testHttpClient.testLogin();
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        // 2. 使用HttpClient完成文件上传
    //        String afterLoginUrl = "http://localhost:9102/itemCat/findByParentId.do?parentId=1";
    //        afterLogin(httpClient, afterLoginUrl);
    
        // 3. 使用HttpClient完成文件上传
        String uploadUrl = "http://localhost:9102/upload.do";
        HttpPost httpPost = new HttpPost(uploadUrl);
        FileBody fileBody = new FileBody(new File("C:/Users/Administrator/Desktop/timg.jpg"));
        MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
        multipartEntityBuilder.addPart("file",fileBody);
    
        // 设置其他参数
        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
        nvps.add(new NameValuePair("Accept","application/json, text/plain, */*"));
        nvps.add(new NameValuePair("Accept-Encoding","gzip, deflate, br"));
        nvps.add(new NameValuePair("Accept-Language","zh-CN,zh;q=0.9"));
        nvps.add(new NameValuePair("Connection","keep-alive"));
        nvps.add(new NameValuePair("Content-Length","28700"));
        nvps.add(new NameValuePair("Content-Type","multipart/form-data; boundary=----WebKitFormBoundarypaEfQmIQBbUrkI0c"));
        nvps.add(new NameValuePair("Host","localhost:9102"));
        nvps.add(new NameValuePair("Origin","http://localhost:9102"));
        nvps.add(new NameValuePair("Referer","http://localhost:9102/admin/goods_edit.html"));
        nvps.add(new NameValuePair("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36"));
    
        HttpEntity reqEntity  = multipartEntityBuilder.build();
        httpPost.setEntity(reqEntity);
    
        try {
            CloseableHttpResponse response = httpClient.execute(httpPost);
            System.out.println("上传之后返回的状态码:"+response.getStatusLine().getStatusCode());
            try {
                HttpEntity resEntity = response.getEntity();
                respStr = getRespString(resEntity);
                EntityUtils.consume(reqEntity);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
              response.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        System.out.println("resp=" + respStr);
    
    
    }
    
    
    /**
     * 将返回结果转化为String
     *
     * @param entity
     * @return
     * @throws Exception
     */
    private static String getRespString(HttpEntity entity) throws Exception {
        if (entity == null) {
            return null;
        }
        InputStream is = entity.getContent();
        StringBuffer strBuf = new StringBuffer();
        byte[] buffer = new byte[4096];
        int r = 0;
        while ((r = is.read(buffer)) > 0) {
            strBuf.append(new String(buffer, 0, r, "UTF-8"));
        }
        return strBuf.toString();
    }
    
    /**
     * 登陆后检测
     *
     * @param httpClient
     * @param afterLoginUrl
     */
    private static void afterLogin(HttpClient httpClient, String afterLoginUrl) {
        // 进行登录后的操作
        GetMethod getMethod = new GetMethod(afterLoginUrl);
        try {
            httpClient.executeMethod(getMethod);
            // 打印出返回数据,检验一下是否成功
            String responseText = getMethod.getResponseBodyAsString();
            System.out.println(responseText);
    
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    
    /**
     * 使用HttpClient进行登录同时返回带有cookie信息的HttpClient对象
     * @param loginUrl
     * @return
     */
    private static HttpClient getCookie(String loginUrl) {
    
    //        String loginUrl = "http://localhost:9102/login";
    
        HttpClient httpClient = new HttpClient();
        // 使用post方式进行登录
        PostMethod postMethod = new PostMethod(loginUrl);
        // 设置登录信息
        NameValuePair[] data = {
                new NameValuePair("username", "wangyi"), new NameValuePair("password", "123456"),
                new NameValuePair("m1", "2")
        };
    
        postMethod.setRequestBody(data);
    
        // 设置 HttpClient 接收 Cookie,用与浏览器一样的策略
        httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
        try {
            httpClient.executeMethod(postMethod);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 获得登陆后的 Cookie
        Cookie[] cookies = httpClient.getState().getCookies();
        StringBuffer tmpcookies = new StringBuffer();
        for (Cookie c : cookies) {
            tmpcookies.append(c.toString() + ";");
        }
    
        return httpClient;
    }
    
    }
    

    HttpClient4.x可以自带维持会话功能,只要使用同一个HttpClient且未关闭连接,则可以使用相同会话来访问其他要求登录验证的服务(见TestLogin()方法中的“执行get请求”部分)。
    如果需要使用HttpClient池,并且想要做到一次登录的会话供多个HttpClient连接使用,就需要自己保存会话信息。因为客户端的会话信息是保存在cookie中的(JSESSIONID),所以只需要将登录成功返回的cookie复制到各个HttpClient使用即可。
    使用Cookie的方法有两种,可以自己使用CookieStore来保存(见TestCookieStore()方法),也可以通过HttpClientContext上下文来维持(见TestContext()方法)。
    附带HttpClient4.3示例代码 http://www.myexception.cn/program/1459749.html

    package com.pinyougou.httpclient.login;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    
    import org.apache.http.HeaderIterator;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.ParseException;
    import org.apache.http.client.CookieStore;
    import org.apache.http.client.config.CookieSpecs;
    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.protocol.HttpClientContext;
    import org.apache.http.config.Registry;
    import org.apache.http.config.RegistryBuilder;
    import org.apache.http.cookie.CookieSpecProvider;
    import org.apache.http.impl.client.BasicCookieStore;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.impl.cookie.BasicClientCookie;
    import org.apache.http.impl.cookie.BestMatchSpecFactory;
    import org.apache.http.impl.cookie.BrowserCompatSpecFactory;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import org.junit.Test;
    
    /**
     * Created by xiaohuihui on 2018-05-12
     */
    public class TestHttpClient {
    // 创建CookieStore实例
    static CookieStore cookieStore = null;
    static HttpClientContext context = null;
    String loginUrl = "http://localhost:9102/login";
    String testUrl = "http://localhost:9102/itemCat/findByParentId.do?parentId=1";
    String loginErrorUrl = "http://localhost:9102/login";
    
    public CloseableHttpClient testLogin() throws Exception {
        System.out.println("----testLogin");
    
        // // 创建HttpClientBuilder
        // HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        // // HttpClient
        // CloseableHttpClient client = httpClientBuilder.build();
        // 直接创建client
        CloseableHttpClient client = HttpClients.createDefault();
    
        HttpPost httpPost = new HttpPost(loginUrl);
        Map parameterMap = new HashMap();
        parameterMap.put("username", "wangyi");
        parameterMap.put("password", "123456");
        UrlEncodedFormEntity postEntity = new UrlEncodedFormEntity(
                getParam(parameterMap), "UTF-8");
        httpPost.setEntity(postEntity);
        System.out.println("request line:" + httpPost.getRequestLine());
        try {
            // 执行post请求
            HttpResponse httpResponse = client.execute(httpPost);
            String location = httpResponse.getFirstHeader("Location")
                    .getValue();
            if (location != null && location.startsWith(loginErrorUrl)) {
                System.out.println("----loginError");
            }
            printResponse(httpResponse);
    
            // 执行get请求
            System.out.println("----the same client");
            HttpGet httpGet = new HttpGet(testUrl);
            System.out.println("request line:" + httpGet.getRequestLine());
            HttpResponse httpResponse1 = client.execute(httpGet);
            printResponse(httpResponse1);
    
    
            // cookie store
            setCookieStore(httpResponse);
            // context
            setContext();
            return client;
    
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    //        finally {
    //            try {
    //                // 关闭流并释放资源
    //                client.close();
    //            } catch (IOException e) {
    //                e.printStackTrace();
    //            }
    //        }
    }
    
    @Test
    public void testContext() throws Exception {
        System.out.println("----testContext");
        // 使用context方式
        CloseableHttpClient client = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(testUrl);
        System.out.println("request line:" + httpGet.getRequestLine());
        try {
            // 执行get请求
            HttpResponse httpResponse = client.execute(httpGet, context);
            printResponse(httpResponse);
            System.out.println("context cookies:"
                    + context.getCookieStore().getCookies());
            printResponse(httpResponse);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭流并释放资源
                client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    @Test
    public void testCookieStore() throws Exception {
        System.out.println("----testCookieStore");
        // 使用cookieStore方式
        CloseableHttpClient client = HttpClients.custom()
                .setDefaultCookieStore(cookieStore).build();
        HttpGet httpGet = new HttpGet(testUrl);
        System.out.println("request line:" + httpGet.getRequestLine());
        try {
            // 执行get请求
            HttpResponse httpResponse = client.execute(httpGet);
            System.out.println("cookie store:" + cookieStore.getCookies());
            printResponse(httpResponse);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭流并释放资源
                client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void printResponse(HttpResponse httpResponse)
            throws ParseException, IOException {
        // 获取响应消息实体
        HttpEntity entity = httpResponse.getEntity();
        // 响应状态
        System.out.println("status:" + httpResponse.getStatusLine());
        System.out.println("headers:");
        HeaderIterator iterator = httpResponse.headerIterator();
        while (iterator.hasNext()) {
            System.out.println("\t" + iterator.next());
        }
        // 判断响应实体是否为空
        if (entity != null) {
            String responseString = EntityUtils.toString(entity);
            System.out.println("response length:" + responseString.length());
            System.out.println("response content:"
                    + responseString.replace("\r\n", ""));
        }
    }
    
    public static void setContext() {
        System.out.println("----setContext");
        context = HttpClientContext.create();
        Registry<CookieSpecProvider> registry = RegistryBuilder
                .<CookieSpecProvider>create()
                .register(CookieSpecs.BEST_MATCH, new BestMatchSpecFactory())
                .register(CookieSpecs.BROWSER_COMPATIBILITY,
                        new BrowserCompatSpecFactory()).build();
        context.setCookieSpecRegistry(registry);
        context.setCookieStore(cookieStore);
    }
    
    public static void setCookieStore(HttpResponse httpResponse) {
        System.out.println("----setCookieStore");
        cookieStore = new BasicCookieStore();
        // JSESSIONID
        String setCookie = httpResponse.getFirstHeader("Set-Cookie")
                .getValue();
        String JSESSIONID = setCookie.substring("JSESSIONID=".length(),
                setCookie.indexOf(";"));
        System.out.println("JSESSIONID:" + JSESSIONID);
        // 新建一个Cookie
        BasicClientCookie cookie = new BasicClientCookie("JSESSIONID",
                JSESSIONID);
        cookie.setVersion(0);
        cookie.setDomain("127.0.0.1");
        cookie.setPath("/CwlProClient");
        // cookie.setAttribute(ClientCookie.VERSION_ATTR, "0");
        // cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "127.0.0.1");
        // cookie.setAttribute(ClientCookie.PORT_ATTR, "8080");
        // cookie.setAttribute(ClientCookie.PATH_ATTR, "/CwlProWeb");
        cookieStore.addCookie(cookie);
    }
    
    public static List<NameValuePair> getParam(Map parameterMap) {
        List<NameValuePair> param = new ArrayList<NameValuePair>();
        Iterator it = parameterMap.entrySet().iterator();
        while (it.hasNext()) {
            Entry parmEntry = (Entry) it.next();
            param.add(new BasicNameValuePair((String) parmEntry.getKey(),
                    (String) parmEntry.getValue()));
        }
        return param;
    }
    
    
    }
    

    相关文章

      网友评论

          本文标题:使用HttpClient实现文件上传

          本文链接:https://www.haomeiwen.com/subject/pafrdftx.html