Java的HTTP调用到SharePoint 2010的OData失败(Java HTTP call

2019-08-17 02:28发布

我从Java调用一个SharePoint 2010的OData服务,这是导致400错误。 我可以以XML格式通过相同的代码(使用NTLM)成功连接到SharePoint 2010列表。

我看到相关的帖子HttpClient的同时使用SSL加密和NTLM身份验证失败,同样的服务(listdata.svc)和400错误的其中谈到。

有谁知道用什么确切的设置来解决上述职位的错误? 有谁知道,如果他们指的是.NET授权规则在IIS中?

我们使用的是IIS 7.5。

我的代码如下所示:

String responseText = getAuthenticatedResponse(Url, domain, userName, password);
System.out.println("response: " + responseText);

采用该方法使用Java 1.6 HttpURLConnection类:

private static String getAuthenticatedResponse(
    final String urlStr, final String domain, 
    final String userName, final String password) throws IOException {

    StringBuilder response = new StringBuilder();

    Authenticator.setDefault(new Authenticator() {

        @Override
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(
                domain + "\\" + userName, password.toCharArray());
        }
    });

    URL urlRequest = new URL(urlStr);
    HttpURLConnection conn = (HttpURLConnection) urlRequest.openConnection();
    conn.setDoOutput(true);
    conn.setDoInput(true);
    conn.setRequestMethod("GET");

    InputStream stream = conn.getInputStream();
    BufferedReader in = new BufferedReader(new InputStreamReader(stream));
    String str = "";
    while ((str = in.readLine()) != null) {
        response.append(str);
    }
    in.close();     

    return response.toString();
}

我得到的错误是:

Response Excerpt:
HTTP/1.1 400 Bad Request..Content-Type: application/xml
<message xml:lang="en-US">Media type requires a '/' character.  </message>

类似的问题在提到微软社交媒体类型 。 任何人都遇到这个,并知道如何解决这个问题?

任何帮助将非常感激!

Vanita

Answer 1:

我的同事建议去除内容类型请求报头。 从卷曲的OData连接的工作,比较请求头。

蜷显示:

> GET /sites/team-sites/operations/_vti_bin/listdata.svc/UBCal?=3 HTTP/1.1
> Authorization: NTLM <redacted>
> User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
> Host: hostname
> Accept: */*

Java的显示,在跟踪日志如下:

Accept: text/html, image/gif, image/jpeg, *;q=.2, */*; q=.2

余设置的接受请求头为“ */* ”到getAuthenticatedResponse方法如下:

 //Added for oData to work
conn.setRequestProperty("Accept", "*/*");

InputStream stream = conn.getInputStream();
....

这解决了400错误,我得到从SharePoint OData服务的饲料。 看起来像Java设置一些干扰其默认请求头。



Answer 2:

您似乎已经找到了有效的解决方案,但这里使用的是Apache httpcomponents库的替代品。

有趣的是它们不包含默认NTLM,请按照-these-步骤来实现它。

HttpContext localContext;

DefaultHttpClient httpclient = new DefaultHttpClient();
    httpclient.getAuthSchemes().register("ntlm", new NTLMSchemeFactory());
    NTCredentials creds = new NTCredentials(user_name, password, domain, domain);
    httpclient.getCredentialsProvider().setCredentials(AuthScope.ANY, creds);

    HttpHost target = new HttpHost(URL, Integer.parseInt(port), "http");
    localContext = new BasicHttpContext();

    HttpPost httppost = new HttpPost(list_name);
    httppost.setHeader("Accept", "application/json");
...


文章来源: Java HTTP call to Sharepoint 2010 oData fails