0

JavaからSharepoint2010oDataサービスを呼び出しているため、400エラーが発生します。同じコード(NTLMを使用)を介して、XML形式のSharepoint2010リストに正常に接続できます。

SSL暗号化とNTLM認証の両方を使用する関連する投稿HttpClientが失敗し、同じサービス(listdata.svc)と400エラーについて話しているのがわかります。

上記の投稿のエラーを解決するために使用された正確な設定を知っている人はいますか?IISの.NET承認ルールを参照しているかどうかを誰かが知っていますか?

IIS7.5を使用しています。

私のコードは次のようになります。

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

このメソッドは、Java1.6HTTPURLConnectionを使用します。

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

*/*次のように、getAuthenticatedResponseメソッドにAcceptリクエストヘッダーを""に設定しました。

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

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

これで400エラーが解決され、SharepointoDataサービスからフィードを取得しました。Javaが干渉するデフォルトのリクエストヘッダーを設定したようです。

于 2013-02-22T18:15:52.953 に答える
1

すでに実用的な解決策を見つけたようですが、apachehttpcomponentsライブラリを使用した別の方法があります。

興味深いのは、デフォルトでNTLMが含まれていないことです。これらの手順に従って、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 に答える