You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用中基于UserName发起GET请求获取Oracle用户PIN的方法

解决根据用户名获取对应PIN的GET请求问题

嘿,我来帮你搞定这个GET请求的问题!先看你现有的代码,有几个小细节需要调整,再给你梳理下完整的实现步骤:

一、先确认REST接口的正确格式

首先要核对你的后端REST服务的URL规则:

  • 你当前的URL是http://xxx.xx.xxx.xx:xxxx/engAppApi/webservices/userTable/Employee_Name=" + employee,这看起来不太符合标准的GET参数传递方式,通常查询参数应该用?拼接,比如:
    String url = "http://xxx.xx.xxx.xx:xxxx/engAppApi/webservices/userTable?Employee_Name=" + URLEncoder.encode(employee, "UTF-8");
    
  • 如果你的后端是RESTful风格的路径参数(比如/userTable/{employeeName}),那URL应该是:
    String url = "http://xxx.xx.xxx.xx:xxxx/engAppApi/webservices/userTable/" + URLEncoder.encode(employee, "UTF-8");
    

一定要和后端开发确认接口的正确格式,不然请求会失败!

二、修正你的AsyncTask代码

你的代码里有几个关键问题,我帮你调整后给出完整版本:

private class AsyncTaskRunner extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {
        String userPinRetrieved = ""; // 初始化变量,避免空指针或初始值异常
        String employee = params[0]; // 从参数中获取用户名

        try {
            // 编码用户名,避免特殊字符导致请求错误
            String encodedEmployee = URLEncoder.encode(employee, "UTF-8");
            // 替换成正确的接口URL
            String url = "http://xxx.xx.xxx.xx:xxxx/engAppApi/webservices/userTable?Employee_Name=" + encodedEmployee;
            
            URL object = new URL(url);
            HttpURLConnection con = (HttpURLConnection) object.openConnection();
            
            con.setRequestMethod("GET");
            con.setRequestProperty("Accept", "application/json");
            // GET请求不需要setDoOutput(true),因为没有请求体
            // con.setDoOutput(true); 

            // 注意:这里用HttpURLConnection.HTTP_OK,不是HttpsURLConnection
            if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
                BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
                String line;
                while ((line = br.readLine()) != null) {
                    userPinRetrieved += line;
                }
                br.close(); // 关闭流,避免资源泄漏
            } else {
                // 处理请求失败的情况,比如打印响应码
                Log.v("ErrorAPP", "Request failed with code: " + con.getResponseCode());
            }
            con.disconnect(); // 关闭连接

        } catch (UnsupportedEncodingException e) {
            Log.v("ErrorAPP", "Encoding error: " + e.toString());
        } catch (IOException e) {
            Log.v("ErrorAPP", "Network error: " + e.toString());
        } catch (Exception e) {
            Log.v("ErrorAPP", "Unexpected error: " + e.toString());
        }

        return userPinRetrieved; // 返回获取到的JSON字符串
    }

    @Override
    protected void onPostExecute(String userPinJson) {
        super.onPostExecute(userPinJson);
        // 在这里解析JSON,提取userPin
        if (!userPinJson.isEmpty()) {
            try {
                // 假设后端返回的是{"userPin":"123456"}这样的JSON对象
                JSONObject jsonObject = new JSONObject(userPinJson);
                String retrievedPin = jsonObject.getString("userPin");
                // 拿到PIN后,你可以和用户输入的userPin对比,或者做其他逻辑
                Log.v("Success", "Retrieved PIN: " + retrievedPin);
            } catch (JSONException e) {
                Log.v("ErrorAPP", "JSON parse error: " + e.toString());
            }
        } else {
            Log.v("ErrorAPP", "No data retrieved");
        }
    }
}

关键修正点:

  • 初始化userPinRetrieved变量,避免未初始化的问题
  • 对用户名进行URL编码,处理特殊字符(比如空格、&等)
  • 移除了GET请求不需要的setDoOutput(true),因为GET没有请求体
  • 将HttpsURLConnection.HTTP_OK改为HttpURLConnection.HTTP_OK,因为你的URL是HTTP协议
  • 添加了流和连接的关闭操作,避免资源泄漏
  • 在onPostExecute里解析返回的JSON,提取对应的PIN值

三、调用AsyncTask的方式

你需要在合适的地方(比如登录按钮的点击事件)调用这个AsyncTask,传入选中的用户名:

new AsyncTaskRunner().execute(userName); // userName是你从下拉列表获取的变量

四、额外优化建议

  1. 替代过时的AsyncTask:AsyncTask在Android API 30及以上已经被标记为过时,建议使用更现代的方案,比如:
    • Kotlin协程(如果你的项目用Kotlin的话)
    • Retrofit + OkHttp(更简洁的网络请求框架)
    • Volley(Google官方推荐的轻量网络库)
  2. 安全性优化:不要用HTTP协议,改用HTTPS,避免数据明文传输
  3. 错误处理:可以在请求失败时给用户提示(比如Toast),提升用户体验

内容的提问来源于stack exchange,提问作者AndroidBeginner2018

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:47:03