java - 授权用户读取 URL 正文内容时出错

标签 java url postman urlconnection http-authentication

我不知道发生了什么请就以下问题提出建议:

为了点击一个 URL 并读取它返回的内容。我首先在一个单独的函数中授权用户 ID 和密码,然后我使用这个函数来访问我定义的 URL。我做了以下功能:

功能名称和功能

  • AQMAuthorize() - 用于授权,成功后返回用户详细信息 Login
  • AQM_Search_Api() - 读取 URL
  • 给出的所有数据(Json)的获取方法
  • AQMApplyMetaData - 在点击 URL
  • 时添加一些元数据的 POST 方法

    函数的工作

    A. The authorize function is works perfect if run alone, or called in AQMApplyMetaData().

    B. If authorize function is called in AQM_Search_Api(), I get the Authentication Error:java.io.IOException: Server returned HTTP response code: 401 for URL . Dont know why it appear?

    C. The GoogleChrome Postman Echo works fine for all my URL and returns JSON as expected.



    功能 1 和 3 的代码是:
      public String AQMAuthorize()  {
    
            try {
    
                ResourceBundle bundle = ResourceBundle.getBundle("com.EF.apps.trqueue.resources.config");
                String Server_URL = bundle.getString("SERVER_ADDRESS");
                String userName = bundle.getString("ADMIN_ID");
                String userPassword = bundle.getString("ADMIN_PWD");
    
                String url = "http://" + Server_URL +  "/api/rest/authorize";
                URL obj = new URL(url);
                HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    
                //add reuqest header
                String auth = userName + ":" + userPassword;
                byte[] encoded = Base64.encodeBase64(auth.getBytes());     //encoding to base64
                String encodedString = new String(encoded);
                con.setDoInput(true);
                con.setDoOutput(true);
                //con.setRequestProperty("Authorization", "Basic " + encodedString);
    
                con.setRequestMethod("POST");
                JSONArray jsonParent = new JSONArray();
                JSONObject jSonOBJ=new JSONObject();
                jSonOBJ.put("id","recording");
                jSonOBJ.put("userId", userName);
                jSonOBJ.put("password", userPassword);
                jsonParent.add(jSonOBJ);
    
    
                OutputStreamWriter wr= new OutputStreamWriter(con.getOutputStream());
                wr.write(jsonParent.toString());
    
                wr.flush();
                wr.close();
    
    
                int responseCode = con.getResponseCode();
                System.out.println("\nSending 'POST' request to URL : " + url);
                System.out.println("Post parameters : " + jSonOBJ);
                System.out.println("Response Code : " + responseCode);
    
                BufferedReader in = new BufferedReader(
                        new InputStreamReader(con.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();
    
                while ((inputLine = in.readLine()) != null) {
                        response.append(inputLine);
                }
                in.close();
    
                //print result
                System.out.println(response.toString());
                 return response.toString();
    }
    
            catch(Exception e){
                e.printStackTrace();
                return e.toString();
            }
    
        }
    
     public String AQM_Search_Api(String sessionID, String agentID)  {   
    
            try{
               //Authorize Custom method
               AQMAuthorize();
    
                ResourceBundle bundle = ResourceBundle.getBundle("com.EF.apps.trqueue.resources.config");
                String Server_URL = bundle.getString("SERVER_ADDRESS");
                String userName = bundle.getString("ADMIN_ID");
                String userPassword = bundle.getString("ADMIN_PWD");
                URLConnection urlConn = null;
                InputStream is;
                String credentials = userName + ":" + userPassword;
    
                byte[] authEncBytes =   Base64.encodeBase64(credentials.getBytes());
                String authStringEnc = new String(authEncBytes);
    
                String url = "http://" + Server_URL +  "/api/rest/recording/contact?beginTime=2009-01-01&metadata=SessionID~44Test_Session_ID44";
                URL obj = new URL(url);
                urlConn = obj.openConnection();
               // ERROR IS THROWN ON ABOVE STATEMENT
    
                     return "dummyData";
                }
            catch (Exception ex){
                     return ex.toString();
                     }
        }
    

    最佳答案

    我遇到了类似的问题,我认为您遇到了与我相同的问题(注意:我使用的是 Postman 并且没有 Java 代码示例)。我实现的内容与您的代码示例中的内容之间存在三个差异。

    第一个区别是您的 JSON 有效负载应类似于以下内容:

    [
      {
        "id":"recording",
        "userId": "importUser",
        "password": "PCS997#62",
        "data": {
          "qm.service":true
        }
      }
    ]
    

    这里的区别是您缺少 dataqm.service JSON 对象的一部分。由于使用了 Active Directory,我们还拥有一个域。这解决了我的问题。

    第二个区别是,AQM 端点不需要 base64 编码的请求 header 。这些端点都使用 JSESSIONID授权消息中提供的 cookie。这适用于所有 API 调用。我过去使用过的其他 Cisco 端点已经完成了 base64 编码的请求 header ,但似乎这些端点没有。

    第三个区别是我不需要 metadata搜索 API 请求中的查询参数。我只是确保我的 JSESSIONID cookie 包含在请求中。

    例如,您可以阅读 "Cisco Unified Workforce Optimization Quality Management API and Database Schema Reference Guide Version 11.5" (PDF)由思科提供。

    关于java - 授权用户读取 URL 正文内容时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40062677/

    相关文章:

    java - 我应该使用哪个API来登录java

    url - 如何为子域实现 grails Url 映射

    json - 使用 Postman 编码变量

    java - 在 post 请求中作为 JSON 字符串传递的 FormDataParam 对象未正确反序列化

    java - 如何在 RequestMapping 中为 RESTful 服务在 Spring 中进行 DRY?

    java - 使用 selenium webdriver 上传文件

    python - Django No Mini 与给定的查询匹配

    css - Codeigniter 基本 url 在 header 中不起作用

    api - 如何在 MAC 中设置 NODE_TLS_REJECT_UNAUTHORIZED =0 的值

    java - 如何将两个map合并成一个json数据