2014-03-27 3 views
0

다른 제공 업체의 API (Google은 헬프 데스크 제공 업체를 전환 함)에서 작동하도록 일부 작동 코드를 수정합니다.HTTPURLConnection이 횡설수설하는 답글

나는 올바른 길을 가고 있는지를보기 위해 돌아 오는 XML을 보려고 노력하고 있지만, 돌아 오는 것이 모두 횡설수설하는 것을 볼 수 있습니다. this 질문을 보았지만 이러한 대답이 내 상황에 어떻게 적용될 수 있는지 파악할 수 없습니다.

while ((line = br.readLine()) != null) { 
    System.out.println(line); 
} 

내 질문은 : 내가 여기에 콘솔에서 돌아 오는 XML을 읽을 수 있었다 다른 API를 사용할 때

내가 정확히 기억한다면, 내가 다른 스트림을 읽을 수있는 방법이 있나요 그래서 내가 다시오고있는 XML을 읽을 수있는 또 다른 문제가 있습니까?

나는이 모든 것에 매우 환영 받는다. 자세한 내용은 아래에 나와 있습니다.

코드 :

package com.google.gwt.HelpDeskTest.server; 

import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import com.google.gwt.user.server.rpc.RemoteServiceServlet; 
import com.google.gwt.HelpDeskTest.client.HelpDeskTestService; 
import com.google.gwt.HelpDeskTest.shared.HelpDeskTestException; 


@SuppressWarnings("serial") 
public class HelpDeskTestImpl extends RemoteServiceServlet implements 
    HelpDeskTestService { 

    @Override 
    public String postToRemoteServer(String serviceUrl) 
      throws HelpDeskTestException { 
     try { 

      final String serverPath= "https://www.myconnectwise.net/v4_6_release/services/system_io/integration_io/processClientAction.rails"; 

      System.out.println(serverPath); 


      final String serverParameters= "<?xml version=%221.0%22 encoding=%22utf-16%22?>" + 
      "<GetTicketAction xmlns:xsi=%22http://www.w3.org/2001/XMLSchema-instance%22 xmlns:xsd=%22http://www.w3.org/2001/XMLSchema%22>" + 
      "<CompanyName>xxxxxx</CompanyName><IntegrationLoginId>xxxxxxx</IntegrationLoginId><IntegrationPassword>xxxxxx</IntegrationPassword>" + 
      "<SrServiceRecid>1921</SrServiceRecid></GetTicketAction>"; 


      System.out.println(serverParameters); 

      //Open HttpURLConnection:   

      URL url = new URL(serverPath); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

      connection.setConnectTimeout(10000); //added this to see if I can address the timeout issue. 
      connection.setReadTimeout(10000); 

      connection.setDoOutput(true); 
      connection.setDoInput(true); 
      connection.setInstanceFollowRedirects(false); 
      connection.setRequestMethod("POST"); 
      connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
      connection.setRequestProperty("charset", "utf-16"); 
      connection.setRequestProperty("Content-Length", "" + Integer.toString(serverParameters.getBytes().length)); 
      connection.setUseCaches (false); 
      //connection.setChunkedStreamingMode(0); 

      DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); 
      wr.writeBytes(serverParameters); 
      wr.flush(); 
      wr.close(); 

      //process response - need to get xml response back. 
      //this was the working line of code: 
      InputStream stream = connection.getInputStream(); 

      //put output stream into a string 
      BufferedReader br = new BufferedReader(new InputStreamReader(stream)); 
      String result = ""; 
      String line; 
      while ((line = br.readLine()) != null) { 
       System.out.println(line); 
       result+= line; 
      } 

      br.close(); 
      connection.disconnect(); 

      System.out.println(result); 

      return result; 


     } catch (final Exception e) { 
      System.out.println(e.getMessage()); 
      throw new HelpDeskTestException(); 
      //handle timeout error 

     } 
    } 
} 

이 내가 전송을 시도하고있어 XML입니다. 필자는 회사의 API 테스터를 통해 테스트를 실시했으며 작동하는지 확인하고 xml을 보내 응답합니다.

<?xml version="1.0" encoding="utf-16"?> 
<GetTicketAction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <CompanyName>xxxxxx</CompanyName> 
    <IntegrationLoginId>xxxxxx</IntegrationLoginId> 
    <IntegrationPassword>xxxxx</IntegrationPassword> 
    <SrServiceRecid>1921</SrServiceRecid> 
</GetTicketAction> 
+0

시도'connection.getContent()' – anttix

답변

1

데이터를 보낼 때 utf-16을 인코딩으로 지정하십시오.

그러나 응답을 읽을 때 인코딩을 지정하지 않으므로 기본 플랫폼 인코딩이 사용됩니다.

BufferedReader br = new BufferedReader(new InputStreamReader(stream,"utf-16")); 

실제로 인코딩 갖는 알아 응답 헤더를 확인한다 (또한, UTF-16 인코딩 된 응답을 가정)이 함께

BufferedReader br = new BufferedReader(new InputStreamReader(stream)); 

:

그래서 라인 교환 사용되었습니다.

+0

내가 응답 헤더를 확인합니다하지만 난 그것을 실행할 때 내가 지금 다음과 같은 오류가 있기 때문에 우리가 올바른 궤도에 있다고 생각 : ?????? .. .. 많은 물음표가 ... ??????? com.google.gwt.xml.client.impl.DOMParseException : 구문 분석하지 못했습니다 : 1 행의 1 행에 오류가 발생했습니다. 문서가 비어 있습니다. – brl8

+0

응답 헤더에서 인코딩이 utf-16임을 확인했습니다. 나는 이걸 답으로 표시하고 다른 오류를 추적하기 시작할 것입니다! 감사! – brl8

0

그래서 많이 검색 한 결과 나는 이에 대한 답을 찾았습니다. xml은 Gzip으로 압축되기 때문에 횡설수설 (gabberish)으로 읽습니다. 이것을 읽는 방법은 GZIPInputStream을 사용하는 것입니다. 이것은 XML이 다르게 압축되기 때문입니다.

HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setRequestProperty("Accept-Encoding", "gzip"); 
     InputStreamReader in = new InputStreamReader (new GZIPInputStream(connection.getInputStream())); 
     String str;    
     while (true) { 
    int ch = in.read(); 
    if (ch==-1) { 
     break; 
    } 
관련 문제