Java 不使用外部库发送多部分POST数据
我的Android应用程序架构基于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
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());
看一看。我相信你会找到一些不必从头开始写的东西。。。