0

我正在从 Java 调用 Sharepoint 2010 oData 服务,这会导致 400 错误。我可以通过相同的代码(使用 NTLM)成功连接到 XML 格式的 Sharepoint 2010 列表。

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

有谁知道使用什么确切设置来解决上面帖子中的错误?有谁知道他们是否指的是 IIS 中的 .NET 授权规则?

我们使用的是 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>

Microsoft 社交媒体类型中提到了类似的问题。任何人遇到这个并知道如何解决这个问题?

任何帮助将非常感激!

瓦妮塔

4

2 回答 2

4

我的同事建议删除内容类型请求标头。从 curl 到 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

我将 Accept 请求标头设置为“ */*”到 getAuthenticatedResponse 方法,如下所示:

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

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

这解决了 400 错误,我从 Sharepoint oData 服务获得了提要。似乎Java设置了一些干扰的默认请求标头。

于 2013-02-22T18:15:52.953 回答
1

似乎您已经找到了一个可行的解决方案,但这里有一个使用 apache httpcomponents 库的替代方案。

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

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");
...
于 2013-05-17T18:51:13.700 回答