Java開源簡單實用的Http工具類

jopen 10年前發布 | 2K 次閱讀 Java

/**

  • @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&quot;, params); *
  • // append query parameters to url
  • String url = "http://mydatabase.com/users&quot;;
  • 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&quot; *
  • @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, <jos@almende.org>
  • @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();
}

}</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!