2014-12-01 1 views
1

urlString 값을 Chrome 브라우저에 간단하게 붙여 넣으면 CSV 파일을 잘 다운로드 할 수 있습니다.Jersey Client를 사용하여 파일을 다운로드하려고 할 때 HTTP 400 오류가 발생합니다.

하지만, 내가

 WebResource webResource = client.resource(urlString); 
     WebResource.Builder wb=webResource.accept("application/json,application/pdf,text/plain,image/jpeg,application/xml,application/vnd.ms-excel"); 
     ClientResponse response =wb.get(ClientResponse.class); 


     if (response.getStatus() != 200) { 
      throw new RuntimeException("HTTP error code : " 
        + response.getStatus()); 
     } 

     InputStream input = response.getEntity(InputStream.class); 

     byte[] byteArray = org.apache.commons.io.IOUtils.toByteArray(input); 

     FileOutputStream fos = new FileOutputStream(new File(fileToSave)); 
     fos.write(byteArray); 
     fos.flush(); 
     fos.close(); 

비록, 내 동의 PARAM 이상 text/plain 필요하지 않습니다 response.getStatus() 오류 400로 얻을 코드 아래의 도움으로 같은 urlString을 사용하여 파일을 다운로드하려고 할 때, 수락을 넓히기 위해서, 나는 더 많이 더했다.

문제를 찾으려고 많은 시간을 보내고 있습니다. 알려주세요. 많은 비슷한 질문이 있지만 아무도 내 문제를 해결하지 못합니다. 내가 저지 버전 다음

<groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-client</artifactId> 
    <version>1.18.2</version> 
+0

당신은 당신의 URL 형식을 공유 할 수 있습니까? URL은 HTML로 인코딩 된 형식이어야합니다. –

+0

URL 형식은'https : // something/something1? something = jsdfjs & sdjfl = 343'입니다. URL 인코딩 코드를 사용하여 이것을 인코딩하고 https % 3A로 변환하면 브라우저에서 사용하는 것과 정확히 일치합니다. 'URI가 절대적이지 않다 '라는 새로운 에러를받습니다. – Watt

+0

그것의 문제는 아닙니다. 매개 변수에 특수 문자와 공백이 없어야합니다. –

답변

0

코드를 사용하고

는 원칙적으로 괜찮습니다.

그것이 JUnit 테스트에 포함되어 https://github.com/WolfgangFahl/Mediawiki-Japi/blob/master/src/test/java/com/bitplan/mediawiki/japi/TestGetCSV.java#L49

를 참조하십시오. (아래 코드 참조). 이제 getCSVAsFile (url)에 URL을 넣으면 특정 URL에서 무슨 일이 벌어지고 있는지 말해 줄 수 있습니다. 아마

WebResource.Builder wb=webResource.accept("application/json,application/pdf,text/plain,image/jpeg,application/xml,application/vnd.ms-excel"); 

라인이 원인입니다. 나는 특정 Representation/MediaType을 보내기 위해 호출하는 웹 서비스를 알려주기 때문에 시작 부분에 대해 주석을 달았습니다. 일치하는 항목이 없으면 오류가 발생할 수 있습니다.

의 JUnit 테스트

package com.bitplan.mediawiki.japi; 
import static org.junit.Assert.*; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.logging.Level; 
import org.apache.commons.io.FileUtils; 
import org.junit.Test; 
import com.sun.jersey.api.client.ClientResponse; 
import com.sun.jersey.api.client.WebResource; 
import com.sun.jersey.client.apache.ApacheHttpClient; 
/** 
* test CSV access for test code 
* @author wf 
* 
*/ 
public class TestGetCSV { 
private ApacheHttpClient client; 

/** 
* get the a CSV File from the given urlString 
* http://stackoverflow.com/questions/27224870/getting-http-400-error-when-trying-to-download-file-using-jersey-client 
* 
* @param urlString 
* @param csvFile 
* @throws IOException 
*/ 
public void getCSVAsFile(String urlString, File csvFile) throws IOException { 
    client = ApacheHttpClient.create(); 
    WebResource webResource = client.resource(urlString); 
    WebResource.Builder wb = webResource 
.accept("application/json,application/pdf,text/plain,image/jpeg,application/xml,application/vnd.ms-excel"); 
    ClientResponse response = wb.get(ClientResponse.class); 
    if (response.getStatus() != 200) { 
    throw new RuntimeException("HTTP error code : " + response.getStatus()); 
    } 
    InputStream input = response.getEntity(InputStream.class); 
    byte[] byteArray = org.apache.commons.io.IOUtils.toByteArray(input); 
    FileOutputStream fos = new FileOutputStream(csvFile); 
    fos.write(byteArray); 
    fos.flush(); 
    fos.close(); 
} 

@Test 
public void testGetCSV() throws IOException { 
    boolean debug=false; 
    File csvFile=new File("/tmp/ExampleWikis.csv"); 
    getCSVAsFile("http://mediawiki-japi.bitplan.com/mediawiki-japi/index.php/Special:Ask/-5B-5BCategory:ExampleWiki-5D-5D-20-5B-5Bsiteurl::%2B-5D-5D/-3FSiteurl/-3FWikiid/format%3Dcsv/offset%3D0", csvFile); 
    String csv=FileUtils.readFileToString(csvFile); 
    if (debug) 
    System.out.println(csv); 
    assertTrue(csv.contains("http://waihekepedia.org/")); 
}