Java 不使用外部库发送多部分POST数据

Java 不使用外部库发送多部分POST数据,java,android,httpurlconnection,apache-httpclient-4.x,Java,Android,Httpurlconnection,Apache Httpclient 4.x,我的Android应用程序架构基于DefaultHttpClient。大约两天前,我得知他们正在改进HttpURLConnection,我打算改变整个体系结构来使用它,但似乎代码重写太多了,所以我坚持使用DefaultHttpClient 现在我必须上传一个多部分实体,我一直在阅读关于从Apache添加一个名为mime的外部库的文章,该库恰好被弃用 我的问题是,有没有一种方法可以使用Android或JavaSDK发送multipart实体?因为如果没有,我想我会把它全部改成HttpURLConn

我的Android应用程序架构基于
DefaultHttpClient
。大约两天前,我得知他们正在改进
HttpURLConnection
,我打算改变整个体系结构来使用它,但似乎代码重写太多了,所以我坚持使用
DefaultHttpClient

现在我必须上传一个
多部分
实体,我一直在阅读关于从
Apache
添加一个名为
mime
的外部库的文章,该库恰好被弃用


我的问题是,有没有一种方法可以使用
Android
Java
SDK
发送
multipart
实体?因为如果没有,我想我会把它全部改成
HttpURLConnection

你可以试试我为我的项目编写的一些类。multipart form类是一个非常简单的实现,但是它应该可以很容易地进行黑客攻击,以适应发送数据数组或任何您需要的内容

/**
 * Used to provide an interface for sending post data of various types.
 */
public interface PostData {
    /**
     * Add the specified field to the post data.
     *
     * @param name The name or title of the field.
     * @param value The value of the field.
     * @return This object (for streamed programming)
     */
    public PostData addField(String name, String value);
    /**
     * End the data.
     */
    public PostData end();

    public String getContentType();
    public String toString();
    public int getLength();
}


/**
 * Generate a multi-part form to post data.
 */
public static class MultiPartForm implements PostData {
    private final static String boundary = "AaBbC0xQrpqqqqqqqq";
    private StringBuilder sb = new StringBuilder();

    public PostData addField(String name, String value) {
        sb.append("--")
            .append(boundary)
            .append("\nContent-Disposition: form-data; name='")
            .append(name)
            .append("'\n\n")
            .append(value)
            .append("\n");
        return this;
    }

    public PostData end() {
        sb.append("--").append(boundary).append("--");
        return this;
    }

    public final String getContentType() {
        return "multipart/form-data;boundary=" + boundary;
    }

    public String toString() {
        return sb.toString();
    }

    public int getLength() {
        return sb.length();
    }
}


/**
 * Creates URL encoded data.
 * Does not include the question mark at the beginning of the string.
 */
public static class UrlEncodedData implements PostData {
    private StringBuilder sb = new StringBuilder();

    public PostData addField(String name, String value) {
        if (sb.length() > 0) {
            sb.append("&");
        }
        try {
            sb.append(URLEncoder.encode(name, "UTF-8"))
                .append("=")
                .append(URLEncoder.encode(value, "UTF-8"));
        // Shouldn't ever happen.
        } catch (java.io.UnsupportedEncodingException e) {}
        return this;
    }

    public PostData end() {
        return this;
    }

    public final String getContentType() {
        return "application/x-www-form-urlencoded";
    }

    public String toString() {
        return sb.toString();
    }

    public int getLength() {
        return sb.length();
    }
}
除此之外,我还创建了一个方法,使检索数据变得更简单。我将HttpURLConnection与此方法结合使用,但要获得如何使用DefaultHttpClient执行相同操作的要点应该非常简单。请注意,它是同步的,因此您必须在另一个线程中调用它:

/**
 * Loads a specified URL with the params incoded in the post.
 * 
 * @throws Exception For numerous reasons.
 * @param url The base URL to connect to.
 * @param data A PostData object to fetch. Specifiy null for a GET request.
 * @return The result.
 */
public static String loadUrl(final String url, final PostData data)
        throws Exception {
    HttpURLConnection urlConnection = null;
    BufferedReader br = null;
    final StringBuilder result = new StringBuilder();

    try {
        urlConnection = (HttpURLConnection)new URL(url).openConnection();

        if (data != null) {
            urlConnection.setRequestMethod("POST");;
            urlConnection.setRequestProperty("Content-Type", data.getContentType());
            urlConnection.setRequestProperty("Content-Length",
                Integer.toString(data.getLength()));
            urlConnection.setDoOutput(true);

            DataOutputStream dos = new DataOutputStream(
                urlConnection.getOutputStream());
            dos.writeBytes(data.toString());
            dos.flush();
            dos.close();

            urlConnection.connect();
        }

        br = new BufferedReader(
            new InputStreamReader(urlConnection.getInputStream()));

        String line;
        while ((line = br.readLine()) != null) {
            result.append(line);
        }
    } finally {
        try { urlConnection.disconnect(); } catch (Exception e) {}
        try { br.close(); } catch (Exception e) {}
    }

    return result.toString();
}
用法非常简单:

Utils.loadUrl("someApi.com/foobar/"
    new Utils.MultiPartForm()
        .addField("first_name", "John")
        .addField("last_name", "Doe")
        .end());
看一看。我相信你会找到一些不必从头开始写的东西。。。