# apache httpClient Problem.



## Goldfish (8. Jun 2014)

Hi, wir schreiben gerade eine android app und ich soll den Upload von Dateien übernehmen. Ich hab soweit eigentlich alles ganz gut hinbekommen, nur gibt es ein ernstes Problem, das ich nicht in den Griff bekomme.
Also, ich sende ein einfaches Post-Request mit "http://serverort/Files/upload" an den Server. diese Anfrage klappt hervorragend. Aber wenn ich die URL auch nur im kleinsten verändere wie bspw. "http://serverort/Files/uploaded" dann löst der Server den Post-Body nicht mehr auf und findet die hochgeladene Datei nicht... ich kann mir das nicht erklären.
Ich zeige hier mal den Beispielcode, den ich dafür verwendet habe.

ich nuze für das ganze folgende Abhängigkeiten:
[XML]
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.3.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.3.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.3.2</version>
        </dependency>
[/XML]

*Client*


```
public static void main( String[] args ) throws URISyntaxException, IOException, HttpException {
        String uploadURL = "/Files/upload";
        File uploadFile = new File("C:\\Users\\Pascal\\Dropbox\\Bilder\\lulz\\00030dxt.jpg");
        HttpUploadClient httpUploadClient = new HttpUploadClient();
        httpUploadClient.uploadFile( uploadURL, uploadFile );
    }

    private static final String UTF_8_ENCODING = "UTF-8";

    private static final int connectionTimeoutMillis = 20000;
    private static final int socketTimeoutMillis = 20000;

    private void uploadFile(String uploadURL, File uploadFile) throws IOException, HttpException, URISyntaxException {
        MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
        multipartEntityBuilder.setMode( HttpMultipartMode.BROWSER_COMPATIBLE );
        multipartEntityBuilder.addPart( "file", new FileBody( uploadFile ) );
//        MultipartEntity multipartEntity = new MultipartEntity(  );
//        multipartEntity.addPart( "file", new FileBody( uploadFile ) );
        HttpResponse response;
        response = sendPOST( uploadURL, multipartEntityBuilder.build() );
        // TODO remove sysout line when it is not needed anymore
        System.out.println("result: " + EntityUtils.toString(response.getEntity(), UTF_8_ENCODING));
        return;
    }


    public static HttpResponse sendPOST(String targetURL, HttpEntity entity) throws IOException, URISyntaxException, HttpException {
        HttpClient httpClient = getHttpClient();
        HttpHost target = new HttpHost("localhost", 8888, "http");
        HttpHost proxy = new HttpHost("localhost", 8900, "http"); // für visual proxy um die Anfrage anzsuehen
        RequestConfig config = RequestConfig.custom()
                .setProxy(proxy)
                .build();
        HttpPost httppost = new HttpPost( targetURL );
        httppost.setConfig( config );
        httppost.setEntity( entity );

        System.out.println( "Executing request " + httppost.getRequestLine() + " to " + target + " via " + proxy );

        HttpResponse response = httpClient.execute(target, httppost);

//        HttpParams httpParams = httpClient.getParams();
//        HttpConnectionParams.setConnectionTimeout( httpParams, connectionTimeoutMillis );
//        HttpConnectionParams.setSoTimeout(httpParams, socketTimeoutMillis);
        String result = "";
        if (response != null && response.getEntity() != null) {
            result = EntityUtils.toString( response.getEntity(), UTF_8_ENCODING );
        }

        System.out.println(result);

        return response;
    }


    private static Object mLock = new Object();
    public static CookieStore mCookie = null;
    public static HttpClient getHttpClient() {
        final CloseableHttpClient httpClient = HttpClients.createDefault();
        return httpClient;
    }
```


*Server*
Hier zeige ich eben nur das Servlet, das sollte reichen.


```
@SuppressWarnings("serial")
public class DispatchServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request,
			               HttpServletResponse response) throws IOException {
		System.out.println("******************************************");
		System.out.println(request.getParameterMap().keySet());
		System.out.println("******************************************");
	}
}
```


Wenn ich die Anfrage an den Server mit "/Files/upload" sende, bekomme ich folgende Ausgabe
******************************************
[file.org.eclipse.jetty.servlet.contentType, file]
******************************************


Wenn ich die Anfrage an den Server mit "/Files/uploaded" sende (oder auch irgendwas beliebiges anderes), bekomme ich folgende Ausgabe

******************************************
[]
******************************************

kann mir das vielleicht jemand erklären? ich hab echt keine Ahnung mehr, was ich noch machen kann...


----------



## turtle (8. Jun 2014)

> Aber wenn ich die URL auch nur im kleinsten verändere wie bspw. "http://serverort/Files/uploaded"


Klar, zeig mal bite deine web.xml.

Dort wird NICHT auf "...uploaded" gemapped sondern halt "upload".


----------



