2008-09-18 5 views
9

POST를 통해 XML 파일 (XML 형식의 문자열)을 다른 서블릿에 보낼 서블릿을 작성하려고합니다. 한 자바 서블릿에서 다른 서블릿으로 게시물 데이터 작성

StringBuilder sb= new StringBuilder(); 
    sb.append("Hello there"); 

    URL url = new URL("theservlet's URL"); 
    HttpURLConnection connection = (HttpURLConnection)url.openConnection();     
    connection.setRequestMethod("POST"); 
    connection.setRequestProperty("Content-Length", "" + sb.length()); 

    OutputStreamWriter outputWriter = new OutputStreamWriter(connection.getOutputStream()); 
    outputWriter.write(sb.toString()); 
    outputWriter.flush(); 
    outputWriter.close(); 

이 서버 오류를 일으키는 (비 필수 XML을 생성하는 코드는 "안녕하세요"로 대체), 두 번째 서블릿이 호출되지 않습니다.

답변

13

것은 이런 종류의 HttpClient 같은 라이브러리를 사용하여 훨씬 더 쉽습니다. 심지어 post XML code example있다 :

PostMethod post = new PostMethod(url); 
RequestEntity entity = new FileRequestEntity(inputFile, "text/xml; charset=ISO-8859-1"); 
post.setRequestEntity(entity); 
HttpClient httpclient = new HttpClient(); 
int result = httpclient.executeMethod(post); 
2

사용하는 것을 잊지 마십시오

connection.setDoOutput(true) 

는 출력을 보내기에하려는 경우.

8

더 나은 API이기 때문에 Apache HTTPClient을 대신 사용하는 것이 좋습니다.

그러나이 현재의 문제를 해결하려면 연결을 연 후 connection.setDoOutput(true);을 호출 해보십시오.

StringBuilder sb= new StringBuilder(); 
sb.append("Hello there"); 

URL url = new URL("theservlet's URL"); 
HttpURLConnection connection = (HttpURLConnection)url.openConnection();     
connection.setDoOutput(true); 
connection.setRequestMethod("POST"); 
connection.setRequestProperty("Content-Length", "" + sb.length()); 

OutputStreamWriter outputWriter = new OutputStreamWriter(connection.getOutputStream()); 
outputWriter.write(sb.toString()); 
outputWriter.flush(); 
outputWriter.close(); 
2

는 HTTP 포스트 업로드 스트림의 내용과 그것의 역학은 당신이 그 (것)들을 것으로 기대하고 무엇을 할 것 같지 않습니다. POST에는 POST 요청에 포함 된 데이터를 전송하는 방법에 대한 매우 구체적인 RFC 표준이 있으므로 파일을 게시물 내용으로 쓸 수는 없습니다. 그것은 콘텐츠 자체의 포맷이 아니라 출력 스트림에 "기록되는"방법의 메커니즘이기도합니다. POST가 청크로 작성된 시간이 많이 있습니다. Apache의 HTTPClient 소스 코드를 살펴보면 청크 작성 방법을 알 수 있습니다.

콘텐츠 길이가 청크를 식별하는 작은 숫자와 스트림을 통해 기록 될 때 각 청크를 구분하는 임의의 작은 문자 시퀀스로 증가하기 때문에 결과로 내용 길이가 달라집니다. 최신 Java 버전의 HTTPURLConnection에 설명 된 다른 메소드 중 일부를 살펴보십시오.

http://java.sun.com/javase/6/docs/api/java/net/HttpURLConnection.html#setChunkedStreamingMode(int)

당신이하는 것을 알지 못함 이니이다하고 모든 복잡성을 추상화하기 때문에 정말 훨씬 쉽게 끝나게 않습니다 아파치 HttpClient를 같은 종속성을 추가 다루고, 그것을 배울 싶지 않은 경우 및 그냥 작동합니다.

관련 문제