使用Java代码使用Maximo RESTful服务

时间:2014-01-06 07:53:01

标签: java rest maximo

我正在使用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.接受--Application / xml

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

以下是我使用相同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服务,请告诉我。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您需要使用基本的http:

添加用户名和密码参数
.../os/mxperson?_lid=username&_lpwd=password&_format=xml&personid=MAXADMIN

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

答案 3 :(得分:0)

在这里挖掘一个旧问题,但是当“我”遇到同样的问题时,我被Google引导回答,所以这可能对其他人有所帮助。

我在看这篇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编码。 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文章中显示的内容)。如果它们不匹配,我认为您被认为是未经授权的,并且会发回错误。如果它们匹配,则该请求被视为已授权,允许通过并且服务返回其响应。