## Goldfish (8. Jun 2014)

ich verwende embedded Jetty udn die config ist über Code zusammen gebastelt. Die web.xml haben wir entsprechend nicht verwendet.
Aber wieso macht er sowas überhaupt? Wenn ich eine Post-Anfrage sende, mit einer Datei im Body, dann soll er die doch einfach mit übergeben. Was ist das für ein Verhalten? ich kannd as leider nicht nachvollziehen...

Unsere Config läuft wie folgt:


```
public static void main(String[] args) throws Exception {

        WebAppContext root = new WebAppContext();
        configureWebAppContext(root);

	Server server = new Server();
	ArrayList<Connector> connectors = new ArrayList<>();
        createAndConfigureConnectorsAndAddThemToList(server, connectors);

        HandlerCollection handlerCollection = new HandlerCollection();
        handlerCollection.addHandler(root);
        server.setHandler(handlerCollection);
	// Start the server
	server.start();
	server.join();
}

private static void createAndConfigureConnectorsAndAddThemToList(Server server, ArrayList<Connector> connectors) {
        // connector for normal HTTP-connection
        ServerConnector sslConnector = new ServerConnector(server);
        sslConnector.setPort(HTTP_PORT); // Please don't change the port! 8888
        server.addConnector(sslConnector);
}

private static void configureWebAppContext(WebAppContext context) {
        context.setContextPath("/");
        String resourceBase = System.getProperty("user.home") + File.separator
                + ServerConstants.PROJECT_FOLDERNAME + File.separator;
        context.setResourceBase(resourceBase);
        context.setParentLoaderPriority(true);

        // Configure web application
        ServletHolder servlet = new ServletHolder();
        servlet.setName("StaticContent");
        servlet.setClassName("org.eclipse.jetty.servlet.DefaultServlet");
        context.addServlet(servlet, "/static/*");

        servlet = new ServletHolder();
        servlet.setName("apidocs");
        servlet.setClassName("org.eclipse.jetty.servlet.DefaultServlet");
        context.addServlet(servlet, "/apidocs/*");

        servlet = new ServletHolder(new DispatchServlet());
        context.addServlet(servlet, "/*");

        // servlet = new ServletHolder(new DispatchServlet());
        // root.addServlet(servlet, "/Acra/*");

        // For all filters
        /* The following filters are normally used when the developer tries to
         * avoid using the web.xml file.
         */
        EnumSet<DispatcherType> dispatcherType = EnumSet.of(
                DispatcherType.REQUEST, DispatcherType.FORWARD,
                DispatcherType.ASYNC);

        // Configure filters
        FilterHolder filter = new FilterHolder();
        filter.setName("FileUploadFilter");
        filter.setClassName("org.eclipse.jetty.servlets.MultiPartFilter");
        filter.setInitParameter("deleteFiles", "true");
        context.addFilter(filter, "/Files/upload", dispatcherType);

        filter = new FilterHolder();
        filter.setName("GzipFilter");
        filter.setClassName("org.eclipse.jetty.servlets.GzipFilter");
        filter.setInitParameter("mimeTypes", "text/html," + "text/plain,"
                + "text/xml," + "application/xhtml+xml," + "text/css,"
                + "application/javascript," + "application/json,"
                + "image/svg+xml");
        context.addFilter(filter, "/*", dispatcherType);

        filter = new FilterHolder();
        filter.setName("CrossOriginFilter");
        filter.setClassName("org.eclipse.jetty.servlets.CrossOriginFilter");
        filter.setInitParameter("allowedMethods", "GET," + "POST," + "PUT,"
                + "DELETE," + "OPTIONS");
        context.addFilter(filter, "/*", dispatcherType);
 }
```


das ist so ziemlich alles zu unserer Config.


----------



## turtle (8. Jun 2014)

Ich kenne mich mit jetty nicht aus, bin aber ganz gut mit Tomcat unterwegs und habe damit mehrere Cluster in Betrieb genommen.

Daher kann ich jetzt "nur" raten, aber folgende Zeile kommt mir "verdächtig" vor:

```
/Files/upload
```
Das würde ich mal zum Test auf *Files/uploaded* ändern


----------



## Goldfish (8. Jun 2014)

oh mein Gott, wie konnte ich das übersehen`?
Der Code ist nicht von mir... aber ich hab etwa 30 mal rübergelesen und hab das nicht gepeilt XD
Danke, würde vor dir auf die Knie fallen, wenn das nicht zu peinlich wäre ^^ 
Sauber, jetzt kann ich endlich weiter arbeiten. Echt vielen Dank!!! ^^


----------



## turtle (8. Jun 2014)

Bitte, gern geschehen:toll:



> Der Code ist nicht von mir.


SCNR, WENN ich für DEN Satz jedesmal 5 Euro bekommen hätte, sooft, wie ich den schon gehört habe, wäre ich REICH


----------

