繁体   English   中英

使用Java代码使用Maximo RESTful服务

[英]Consume Maximo RESTful Service using Java code

我正在使用Maximo 7.5 REST API,并希望在java中编写REST客户端以使用此RESTful服务。 我在Maximo 7.5端启用了Maximo安全性,以保持Maximo用户访问自己的REST服务。 下面是我的Maximo RESTful服务的web.xml。

<security-constraint>
        <web-resource-collection>
            <web-resource-name>REST Servlet for Web App</web-resource-name>
            <description>Object Structure Service Servlet (HTTP POST) accessible by authorized users</description>
            <url-pattern>/rest/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <description>Roles that have access to Object Structure Service Servlet (HTTP POST)</description>
            <role-name>maximouser</role-name>
        </auth-constraint>
        <user-data-constraint>
            <description>data transmission gaurantee</description>
            <transport-guarantee>NONE</transport-guarantee>
        </user-data-constraint>
    </security-constraint>


    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>REST Web Application Realm</realm-name>        
    </login-config>

我成功地使用Chrome的Postman插件查询Maximo REST服务。 2以下是我的邮递员(REST客户端)标题。 1. MAXAUTH - bWF4YWRtaW46bWF4YWRtaW4 = 2.接受 - 应用程序/ xml

虽然我已在头文件中给出了授权(MAXAUTH),但我常常会弹出窗口输入用户名和密码来查询Maximo REST服务。 一旦我提供凭据,我得到响应(如下所示) 在此输入图像描述

以下是我使用相同RESTful服务的Java代码。 我不断收到401错误,虽然我作为财产提供凭证,但它没有授权。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class RESTConsume {

    // http://localhost:8080/RESTfulExample/json/product/get
    public static void main(String[] args) {

        try {

            URL url = new URL("HOSTNAME/maxrest/rest/os/mxperson?personid=maxadmin");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setRequestProperty("Accept", "Application/xml");
            connection.setRequestProperty("MAXAUTH", "bWF4YWRtaW46bWF4YWRtaW4=");
            System.out.println("Output from Server ....1 \n");

            /*
             * if (conn.getResponseCode() != 200) {
             * System.out.println("Output from Server ....2 \n");
             * 
             * throw new RuntimeException("Failed : HTTP error code : "+
             * conn.getResponseCode()); }
             */
            System.out.println("Output from Server ....3 \n");

            BufferedReader br = new BufferedReader(new InputStreamReader(
                    (connection.getInputStream())));
            System.out.println("Output from Server ....4 \n");

            String output;
            System.out.println("Output from Server .... \n");
            while ((output = br.readLine()) != null) {
                System.out.println(output);
            }

        } catch (MalformedURLException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

以下是我的输出:

Output from Server ....1 

Output from Server ....3 

java.io.IOException: Server returned HTTP response code: 401 for URL: http://vhost0043.dc1.co.us.compute.ihost.com/maxrest/rest/os/mxperson?personid=maxadmin
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at RESTConsume.main(RESTConsume.java:35)

它适用于不同的RESTful服务(不是Maximo RESTful服务),并且没有启用我们没有任何安全性的预期响应。 如果我需要做一些额外的事情来消费Maximo RESTful服务,请告诉我。

如果user:password是您的用户名和密码,则编码64“user:password”(例如使用此工具: https ://www.base64encode.org/)。 然后如果“imimastrangestring”是encode64的输出设置为请求属性“MAXAUTH”:connection.setRequestProperty(“MAXAUTH”,“iamastrangestring”);

服务期望用户名和密码或maxauth无效,因此在浏览器的情况下,它会提示您明确输入,但如果是maximo,则获得401.请尝试在请求中提供用户名和密码标头。

您需要使用基本http添加用户名和密码参数:

.../os/mxperson?_lid=username&_lpwd=password&_format=xml&personid=MAXADMIN

我认为您在使用LDAP时只能使用AUTH标头。

在这里挖掘了一个老问题,但当“我”遇到同样的问题时,我被谷歌的答案引导到了这个答案,所以也许这会帮助其他人。

我正在看这篇IBM文章: https//www.ibm.com/support/knowledgecenter/en/SSLKT6_7.6.0/com.ibm.mif.doc/gp_intfrmwk/rest_api/c_rest_security.html其中列出了两个不同的文章验证选项。 现在对我来说似乎相当明显,但本文第一部分建议更改(并且在帖子中显示为已更改)的XML块会打开HTTP基本身份验证 没有这些设置,您需要使用本机身份验证。 这让我有点意识到,也似乎是你困惑的根源。

这意味着,使用标准Maximo设置,它被配置为使用本机身份验证。 您需要提供MAXAUTH标头属性,其值为“ <username>:<password> ”base64 encoded。 Maximo将对其进行解码并获取用户名和密码,并将其与内部数据库进行比较。 如果它们匹配,则认为该请求已通过身份验证,并且该服务将返回其结果。 如果它们不匹配,您将被视为未经身份验证,并且您收到401错误。 这意味着Maximo正在对其数据库进行身份验证。

如果您更改了链接文章中描述的设置,并且正如您已经完成并在问题中显示的那样,那么您说您不想使用该表单身份验证(我认为它实际上关闭了这种身份验证形式)。 然后,您说您希望应用程序服务器针对应用服务器的 “数据库” 而不是 Maximo进行身份验证。 如果您想要针对LDAP(Active Directory)或类似的东西进行验证,这就是您想要的。

在这种情况下,需要使用HTTP基本身份验证标准发送用户名和密码。 请参阅: https ://en.wikipedia.org/wiki/Basic_access_authentication这意味着您需要提供名为“Authorization”而不是“MAXAUTH”的标头,并且该标头的值必须是字符串“Basic”(请注意大小写和空格)加上base64编码的字符串“ <username>:<password> ”。 例如,对于密码为“maxadmin”的用户“maxadmin”,“授权”标题的值为“Basic bWF4YWRtaW46bWF4YWRtaW4 =”。 应用程序服务器获取该信息并解码用户名和密码。 然后,它会检查那些配置为授权用户的内容(自己的数据库,LDAP,其他内容,某些组合)。 如果它们不匹配(如果您甚至不提供此信息,则不会匹配),则该请求将被视为未经身份验证,您将收到401响应。 如果它们匹配,则认为请求/用户已经过身份验证,然后应用服务器会将此请求/用户映射到角色(或多个角色),具体取决于已部署应用程序的应用服务器设置(进入不同的LDAP配置)讨论我不想在这里切入;这已经太久了。) 然后将该角色传递给Maximo以获取请求。 Maximo接受该角色并检查它是否与其XML配置中配置的内容匹配(您在问题中引用的内容以及之前链接的IBM文章中显示的内容)。 如果它们不匹配,我认为您被认为是未经授权的,并且会发回错误。 如果它们匹配,则认为该请求被授权,允许通过并且服务返回其响应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM