Recentemente, as pessoas costumam pedir a Spring Cloud Feign como fazer upload de arquivos. Existem novos membros da equipe e irmãos de outras empresas. Este artigo resume brevemente -
No início da nuvem da primavera, o Feign em si não tinha a capacidade de fazer upload de arquivos (1 ano atrás). Para conseguir isso, você precisa escrever o codificador sozinho para implementar o upload. Agora estamos muito mais felizes. Porque o funcionário da FEIGN fornece a forma de Feign do subproject, que implementa o codificador necessário para o upload.
Note: The version I tested is Edgware.RELEASE. Camden e Dalston também se adaptam à descrição deste artigo.
Adicione dependência
<Depencency> <PuerpId> io.github.openfeign.form </proupid> <stifactId> Feign-form </ArtifactId> <versão> 3.0.3 </versão </dependency> <pendency> <vroupId> io.github.openfeig.form <//Groupid> <TrAtifactId> Feign> Feign> Feign> <Versão> 3.0.3 </sisters> </dependency>
Escrevendo cliente Feign
@FeignClient(name = "ms-content-sample", configuration = UploadFeignClient.MultipartSupportConfig.class)public interface UploadFeignClient { @RequestMapping(value = "/upload", method = RequestMethod.POST, produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}, consumer = MediaType.Multipart_Form_Data_Value) @ResponseBody String handleFileUpload (@RequestPart (value = "FILE") arquivo multipart de arquivo); classe MultipartSupportConfig {@Bean Public Encoder FeignFormEncoder () {return new SpringForMencoder (); }}}Como o código mostra, neste cliente FEIGN, fazemos referência à classe de configuração MultipartSupportConfig e, no MultipartSupportConfig, instanciamos o SpringFormEnCoder. Dessa forma, o cliente Feign pode ser carregado.
Observação
@RequestMapping (value = "/upload", método = requestmethod.post, produz = {mediatype.application_json_utf8_value}, consumer = mediatype.multipart_form_data_value) não deve estar faltando;A anotação @RequestPart (value = "arquivo") na definição da interface não pode ser gravada como @RequestParam (Value = "File".
É melhor definir o tempo limite do Hystrix um pouco mais, como 5 segundos, caso contrário, o Hystrix pode ter um tempo antes que o arquivo seja enviado, resultando em um erro no lado do cliente.
As armadilhas de usar Feign no SpringCloud
Exemplos são os seguintes:
@FeignClient ("serviço-resource") //@requestmapping ("/api/teste") interface pública testResourceitg {@RequestMapping (value = "/api/test/raw", método = requestmethod.post, consumidores = "Application/x-www-form -mar-urlEncoded" String "Public String11 (Public String, Public. @RequestParam ("Content") String Content); // Contente} Descrição:
* Use consumos no RequestMapping para especificar o tipo de conteúdo da solicitação gerada
*Os parâmetros especificados pelo requestParam serão emendados após o URL, como :? Nome = xxx e idade = 18
*Os parâmetros PathVariable são enviados para um LinkedHashmap <string ,?> para o codificador Feign para processamento. O codificador que implementa essa interface na primavera é o SpringEncoder, e essa implementação usará o httpmessageConverter na primavera para escrever o corpo da solicitação.
Poço:
*Não use requestMapping no nome da classe de interface. Embora possa ser usado, o SpringMVC abrirá a instância da interface como um controlador. Isso pode ser visto no log de mapeamento de inicialização.
*Use o SpringEncoder padrão, quando o consumo não for especificado, os parâmetros no PathVariable geram strings JSON para enviar e o método de geração de formulários não é suportado por padrão. O motivo é que o formhttpmessageConverter pode lidar apenas com o Multivaluemap, enquanto o uso de parâmetros PathVariable é colocado no hashmap. O upload do arquivo não é suportado por padrão. De fato, já existe um httpmessageConverter que apóia o manuseio de várias situações.
Preencha o poço:
*Submissão do formulário de suporte: você só precisa escrever um formhttpmessageConverter que suporta o mapa. Você pode chamar o método de formhttpmessageConverter internamente para simplificar as operações.
*O upload do arquivo de suporte: apenas encapsule o arquivo a ser enviado em um recurso (o recurso deve implementar a interface do nome do arquivo, que é o identificador de analisar os parâmetros de solicitação em um arquivo) e usar o recurso padrãohttpmessageConverter para processar.
*Suporte para lidar com os parâmetros multipart -arquivos: basta escrever um multipartfilehttpmessageConverter que suporta multipartfile. Você pode chamar a implementação do ResourceHttpMessAgeconverter internamente. Ao mesmo tempo, observe que ele precisa ser adicionado às partes do formhttpMessageConverter e reescreva o método getFileName de formhttpmessageConverter para apoiar a obtenção de nome do arquivo do FileName da multipart.
*Todos os httpmessageConverter podem ser gerados diretamente no modo @Bean, e a primavera reconhecerá e adicionará automaticamente
Suporte perfeito para o upload de formulário e arquivo:
Plano 1:
Use mapformhttpmessageConverter.java e multipartfilehttpmessageConverter.java em anexos
Faça a seguinte configuração na primavera
@Beanpublic MapFormHttpMessageConverter mapFormHttpMessageConverter(MultipartFileHttpMessageConverter multipartFileHttpMessageConverter) { MapFormHttpMessageConverter mapFormHttpMessageConverter = new MapFormHttpMessageConverter(); mapformhttpmessageConverter.addpartConverter (multipartFileHttpMessageConverter); Retornar mapformhttpmessageConverter;}@beanpublic multipartFileHttpMessageConverter MultipartFileHttpMessageConverter () {Retornar novo MultiPartFileHttpMessageConverter ();} Plano 2:
Usando FeignsPringFormEncoder.java
Na primavera, configure -o da seguinte forma:
@BeanPublic Encoder FeignEncoder (ObjectFactory <HttpMessageConverters> Messageconverters) {return New FeignspringForMencoder (MessagEConverters);} Plano de uso recomendado 1
O Plano 2 é para referência https://github.com/pccan/feign-client-test, não testado
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.