camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jamalissimo <roman.janu...@gmail.com>
Subject Re: Send file via POST request
Date Wed, 13 Mar 2013 13:57:09 GMT
Hi guys,

I am back with the solution. I finally managed how to do that! First thing
was to find out that consumer sends all data in headers and you can't access
the exchange's body. I managed to get data from headers and pass them into
Camel's properties which could be then globally passed wherever I need to.

REST part
------------------------------------------------------------------------------------

	@POST
	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
	@Path("/upload")
	@Produces(MediaType.APPLICATION_JSON)
	public Response uploadFile(MultipartBody multipartBody){
		return null;
	}

JAVA part
------------------------------------------------------------------------------------

/* 
 * Method for parsing CamelHttpQuery
 * The URL query looks like a=1&b=2
 */
public static Map<String, String> getQueryMap(String query) {
		String[] params = query.split("&");
		Map<String, String> map = new HashMap<String, String>();
		for (String param : params) {
			String name = param.split("=")[0];
			String value = param.split("=")[1];
			map.put(name, value);
		}
		return map;
	}

	/*
	 * Setting Camel's properties for @POST Consumer
	 * 
	 * MessageContentList can't be used, because @POST consumer sends all data
in headers.
	 * Therefore there is different way how to get data for properties.
	 */
	public void setupPostProperties(Exchange exchange) throws IOException {
		String query = exchange.getIn().getHeader("CamelHttpQuery").toString();
		Map<String, String> map = getQueryMap(query);

		String Host = map.get("Host");
		String Port = map.get("Port");
		String User = map.get("username");
		String Password = map.get("password");
		String Filename = map.get("pathToFile");
		String FolderId = map.get("folderId");

		exchange.setProperty("HOST", Host);
		exchange.setProperty("PORT", Port);
		exchange.setProperty("USERNAME", User);
		exchange.setProperty("PASSWORD", Password);
		exchange.setProperty("PATH_TO_FILE", Filename);
		exchange.setProperty("FOLDER_ID", FolderId);
		exchange.setProperty("UPLOAD_API", "/webservice/upload.php");

		logger.debug(String.format(
				"setupBasicProperties Host=%s, Port=%s, User=%s, "
						+ "Password=%s, Filename=%s, FolderId=%s",
				Host, Port, User, Password, Filename,
				FolderId));
	}

	/*
	 * Sending @POST HTTP request
	 * 
	 * Here we need org.apache.http.client.HttpClient library installed in
Karaf.
	 * It will not work with org.apache.commons.httpclient.HttpClient
         * You must install org.apache.httpcomponents to Karaf.
         * I am not sure which solution works, but one does :-)
         *
         * osgi:install -s wrap:mvn:org.apache.httpcomponents/httpmime/4.2.3
         * osgi:install -s
wrap:mvn:org.apache.httpcomponents/httpclient/4.2.3
         * osgi:install -s wrap:mvn:org.apache.httpcomponents/httpcore/4.2.3
         *
         * install mvn:org.apache.httpcomponents/httpmime/4.2.3
         * install mvn:org.apache.httpcomponents/httpclient/4.2.3
         * install mvn:org.apache.httpcomponents/httpcore-osgi/4.2.3

	 * 
	 * This method just sets variables which will be sent via @POST request
	 * Using MultipartEntity I can send variables in different format(binary
file and string in this case).
	 * If there is a need to add more parameters, just add one more
entity.addPart() 
	 */
	public void sendPostRequest(Exchange exchange) throws IOException {
		String pathToUploader = "https://" +
exchange.getProperty("HOST").toString() + ":" 
				+ exchange.getProperty("PORT").toString()
				+ exchange.getProperty("UPLOAD_API").toString();

		String filename = exchange.getProperty("PATH_TO_FILE").toString();
		String session_id = exchange.getProperty("SESSION_ID").toString();
		String action = "A";
		String output = "json";
		File myfile = new File(filename);
		
		if(myfile.exists()){

			HttpClient client = new DefaultHttpClient();
			client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION,
HttpVersion.HTTP_1_1);
			HttpPost post = new HttpPost(pathToUploader);
	
			MultipartEntity entity = new
MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
	
			// For File parameters
			entity.addPart("myfile", new FileBody(((File) myfile),
"application/octet-stream"));
	
			// For usual String parameters
			entity.addPart("session_id", new StringBody(session_id, "text/plain",
Charset.forName("UTF-8")));
			entity.addPart("action", new StringBody(action, "text/plain",
Charset.forName("UTF-8")));
			entity.addPart("output", new StringBody(output, "text/plain",
Charset.forName("UTF-8")));
	
			post.setEntity(entity);
	
			String response = EntityUtils.toString(client.execute(post).getEntity(),
"UTF-8");
			exchange.getOut().setBody(response);
	
			client.getConnectionManager().shutdown();
		}else{
			logger.error("File does not exist!!!");
			throw new FileNotFoundException();		
		}

	}

CAMEL ROUTE
---------------------------------------------------------------------------------------------------

		from("cxfrs:bean:myServer")
		  .routeId("myService-mainRoute")
			.choice()		
			/*
			 * Upload part
			 */
			.when(header(Exchange.HTTP_PATH).isEqualTo("/upload"))
				/*
				 * Setting properties for @POST request
				 */
				.beanRef("myserviceBean", "setupPostProperties")
				/*
				 * Authentication and getting session_id
				 */
				.to("direct:getSessionId")
						/*
						 * Here you are telling Camel that you want to send data as @POST
						 */
						.setHeader(Exchange.HTTP_METHOD, constant("POST"))
					/*
					 * Here we send binary file and strings together as @POST HTTP request.
					 * It simulates sending of form via @POST method.
					 * Response is already in JSON format
					 */
					.beanRef("MyBean","sendPostRequest")

			.endChoice();

                /*
                 * Here you just call address where you get session_id
                 * based on your credentials.
                 */
		from("direct:getSessionId")
			.removeHeader(Exchange.HTTP_URI)
			.removeHeader(Exchange.HTTP_PATH)
			.removeHeader(Exchange.HTTP_QUERY)		
				.recipientList(simple(BASE + API + "?" + REST_AUTH_OPTIONS))
						.beanRef("MyBean", "getSessionId");

Hope this will help someone :-)

-Br, Roman




--
View this message in context: http://camel.465427.n5.nabble.com/Send-file-via-POST-request-tp5728674p5729109.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Mime
View raw message