2013-02-20 2 views
0

Java에서 Sharepoint 2010 oData 서비스를 호출하여 400 오류가 발생했습니다. NTLM을 사용하여 동일한 코드를 통해 XML 형식의 Sharepoint 2010 목록에 연결할 수 있습니다.Sharepoint 2010 oData에 Java HTTP 호출이 실패합니다.

동일한 서비스 (listdata.svc)와 400 오류를 말하는 관련 게시물 HttpClient using both SSL encryption and NTLM authentication fails이 있습니다.

위의 게시물에서 오류를 해결하기 위해 사용 된 정확한 설정을 아는 사람이 있습니까? IIS의 .NET 권한 부여 규칙을 언급하는 사람은 누구입니까?

IIS 7.5를 사용하고 있습니다.

내 코드는 다음과 같습니다

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> 

유사한 문제는 언급

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

자바 1.6 HttpURLConnection의 사용 Microsoft Social media types에 있습니다. 누구든지이 문제를 해결하고이를 해결하는 방법을 알고 있습니까?

도움이 될 것입니다.

Vanita

답변

4

내 동료는 내용 유형 요청 헤더를 제거하는 제안했다. 컬에서 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: */* 

자바가 추적 로그에 다음 보여 주었다 :

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가 방해 한 기본 요청 헤더를 설정 한 것처럼 보입니다.

1

이미 해결책을 찾은 것처럼 보입니다.하지만 여기서는 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"); 
... 
+0

팁 주셔서 감사합니다. 먼저 HTTP 컴포넌트를 시도했지만 Sharepoint/IIS7과 함께 NTLM/SSL을 사용하여 문제가 발생했습니다. 이 특정 사용 사례에 대해 HTTPUrlconnection이 훨씬 잘 작동했습니다. Java 1.6+ API처럼 NTLM 인증 문제가 조금 개선되었습니다. – VC1