安卓App使用HttpURLConnection发送请求与上传文件

安卓原生App开发时常用的http开发工具

  • 系统内置http请求工具为 HttpURLConnection
  • httpClient 是 apache 的开源工具
  • okHttp 使用更简单,语法相对HttpURLConnection也简洁了许多,需要在graddle添加依赖。

本文主要讲解如何使用HttpURConnection向服务器发送Reqest, 保存Response内容,如何上传文件等内容。

1. 使用 HttpURLConnection 发送http GET请求

step-1: 创建1个URL 对象

URL url = new URL("http://www.yahoo.com");

step-2: 创建1个 HttpURLConnection对象,并绑定URL对象 object,

HttpURLConnection httpConn = (HttpURLConnection)url.openConnection();

step-3: 设置请求方法,以及其它必要选项

httpConn.setConnectTimeout(10000);
httpConn.setRequestMethod("GET");

设置了请求方法后,就开始发送

step-4: 读取 Response
在httpConn对象上打开1个input stream, 用BufferReader的方式从httpConnect中读字节

InputStream inputStream = httpConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
//保存response内容
StringBuffer readTextBuf = new StringBuffer();
String line = bufferedReader.readLine();
while(line != null) {
    readTextBuf.append(line);
    // Continue to read text line.
    line = bufferedReader.readLine();
}

step-5: 读完response以后,此连接就不需要了,别忘了关闭连接

httpConn.disconnect();

2. 发送 POST请求步骤

与GET请求步骤不同在于,POST 需要在消息体内携带请求参数,因此要在httpConn连接上打开ouput stream,才能发出
将第1节的step-3 改为如下:

httpConn.setRequestMethod("GET");
httpConn.setRequestProperty(Key,Value);
httpConn.setDoOutput(true);

Output the stream to the server
OutputStream outputPost = new BufferedOutputStream(httpConn.getOutputStream());
writeStream(outputPost);
outputPost.flush();
outputPost.close();

至此,POST消息发送完成。 读取Response响应体的方法与上节相同。

下面是1个完整的发送POST 示例
(1)准备1个HashMap(类似于python字典)保存请求参数
HashMap<String, String> params;
//此处添加
params.put("name", "Jack");
params.put("company", "Baidu");

(2)将HashMap转为stringBuild类型


 StringBuilder sbParams = new StringBuilder();
    int i = 0;
    for (String key : params.keySet()) {
        try {
            if (i != 0){
                sbParams.append("&");
            }
            sbParams.append(key).append("=")
                    .append(URLEncoder.encode(params.get(key), "UTF-8"));

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        i++;
    }

(3) 创建 HttpURLConnection 对象,打开连接,发送POST请求参数

try{
    String url = "http://www.example.com/test.php";
    URL urlObj = new URL(url);
    HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();
    conn.setDoOutput(true);
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Accept-Charset", "UTF-8");
    
    conn.setReadTimeout(10000);
    conn.setConnectTimeout(15000);
    
    conn.connect();
    
    String paramsString = sbParams.toString();  //sbParams是前面准备好的
    
    DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
    wr.writeBytes(paramsString);
    wr.flush();
    wr.close();
} catch (IOException e) {
  e.printStackTrace();
}

(4)接收response, 保存body 内容

try {
  InputStream in = new BufferedInputStream(conn.getInputStream());
  BufferedReader reader = new BufferedReader(new InputStreamReader(in));
  StringBuilder result = new StringBuilder();
  String line;
  while ((line = reader.readLine()) != null) {
    result.append(line);
  }

  Log.d("test", "result from server: " + result.toString());

} catch (IOException e) {
  e.printStackTrace();
} finally {
    if (conn != null) {
        conn.disconnect();
    }
}

3. 发送Json POST request

与普通的POST请求不同,JSON POST请求参数为json格式, 因此需要修改请求头部参数Content-Type与Accept参数

修改step-3步骤:

httpConn.setRequestMethod("POST");

设置Content-Type头部参数为“application/json”

httpConn.setRequestProperty("Content-Type", "application/json");

设置“Accept”头部参数为“application/json”

httpConn.setRequestProperty("Accept", "application/json");

设置连接准备发送数据

httpConn.setDoOutput(true);

创建1个json body

String jsonInputString = "{"name": "Upendra", "job": "Programmer"}";

将json字符串写入output stream

try(OutputStream os = httpConn.getOutputStream()) {
   byte[] input = jsonInputString.getBytes("utf-8");
   os.write(input, 0, input.length); 
}

4. 用POST请求上传文件

上传文件时,POST请求头部参数Content-Type使用 multipart/form-data, 实现也比较容易

URL url = new URL(postTarget);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

String auth = "Bearer " + oauthToken;
connection.setRequestProperty("Authorization", basicAuth);

String boundary = UUID.randomUUID().toString();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);

DataOutputStream request = new DataOutputStream(uc.getOutputStream());

request.writeBytes("--" + boundary + "\r\n");
request.writeBytes("Content-Disposition: form-data; name=\"description\"\r\n\r\n");
request.writeBytes(fileDescription + "\r\n");

