URL.openConnection()方法不适用于WebSphere Liberty Profile

时间:2015-10-17 20:05:52

标签: servlets jax-rs httpurlconnection httpserver websphere-liberty

我正在使用javax.servlet.http.HttpServlet来创建和初始化我的服务器。

我正在IBM WebSphere Liberty服务器上部署我的servlet。

当我尝试进行任何REST调用时,我收到401 Unauthorized错误。

 HttpURLConnection conn = null;
 String url = "https://someurl/getdata";

    try {
        conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        String accessToken = this.token;
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content-Type",
                "application/x-www-form-urlencoded;charset=utf-8");
        conn.setRequestProperty("Accept", "application/json;charset=utf-8");
        conn.setRequestProperty("X-Auth-Token", "bmXaj83sgo4"); } catch (Exception e) {
        e.printStackTrace();
    }

抛出NullPointerException或在该行返回401 Unouthorized错误:

conn = (HttpURLConnection) url.openConnection();

但是我可以通过RestClient或使用简单的Java项目来访问相同的URL。

我的web.xml看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">

    <display-name>SampleTesting</display-name>

    <servlet>
        <servlet-name>Monkey Server</servlet-name>
        <servlet-class>com.sample.testing.basic.BasicMonkeyServer</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
</web-app>

3 个答案:

答案 0 :(得分:0)

为了它的价值,这段代码(经过修改可以正常工作)运行良好,并且可以在8557上的servlet中对基本Auth保护资源进行身份验证。

您的代码或服务是不同的。发布完整的代码。

答案 1 :(得分:0)

问题在于我尝试访问的URL和我使用的凭据。 尝试使用不同的凭据,它工作正常。

答案 2 :(得分:0)

编译错误

编译代码时必须有编译错误,因为urlString且没有openConnection()方法:

String url = "https://someurl/getdata";
conn = (HttpURLConnection) url.openConnection();

尝试使用URL代替String

URL url = new URL("https://someurl/getdata");
conn = (HttpURLConnection) url.openConnection();

如果您有权访问您尝试请求的资源并且您的访问令牌有效,那么您的代码应该可以正常运行。

JAX-RS客户端API

我建议使用HttpURLConnection,而不是使用JAX-RS Client API,这是在Java中使用REST API的标准方法:

Client client = ClientBuilder.newClient();
String data = client.target("https://someurl/getdata")
        .request(MediaType.APPLICATION_FORM_URLENCODED)
        .get(String.class);

要执行身份验证,请创建ClientRequestFilter

@Provider
public class Authenticator implements ClientRequestFilter {

    private String authenticationToken;

    public Authenticator(String authenticationToken) {
        this.authenticationToken = authenticationToken;
    }

    public void filter(ClientRequestContext requestContext) throws IOException {
        requestContext.getHeaders().add("X-Auth-Token", authenticationToken);
    }
}  

并在Client

中注册
Client client = ClientBuilder.newClient().register(new Authenticator("your-token"));

从长远来看,使用JAX-RS客户端API将为您提供更大的灵活性。