2016-04-12 15 views
0

için HTTP istek parametrelerini al Benim nesneyi oluşturmama izin vermek için Spring'in AbstractHttpMessageConverter uygulamasını kullanıyorum.Spring HTTPMessageConverter

Dönüştürücü readINternal olarak

public class PaypalIPNHttpMessageConverter extends AbstractHttpMessageConverter<IPNMessage> { 

    public PaypalIPNHttpMessageConverter() { 
     super(MediaType.APPLICATION_FORM_URLENCODED, MediaType.TEXT_PLAIN); 
    } 

    @Override 
    protected boolean supports(Class<?> clazz) { 
     return clazz == IPNMessage.class; 
    } 

    @Override 
    protected IPNMessage readInternal(Class<? extends IPNMessage> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { 
     //Converts HTTPRequest into map<string,string> that IPNMessage can then parse 
     String requestString = IOUtils.toString(inputMessage.getBody(), "UTF-8"); 
     Map<String, String[]> requestMap = new LinkedHashMap<>(); 
     for (String keyValue : requestString.split("&")) { //each key value is delimited by & 
      String[] pairs = keyValue.split("=", 2); // = pairs a key to a value 
      requestMap.put(pairs[0], pairs[1].split(",")); // , splits multiple values for that key 
     } 
     return new IPNMessage(requestMap); 
    } 

    @Override 
    protected void writeInternal(IPNMessage ipnMessage, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { 

    } 
} 

(), öyle geçirilen tek HTTPRequest bir InputStream üreten getBody() işlevi olan bir HttpInputMessage nesnesi.

ParametreMap'ı ayrıştırmak ve oluşturmak için kendi kodumu yazmayı denedim, ancak işlenmemiş kodlamanın farklı olması durumunda her zaman çalışmaz.

ben dönüştürücüden Spring'in WebRequest veya HttpServletRequest nesneyi almak ve orada harika getParameterMap() işlevini kullanabilirsiniz yine de var mı?

TL;

DR ben harika getParameterMap yerine tekerleği yeniden keşfetmek() işlevini kullanabilirsiniz böylece yerine HttpInput ait MessageConverter içinde WebRequest veya HttpServletRequest kullanmak yine de var mı?

Teşekkür

+0

Genellikle sadece autowire HttpServletRequest yönetilen fasulye bahara (örneğin sadece bir alan olarak bu ekleyin: '@Autowired HttpServletRequest istek;') olabilir kullanır. Spring framework'ün mesaj dönüştürücülerindeki URL parametrelerine erişme niyetinde olmadığını unutmayın. İşlevsellikinizi daha iyi hale getirmek için daha iyi yerler olabilir (dönüşüm hizmeti? Argüman çözümleyicileri?) –

cevap

2

o İlkbahar FormHttpMessageConverter nasıl uygulandığını bak. Çözümünüz gibi & kullanarak istek parametresini belirtir. Bununla birlikte, karakter kümesini, sağlanmışsa İçerik Türü istek başlığından kullanacak şekilde diormines. Aksi durumda, varsayılan UTF-8

//extract from FormHttpMessageConverter 
public MultiValueMap<String, String> read(Class<? extends MultiValueMap<String, ?>> clazz, 
      HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { 

     MediaType contentType = inputMessage.getHeaders().getContentType(); 
     Charset charset = (contentType.getCharSet() != null ? contentType.getCharSet() : this.charset); 
     String body = StreamUtils.copyToString(inputMessage.getBody(), charset); 

     String[] pairs = StringUtils.tokenizeToStringArray(body, "&"); 
     MultiValueMap<String, String> result = new LinkedMultiValueMap<String, String>(pairs.length); 
     for (String pair : pairs) { 
      int idx = pair.indexOf('='); 
      if (idx == -1) { 
       result.add(URLDecoder.decode(pair, charset.name()), null); 
      } 
      else { 
       String name = URLDecoder.decode(pair.substring(0, idx), charset.name()); 
       String value = URLDecoder.decode(pair.substring(idx + 1), charset.name()); 
       result.add(name, value); 
      } 
     } 
     return result; 
    }