Android中发送Http请求实例

Android中发送Http请求实例(包括文件上传、servlet接收)

http, post, 上传文件
本帖最后由 xinke7hao 于 2010-6-12 13:43 编辑


前天开始要准备实现手机端往服务器传参数,还要能传附件,找了不少文章和资料,现在总结一下分享分享:代码中的catch什么的就省略了,尝试了图片、txt、xml是没问题的.. 各位 尽情拍砖吧。

发完发现代码部分的格式……这个编辑器不太会用,怎么感觉把换行都去掉了,处理好换行缩进也……

首先我是写了个java工程测试发送post请求:可以包含文本参数和文件参数****************************************************

/** 
* 通过http协议提交数据到服务端,实现表单提交功能,包括上传文件 
* @param actionUrl 上传路径 
* @param params 请求参数 key为参数名,value为参数值 
* @param file 上传文件 
*/ 
public static void postMultiParams(String actionUrl, Map<String, String> params, FormBean[] files) { 
try { 
PostMethod post = new PostMethod(actionUrl); 
List<art> formParams = new ArrayList<art>(); 
for(Map.Entry<String, String> entry : params.entrySet()){ 
formParams.add(new StringPart(entry.getKey(), entry.getValue())); 
} 

if(files!=null) 
for(FormBean file : files){ 
//filename为在服务端接收时希望保存成的文件名,filepath是本地文件路径(包括了源文件名),filebean中就包含了这俩属性 
formParams.add(new FilePart("file", file.getFilename(), new File(file.getFilepath()))); 
} 

Part[] parts = new Part[formParams.size()]; 
Iterator<art> pit = formParams.iterator(); 
int i=0; 

while(pit.hasNext()){ 
parts[i++] = pit.next(); 
} 
//如果出现乱码可以尝试一下方式 
//StringPart sp = new StringPart("TEXT", "testValue", "GB2312");  
//FilePart fp = new FilePart("file", "test.txt", new File("./temp/test.txt"), null, "GB2312" 
//postMethod.getParams().setContentCharset("GB2312"); 

MultipartRequestEntity mrp = new MultipartRequestEntity(parts, post.getParams()); 
post.setRequestEntity(mrp); 

//execute post method 
HttpClient client = new HttpClient(); 
int code = client.executeMethod(post); 
System.out.println(code); 
} catch ... 
} 
复制代码 

通过以上代码可以成功的模拟java客户端发送post请求,服务端也能接收并保存文件 
java端测试的main方法: 
public static void main(String[] args){ 
String actionUrl = "http://192.168.0.123:8080/WSserver/androidUploadServlet"; 
Map<String, String> strParams = new HashMap<String, String>(); 
strParams.put("paramOne", "valueOne"); 
strParams.put("paramTwo", "valueTwo"); 
FormBean[] files = new FormBean[]{new FormBean("dest1.xml", "F:/testpostsrc/main.xml")}; 
HttpTool.postMultiParams(actionUrl,strParams,files); 
} 
复制代码 

本以为大功告成了,结果一移植到android工程中,编译是没有问题的。 
但是运行时抛了异常 先是说找不到PostMethod类,org.apache.commons.httpclient.methods.PostMethod这个类绝对是有包含的; 
还有个异常就是VerifyError。 开发中有几次碰到这个异常都束手无策,觉得是SDK不兼容还是怎么地,哪位知道可得跟我说说~~ 
于是看网上有直接分析http request的内容构建post请求的,也有找到带上传文件的,拿下来运行老是有些问题,便直接通过运行上面的java工程发送的post请求,在servlet中打印出请求内容,然后对照着拼接字符串和流终于给实现了!代码如下: 
*********************************************************** 
/** 
* 通过拼接的方式构造请求内容,实现参数传输以及文件传输 
* @param actionUrl 
* @param params 
* @param files 
* @return 
* @throws IOException 
*/ 
public static String post(String actionUrl, Map<String, String> params, 
Map<String, File> files) throws IOException { 

String BOUNDARY = java.util.UUID.randomUUID().toString(); 
String PREFIX = "--" , LINEND = "\r\n"; 
String MULTIPART_FROM_DATA = "multipart/form-data"; 
String CHARSET = "UTF-8"; 

URL uri = new URL(actionUrl); 
HttpURLConnection conn = (HttpURLConnection) uri.openConnection(); 
conn.setReadTimeout(5 * 1000); // 缓存的最长时间 
conn.setDoInput(true);// 允许输入 
conn.setDoOutput(true);// 允许输出 
conn.setUseCaches(false); // 不允许使用缓存 
conn.setRequestMethod("POST"); 
conn.setRequestProperty("connection", "keep-alive"); 
conn.setRequestProperty("Charsert", "UTF-8"); 
conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY); 

// 首先组拼文本类型的参数 
StringBuilder sb = new StringBuilder(); 
for (Map.Entry<String, String> entry : params.entrySet()) { 
sb.append(PREFIX); 
sb.append(BOUNDARY); 
sb.append(LINEND); 
sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND); 
sb.append("Content-Type: text/plain; charset=" + CHARSET+LINEND); 
sb.append("Content-Transfer-Encoding: 8bit" + LINEND); 
sb.append(LINEND); 
sb.append(entry.getValue()); 
sb.append(LINEND); 
} 

