1.使用POST发送数据 java
以POST方式发送数据主要是为了向服务器发送较大量的客户端的数据,它不受URL的长度限制。POST请求将浏览器
数据以URL编码的形式放在HTTP正文中,字段形式为fieldname=value,用&分隔每一个字段。注意全部的字段都缓存
被做为字符串处理。实际上咱们要作的就是模拟浏览器POST 一个表单。如下是IE发送一个登录表单的POST请服务器
求:
POST http://127.0.0.1/login.do HTTP/1.0app
Accept: image/gif, image/jpeg, image/pjpeg, */*函数
Accept-Language: en-us,zh-cn;q=0.5post
Content-Type: application/x-www-form-urlencoded编码
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)url
Content-Length: 28
username=admin&password=1234
要在MIDP应用程序中模拟浏览器发送这个POST请求,首先设置HttpConnection的请求方式为POST:
hc.setRequestMethod(HttpConnection.POST);
而后构造出HTTP正文:
byte[] data = "username=admin&password=1234".getBytes();
并计算正文长度,填入Content-Type和Content-Length:
hc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");spa
hc.setRequestProperty("Content-Length", String.valueOf(data.length));
而后打开OutputStream将正文写入:
OutputStream output = hc.openOutputStream();
output.write(data);
须要注意的是,数据仍须要以URL编码格式编码,因为MIDP库中没有J2SE中与之对应的URLEncoder类,所以,
须要本身动手编写这个 encode()方法,能够参考java.net.URLEncoder.java的源码。剩下的即是读取服务器响
应,代码与GET一致,这里就再也不详述。
2.使用multipart/form-data发送文件
若是要在MIDP客户端向服务器上传文件,咱们就必须模拟一个POST multipart/form-data类型的请求,Content-
Type必须是multipart/form-data。
以multipart/form-data编码的POST请求格式与application/x-www-form-urlencoded彻底不一样,multipart/form-
data须要首先在HTTP请求头设置一个分隔符,例如ABCD:
hc.setRequestProperty("Content-Type", "multipart/form-data; boundary=ABCD");
而后,将每一个字段用“--分隔符”分隔,最后一个“--分隔符--”表示结束。例如,要上传一个title字段"Today"和一
个文件C:\1.txt,HTTP正文以下:
--ABCD
Content-Disposition: form-data; name="title"
\r\n
Today
--ABCD
Content-Disposition: form-data; name="1.txt"; filename="C:\1.txt"
Content-Type: text/plain
\r\n
<这里是1.txt文件的内容>
--ABCD--
\r\n
3.使用post请求上传文件:模拟一个POST multipart/form-data类型的请求的例子
/*打开url链接 * 此处的urlConnection对象其实是根据URL的 请求协议(此处是http)生成的URLConnection类 * 的子类HttpURLConnection,故此处最好将其转化为HttpURLConnection类型的对象, * 以便用到HttpURLConnection更多的API*/ HttpURLConnection httpURLConnection = (HttpURLConnection) url .openConnection(); /*http头 * 设置每次传输的流大小,能够有效防止手机由于内存不足崩溃,此方法用于在预先不知道内容长度时启用, * 没有进行内部缓冲的 HTTP 请求正文的流。*/ httpURLConnection.setChunkedStreamingMode(128 * 1024);// 128K // 容许输入输出流 httpURLConnection.setDoInput(true);// 设置是否从httpUrlConnection读入,默认状况下是true /*设置是否向httpUrlConnection输出,由于这个是post请求,参数要放在 http正文内,所以须要设为true, 默认状况下是false*/ httpURLConnection.setDoOutput(true); // Post 请求不能使用缓存 httpURLConnection.setUseCaches(false);//没有进行内部缓冲 // 设定请求的方法为"POST",默认是GET httpURLConnection.setRequestMethod("POST"); httpURLConnection.setRequestProperty("Connection", "Keep-Alive"); httpURLConnection.setRequestProperty("Charset", "UTF-8"); //首先在HTTP请求头设置一个分隔符***** httpURLConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); //httpURLConnection.connect(); // 链接 /*http请求的正文,正文的内容是经过outputStream流写入的 * 此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法, 因此在开发中不调用上述的connect()也能够)。*/ DataOutputStream dos = new DataOutputStream( httpURLConnection.getOutputStream()); //每一个字段用“--”分隔 dos.writeBytes(twoHyphens + boundary + end); /*srcPath.substring(srcPath.lastIndexOf("/") + 1):表示文件名字 * */ dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"" + srcPath.substring(srcPath.lastIndexOf("/") + 1) + "\"" + end); dos.writeBytes(end); //上传的文件的内容 FileInputStream fis = new FileInputStream(srcPath); byte[] buffer = new byte[8192]; // 8k int count = 0; // 读取文件 while ((count = fis.read(buffer)) != -1){ dos.write(buffer, 0, count); } fis.close(); dos.writeBytes(end); dos.writeBytes(twoHyphens + boundary + twoHyphens + end); dos.flush(); // 在调用下边的getInputStream()函数时才将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。 InputStream is = httpURLConnection.getInputStream(); //至此,http请求已经被发送到服务器 InputStreamReader isr = new InputStreamReader(is, "utf-8"); BufferedReader br = new BufferedReader(isr); //BufferedReader br = new BufferedReader(new InputStreamReader // (httpURLConnection.getInputStream(),"utf-8")); /*获取返回结果. * 在getInputStream()函数调用的时候,就会把准备好的http请求 正式发送到服务器了, * 而后返回一个输入流,用于读取服务器对于这次http请求的返回信息。*/ String result = br.readLine(); Toast.makeText(c, result, Toast.LENGTH_SHORT).show(); dos.close(); is.close();