request.writeBytes("--" + boundary + "\r\n");
request.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.fileName + "\"\r\n\r\n");
request.write(FileUtils.readFileToByteArray(file));
request.writeBytes("\r\n");

request.writeBytes("--" + boundary + "--\r\n");
request.flush();
int respCode = connection.getResponseCode();

switch(respCode) {
    case 200:
        //all went ok - read response
        ...
        break;
    case 301:
    case 302:
    case 307:
        //handle redirect - for example, re-post to the new location
        ...
        break;
    ...
    default:
        //do something sensible
}

总结

使用 HttpURLConnection 发送请求流程还是比较清晰,GET, POST,主要的区别在Step-3 步骤,发送 JSON类型参数,上传 file 还需要修改头部参数。
在Android App开发时,可以在Activity用按钮事件来触发请求,也可以使用service 在后台发送请求。 本文就不列出那些示例代码了。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 安卓开发中,我们通常使用HTTP协议将文件上传到服务器。下面是具体步骤: 1. 获取要上传的文件:首先,我们需要选择或通过其他方式获取要上传的文件,可以是照片、视频或其他类型的文件。 2. 创建HTTP请求使用安卓的HttpClient或HttpURLConnection等工具,创建一个HTTP POST请求。 3. 设置请求头:在HTTP请求中设置必要的请求头,包括Content-Type、Content-Length等,以便服务器正确解析请求。 4. 设置请求体:将要上传的文件数据作为请求体的一部分,将文件数据写入请求体中。可以使用InputStream或byte数组等方式读取文件的数据。 5. 发送请求:将创建好的HTTP请求发送到服务器,等待服务器响应。 6. 处理服务器响应:根据服务器返回的响应状态码和响应内容,判断文件上传是否成功。如果上传成功,服务器可能会返回一些成功信息,我们可以进行相应处理。 7. 关闭连接:文件上传完成后,关闭HTTP连接,释放资源。 需要注意的是,上传大文件时可能会存在时间较长的问题,可能需要在后台线程中进行文件上传,以免阻塞主线程影响用户体验。 以上是一种基本的文件上传到服务器的方式,当然根据实际需求和使用的框架,具体实现可能会有所不同。因此在实际开发中,要根据具体情况进行调整和优化。 ### 回答2: 安卓应用程序可以通过以下步骤将文件上传到服务器: 1. 首先,用户需要在应用程序中选择要上传的文件。可以通过在应用程序中添加文件选择器或浏览器来实现。 2. 一旦用户选择了要上传的文件,应用程序将需要获取该文件的URI(统一资源标识符)。可以使用Android的ContentResolver来获取URI。 3. 接下来,应用程序需要建立与服务器的连接。这可以通过使用HTTP库或Volley库来实现。这些库提供了与服务器进行通信的函数和方法。 4. 应用程序需要创建一个HTTP请求,并将文件数据添加到请求中。这可以使用HTTP POST请求来实现。 5. 在HTTP请求中,应该添加所需的参数,例如文件名、文件类型等。 6. 最后,将创建的HTTP请求发送到服务器。服务器将接收到的文件保存在相应的位置,并返回上传结果。 需要注意的是,上传文件到服务器可能涉及到网络连接,因此需要在AndroidManifest.xml文件中添加相关权限,如网络访问权限等。 总而言之,Android应用程序可以通过获取文件URI、建立与服务器的连接、创建HTTP请求以及发送请求来将文件上传到服务器。 ### 回答3: 安卓app上传文件到服务器是一种常见的功能需求,可以通过以下步骤实现: 1. 获取文件:用户在app中选择要上传的文件,可以通过文件选择器或者拍照等方式获取文件。 2. 构建上传请求:将选择的文件包装成上传请求请求包括目标服务器地址、上传文件的参数等信息。 3. 建立网络连接:使用HTTP或者其他网络协议建立与目标服务器的连接,确保网络正常。 4. 将文件上传到服务器:将文件通过已建立的网络连接传输到服务器,可以使用POST请求将文件内容发送到服务器端。 5. 服务器端接收文件:服务器端接收到上传的文件,可以根据请求中的参数进行处理,如保存文件到指定位置。 6. 返回上传结果:服务器将上传结果返回给客户端,客户端可以根据结果进行相应的操作,如展示上传成功或失败的提示信息。 在安卓开发中,可以使用一些常见的开源库来简化上传文件到服务器的流程,如Retrofit、OkHttp等。这些库提供了方便的API和工具类,可以帮助我们构建请求、建立网络连接、上传文件等操作。 需要注意的是,在上传文件时,我们应该对文件进行压缩或者限制文件大小,以减少网络传输的时间和流量消耗。同时,为了保证上传的文件在传输过程中的完整性和安全性,可以使用一些加密算法对文件进行加密处理。 总之,安卓app上传文件到服务器是一项常见的功能,通过合理的步骤和使用相关的开源库,可以方便地实现该功能,并在上传过程中保证文件的安全和完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值