DataOutputStream outStream = new DataOutputStream(conn.getOutputStream()); 
outStream.write(sb.toString().getBytes()); 
// 发送文件数据 
if(files!=null) 
for (Map.Entry<String, File> file: files.entrySet()) { 
StringBuilder sb1 = new StringBuilder(); 
sb1.append(PREFIX); 
sb1.append(BOUNDARY); 
sb1.append(LINEND); 
sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\""+file.getKey()+"\""+LINEND); 
sb1.append("Content-Type: application/octet-stream; charset="+CHARSET+LINEND); 
sb1.append(LINEND); 
outStream.write(sb1.toString().getBytes()); 

InputStream is = new FileInputStream(file.getValue()); 
byte[] buffer = new byte[1024]; 
int len = 0; 
while ((len = is.read(buffer)) != -1) { 
outStream.write(buffer, 0, len); 
} 

is.close(); 
outStream.write(LINEND.getBytes()); 
} 

//请求结束标志 
byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes(); 
outStream.write(end_data); 
outStream.flush(); 
// 得到响应码 
int res = conn.getResponseCode(); 
if (res == 200) { 
InputStream in = conn.getInputStream(); 
int ch; 
StringBuilder sb2 = new StringBuilder(); 
while ((ch = in.read()) != -1) { 
sb2.append((char) ch); 
} 
} 
outStream.close(); 
conn.disconnect(); 
return in.toString(); 
} 
复制代码 

********************** 
button响应中的代码: 
********************** 
public void onClick(View v){ 
String actionUrl = getApplicationContext().getString(R.string.wtsb_req_upload); 
Map<String, String> params = new HashMap<String, String>(); 
params.put("strParamName", "strParamValue"); 
Map<String, File> files = new HashMap<String, File>(); 
files.put("tempAndroid.txt", new File("/sdcard/temp.txt")); 
try { 
HttpTool.postMultiParams(actionUrl, params, files); 
} catch ... 
复制代码 


*************************** 
服务器端servlet代码: 
*************************** 
public void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 

//print request.getInputStream to check request content 
//HttpTool.printStreamContent(request.getInputStream()); 

RequestContext req = new ServletRequestContext(request); 
if(FileUpload.isMultipartContent(req)){ 
DiskFileItemFactory factory = new DiskFileItemFactory(); 
ServletFileUpload fileUpload = new ServletFileUpload(factory); 
fileUpload.setFileSizeMax(FILE_MAX_SIZE); 

List items = new ArrayList(); 
try { 
items = fileUpload.parseRequest(request); 
} catch ... 

Iterator it = items.iterator(); 
while(it.hasNext()){ 
FileItem fileItem = (FileItem)it.next(); 
if(fileItem.isFormField()){ 
System.out.println(fileItem.getFieldName()+" "+fileItem.getName()+" "+new String(fileItem.getString().getBytes("ISO-8859-1"),"GBK")); 
} else { 
System.out.println(fileItem.getFieldName()+" "+fileItem.getName()+" "+ 
fileItem.isInMemory()+" "+fileItem.getContentType()+" "+fileItem.getSize()); 
if(fileItem.getName()!=null && fileItem.getSize()!=0){ 
File fullFile = new File(fileItem.getName()); 
File newFile = new File(FILE_SAVE_PATH+fullFile.getName()); 
try { 
fileItem.write(newFile); 
} catch ... 
} else { 
System.out.println("no file choosen or empty file"); 
} 
} 
} 
} 
} 

public void init() throws ServletException { 
//读取在web.xml中配置的init-param   
FILE_MAX_SIZE = Long.parseLong(this.getInitParameter("file_max_size"));//上传文件大小限制  
FILE_SAVE_PATH = this.getInitParameter("file_save_path");//文件保存位置 
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio是一款用于开发Android应用程序的集成开发环境(IDE),它通过提供丰富的功能和工具,让开发者可以更轻松地构建和调试Android应用。 要发送POST请求,我们需要在项目的build.gradle文件添加网络请求库的依赖。例如,我们可以使用OkHttp库,可以在build.gradle文件的dependencies块添加以下代码: implementation 'com.squareup.okhttp3:okhttp:4.9.0' 接下来,在我们的活动或片段类创建一个方法来发送POST请求。这种发送请求的简便方法是使用AsyncTask类的doInBackground()方法在后台线程执行网络请求。示例如下: private class MyAsyncTask extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { String url = params[0]; String postData = params[1]; OkHttpClient client = new OkHttpClient(); RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), postData); Request request = new Request.Builder() .url(url) .post(body) .build(); try { Response response = client.newCall(request).execute(); return response.body().string(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String result) { // 在这里处理响应结果 } } 然后,在我们的活动或片段类创建一个实例并执行AsyncTask来发送POST请求。我们需要传递URL和要发送的数据作为参数。示例如下: String url = "https://example.com/api"; String postData = "{ \"name\": \"John\", \"age\": 30 }"; MyAsyncTask task = new MyAsyncTask(); task.execute(url, postData); 在AsyncTask的onPostExecute()方法,我们可以处理响应结果,并更新UI或执行其他操作。这里的示例代码只是简单地打印响应结果,你可以根据自己的需求进行相应的处理。 这就是使用Android Studio发送POST请求的简单示例。请注意,这只是一个基本示例,实际应用可能需要处理更多的逻辑和错误处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值