当前位置:首页 > 行业动态 > 正文

Android调用ASP.NET Web API的实践与问题?

在Android中调用ASP.NET Web API,可以使用HttpURLConnection或第三方库如Retrofit、OkHttp等。

在现代移动应用开发中,Android客户端与ASP.NET Web API的交互是一个常见的需求,这种交互通常涉及到HTTP请求和响应的处理,以及数据的传输和解析,以下是对这一过程的详细解答:

1、Android调用ASP.NET Web API的步骤

准备工作

添加网络权限:在Android项目的AndroidManifest.xml文件中添加访问网络的权限,以便应用能够进行网络通信。

引入相关库:根据需要选择合适的网络请求库,如OkHttp、Retrofit等(这里以原生的HttpURLConnection为例),并确保正确引入相关依赖。

发起HTTP请求

创建URL对象:使用ASP.NET Web API的服务地址创建URL对象,指定请求的API端点,如果要获取用户信息,URL可能是"http://服务器地址/api/users"

打开连接:通过URL.openConnection()方法打开与Web API的连接,返回一个HttpURLConnection对象。

设置请求方法:根据API的要求,使用setRequestMethod()方法设置请求方法,如GETPOSTPUTDELETE等,对于获取数据的操作,通常使用GET方法;对于提交数据的操作,常用POSTPUT方法。

设置请求头:如果API需要特定的请求头,如Content-TypeAccept等,可以使用setRequestProperty()方法进行设置,设置请求头为application/json,以便服务器能够正确解析请求体中的JSON数据。

发送请求:对于GET请求,直接连接成功后即可读取响应;对于POSTPUT等请求,需要先获取输出流,将请求参数写入输出流中,然后刷新并关闭输出流,最后发送请求。

处理响应

获取响应码:通过getResponseCode()方法获取服务器返回的响应码,根据响应码判断请求是否成功,常见的响应码有200(OK)、404(Not Found)、500(Internal Server Error)等。

读取响应内容:如果响应码表示成功,根据响应的数据格式选择合适的方法读取响应内容,如果是文本数据,可以使用InputStreamReaderBufferedReader读取;如果是二进制数据,可以直接使用InputStream读取。

关闭连接:无论请求是否成功,最后都需要关闭HttpURLConnection连接,释放资源。

2、示例代码

Android端发起GET请求示例

     public static void httpConnGet() {
         String resultString = null;
         HttpURLConnection conn = null;
         InputStream inputStream = null;
         ByteArrayOutputStream bos = null;
         try {
             String srcUrl = "http://url/api/values";
             URL url = new URL(srcUrl);
             conn = (HttpURLConnection) url.openConnection();
             conn.setReadTimeout(10000);
             conn.setConnectTimeout(10000);
             conn.setRequestMethod("GET");
             conn.setRequestProperty("Accept", "application/json,text/html;q=0.9,image/webp,/;q=0.8");
             conn.setRequestProperty("Cache-Control", "max-age=0");
             conn.setDoInput(true);
             conn.setDoOutput(false);
             conn.connect();
             int responseCode = conn.getResponseCode();
             if (responseCode == 200) {
                 if (null != conn.getHeaderField("Content-Encoding")) {
                     inputStream = new GZIPInputStream(conn.getInputStream());
                 } else {
                     inputStream = conn.getInputStream();
                 }
                 bos = new ByteArrayOutputStream();
                 byte[] buffer = new byte[10240];
                 int len;
                 while ((len = inputStream.read(buffer)) != -1) {
                     bos.write(buffer, 0, len);
                 }
                 byte[] resultByte = bos.toByteArray();
                 resultString = new String(resultByte);
             } else {
                 LogUtils.e("httpUtils", "ResponseCode:" + responseCode);
             }
         } catch (IOException e) {
             e.printStackTrace();
         } finally {
             if (bos != null) {
                 try {
                     bos.close();
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
             if (inputStream != null) {
                 try {
                     inputStream.close();
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
             if (conn != null) {
                 conn.disconnect();
             }
         }
     }

Android端发起POST请求示例

     public static void httpConnPost() {
         String resultString = null;
         HttpURLConnection conn = null;
         InputStream inputStream = null;
         ByteArrayOutputStream bos = null;
         try {
             String srcUrl = "http://url/api/values";
             URL url = new URL(srcUrl);
             conn = (HttpURLConnection) url.openConnection();
             conn.setReadTimeout(10000);
             conn.setConnectTimeout(10000);
             conn.setRequestMethod("POST");
             conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");
             conn.setRequestProperty("Accept", "application/json");
             conn.setDoInput(true);
             conn.setDoOutput(true);
             conn.connect();
             // 构建请求体
             JSONObject jsonObject = new JSONObject();
             jsonObject.put("key1", "value1");
             jsonObject.put("key2", "value2");
             String jsonString = jsonObject.toString();
             // 发送请求体
             OutputStream outputStream = conn.getOutputStream();
             outputStream.write(jsonString.getBytes("UTF-8"));
             outputStream.flush();
             outputStream.close();
             int responseCode = conn.getResponseCode();
             if (responseCode == 200) {
                 if (null != conn.getHeaderField("Content-Encoding")) {
                     inputStream = new GZIPInputStream(conn.getInputStream());
                 } else {
                     inputStream = conn.getInputStream();
                 }
                 bos = new ByteArrayOutputStream();
                 byte[] buffer = new byte[10240];
                 int len;
                 while ((len = inputStream.read(buffer)) != -1) {
                     bos.write(buffer, 0, len);
                 }
                 byte[] resultByte = bos.toByteArray();
                 resultString = new String(resultByte);
             } else {
                 LogUtils.e("httpUtils", "ResponseCode:" + responseCode);
             }
         } catch (IOException e) {
             e.printStackTrace();
         } finally {
             if (bos != null) {
                 try {
                     bos.close();
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
             if (inputStream != null) {
                 try {
                     inputStream.close();
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
             if (conn != null) {
                 conn.disconnect();
             }
         }
     }

3、单元表格归纳

| 步骤 | 说明 | Android代码示例 | ASP.NET Web API代码示例 | 注意事项 |

| –| –| –| –| –|

| 准备工作 | 添加网络权限,引入相关库 | 在AndroidManifest.xml中添加权限,引入网络请求库 | 确保Web API项目已创建并配置好路由 |

| 发起HTTP请求 | 创建URL对象,打开连接,设置请求方法、请求头,发送请求 | 使用HttpClient或其他方式接收和处理请求 | 注意请求的URL、方法、头信息的正确性 |

| 处理响应 | 获取响应码,读取响应内容 | 根据请求方法返回相应的结果 | 根据响应码判断请求是否成功,正确处理响应数据 |

| 关闭连接 | 关闭HttpURLConnection连接 | 无需特殊处理 | 及时关闭连接,释放资源 |

4、相关问题与解答

问题1:Android调用ASP.NET Web API时,出现“无网络权限”的错误,怎么办?

解答:这是因为在Android项目中没有添加网络访问权限,需要在AndroidManifest.xml文件中添加以下权限:

     <uses-permission android:name="android.permission.INTERNET"/>

问题2:如何处理ASP.NET Web API返回的JSON数据?

解答:在Android中,可以使用第三方库如Gson、FastJson等来解析JSON数据,使用Gson库可以将JSON字符串转换为对应的Java对象:

     Gson gson = new Gson();
     User user = gson.fromJson(jsonString, User.class);
0