Java开源简单实用的Http工具类详解编程语言

/** 
 * @file HttpUtil.java 
 *  
 * @brief  
 * HttpUtil is a single class containing methods to conveniently perform HTTP  
 * requests. HttpUtil only uses regular java io and net functionality and does  
 * not depend on external libraries.  
 * The class contains methods to perform a get, post, put, and delete request, 
 * and supports posting forms. Optionally, one can provide headers. 
 * 
 * Example usage: 
 *  
 *     // get 
 *     String res = HttpUtil.get("http://www.google.com"); 
 *  
 *     // post 
 *     String res = HttpUtil.post("http://sendmedata.com", "This is the data"); 
 * 
 *     // post form 
 *     Map<String, String> params = new HashMap<String, String>(); 
 *     params.put("firstname", "Joe"); 
 *     params.put("lastname", "Smith"); 
 *     params.put("age", "28"); 
 *     String res = HttpUtil.postForm("http://site.com/newuser", params); 
 * 
 *     // append query parameters to url 
 *     String url = "http://mydatabase.com/users"; 
 *     Map<String, String> params = new HashMap<String, String>(); 
 *     params.put("orderby", "name"); 
 *     params.put("limit", "10"); 
 *     String fullUrl = HttpUtil.appendQueryParams(url, params); 
 *     // fullUrl = "http://mydatabase.com/user?orderby=name&limit=10" 
 * 
 * @license 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 
 * use this file except in compliance with the License. You may obtain a copy  
 * of the License at 
 *  
 * http://www.apache.org/licenses/LICENSE-2.0 
 *  
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 
 * License for the specific language governing permissions and limitations under 
 * the License. 
 * 
 * Copyright (c) 2012 Almende B.V. 
 * 
 * @author  Jos de Jong, <[email protected]> 
 * @date      2012-05-14 
 */ 
  
package com.almende.util; 
  
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.net.URLDecoder; 
import java.net.URLEncoder; 
import java.util.HashMap; 
import java.util.Map; 
  
public class HttpUtil { 
    /** 
     * Send a get request 
     * @param url 
     * @return response 
     * @throws IOException  
     */ 
    static public String get(String url) throws IOException { 
        return get(url, null); 
    } 
  
    /** 
     * Send a get request 
     * @param url         Url as string 
     * @param headers     Optional map with headers 
     * @return response   Response as string 
     * @throws IOException  
     */ 
    static public String get(String url, 
            Map<String, String> headers) throws IOException { 
        return fetch("GET", url, null, headers); 
    } 
  
    /** 
     * Send a post request 
     * @param url         Url as string 
     * @param body        Request body as string 
     * @param headers     Optional map with headers 
     * @return response   Response as string 
     * @throws IOException  
     */ 
    static public String post(String url, String body, 
            Map<String, String> headers) throws IOException { 
        return fetch("POST", url, body, headers); 
    } 
  
    /** 
     * Send a post request 
     * @param url         Url as string 
     * @param body        Request body as string 
     * @return response   Response as string 
     * @throws IOException  
     */ 
    static public String post(String url, String body) throws IOException { 
        return post(url, body, null); 
    } 
  
    /** 
     * Post a form with parameters 
     * @param url         Url as string 
     * @param params      map with parameters/values 
     * @return response   Response as string 
     * @throws IOException  
     */ 
    static public String postForm(String url, Map<String, String> params)  
            throws IOException { 
        return postForm(url, params, null); 
    } 
  
    /** 
     * Post a form with parameters 
     * @param url         Url as string 
     * @param params      Map with parameters/values 
     * @param headers     Optional map with headers 
     * @return response   Response as string 
     * @throws IOException  
     */ 
    static public String postForm(String url, Map<String, String> params, 
            Map<String, String> headers) throws IOException { 
        // set content type 
        if (headers == null) { 
            headers = new HashMap<String, String>(); 
        } 
        headers.put("Content-Type", "application/x-www-form-urlencoded"); 
  
        // parse parameters 
        String body = ""; 
        if (params != null) { 
            boolean first = true; 
            for (String param : params.keySet()) { 
                if (first) { 
                    first = false; 
                } 
                else { 
                    body += "&"; 
                } 
                String value = params.get(param); 
                body += URLEncoder.encode(param, "UTF-8") + "="; 
                body += URLEncoder.encode(value, "UTF-8"); 
            } 
        } 
  
        return post(url, body, headers); 
    } 
  
    /** 
     * Send a put request 
     * @param url         Url as string 
     * @param body        Request body as string 
     * @param headers     Optional map with headers 
     * @return response   Response as string 
     * @throws IOException  
     */ 
    static public String put(String url, String body, 
            Map<String, String> headers) throws IOException { 
        return fetch("PUT", url, body, headers); 
    } 
  
    /** 
     * Send a put request 
     * @param url         Url as string 
     * @return response   Response as string 
     * @throws IOException  
     */ 
    static public String put(String url, String body) throws IOException { 
        return put(url, body, null); 
    } 
      
    /** 
     * Send a delete request 
     * @param url         Url as string 
     * @param headers     Optional map with headers 
     * @return response   Response as string 
     * @throws IOException  
     */ 
    static public String delete(String url, 
            Map<String, String> headers) throws IOException { 
        return fetch("DELETE", url, null, headers); 
    } 
      
    /** 
     * Send a delete request 
     * @param url         Url as string 
     * @return response   Response as string 
     * @throws IOException  
     */ 
    static public String delete(String url) throws IOException { 
        return delete(url, null); 
    } 
      
    /** 
     * Append query parameters to given url 
     * @param url         Url as string 
     * @param params      Map with query parameters 
     * @return url        Url with query parameters appended 
     * @throws IOException  
     */ 
    static public String appendQueryParams(String url,  
            Map<String, String> params) throws IOException { 
        String fullUrl = new String(url); 
          
        if (params != null) { 
            boolean first = (fullUrl.indexOf('?') == -1); 
            for (String param : params.keySet()) { 
                if (first) { 
                    fullUrl += '?'; 
                    first = false; 
                } 
                else { 
                    fullUrl += '&'; 
                } 
                String value = params.get(param); 
                fullUrl += URLEncoder.encode(param, "UTF-8") + '='; 
                fullUrl += URLEncoder.encode(value, "UTF-8"); 
            } 
        } 
          
        return fullUrl; 
    } 
      
    /** 
     * Retrieve the query parameters from given url 
     * @param url         Url containing query parameters 
     * @return params     Map with query parameters 
     * @throws IOException  
     */ 
    static public Map<String, String> getQueryParams(String url)  
            throws IOException { 
        Map<String, String> params = new HashMap<String, String>(); 
      
        int start = url.indexOf('?'); 
        while (start != -1) { 
            // read parameter name 
            int equals = url.indexOf('=', start); 
            String param = ""; 
            if (equals != -1) { 
                param = url.substring(start + 1, equals); 
            } 
            else { 
                param = url.substring(start + 1); 
            } 
              
            // read parameter value 
            String value = ""; 
            if (equals != -1) { 
                start = url.indexOf('&', equals); 
                if (start != -1) { 
                    value = url.substring(equals + 1, start); 
                } 
                else { 
                    value = url.substring(equals + 1); 
                } 
            } 
              
            params.put(URLDecoder.decode(param, "UTF-8"),  
                URLDecoder.decode(value, "UTF-8")); 
        } 
          
        return params; 
    } 
  
    /** 
     * Returns the url without query parameters 
     * @param url         Url containing query parameters 
     * @return url        Url without query parameters 
     * @throws IOException  
     */ 
    static public String removeQueryParams(String url)  
            throws IOException { 
        int q = url.indexOf('?'); 
        if (q != -1) { 
            return url.substring(0, q); 
        } 
        else { 
            return url; 
        } 
    } 
      
    /** 
     * Send a request 
     * @param method      HTTP method, for example "GET" or "POST" 
     * @param url         Url as string 
     * @param body        Request body as string 
     * @param headers     Optional map with headers 
     * @return response   Response as string 
     * @throws IOException  
     */ 
    static public String fetch(String method, String url, String body, 
            Map<String, String> headers) throws IOException { 
        // connection 
        URL u = new URL(url); 
        HttpURLConnection conn = (HttpURLConnection)u.openConnection(); 
        conn.setConnectTimeout(10000); 
        conn.setReadTimeout(10000); 
  
        // method 
        if (method != null) { 
            conn.setRequestMethod(method); 
        } 
  
        // headers 
        if (headers != null) { 
            for(String key : headers.keySet()) { 
                conn.addRequestProperty(key, headers.get(key)); 
            } 
        } 
  
        // body 
        if (body != null) { 
            conn.setDoOutput(true); 
            OutputStream os = conn.getOutputStream(); 
            os.write(body.getBytes()); 
            os.flush(); 
            os.close(); 
        } 
          
        // response 
        InputStream is = conn.getInputStream(); 
        String response = streamToString(is); 
        is.close(); 
          
        // handle redirects 
        if (conn.getResponseCode() == 301) { 
            String location = conn.getHeaderField("Location"); 
            return fetch(method, location, body, headers); 
        } 
          
        return response; 
    } 
      
    /** 
     * Read an input stream into a string 
     * @param in 
     * @return 
     * @throws IOException 
     */ 
    static public String streamToString(InputStream in) throws IOException { 
        StringBuffer out = new StringBuffer(); 
        byte[] b = new byte[4096]; 
        for (int n; (n = in.read(b)) != -1;) { 
            out.append(new String(b, 0, n)); 
        } 
        return out.toString(); 
    } 
}

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/10560.html

(0)
上一篇 2021年7月19日 10:20
下一篇 2021年7月19日 10:20

相关推荐

发表回复

登录后才能评论