2016-10-20 3 views
0

Мы используем Zuul в качестве пограничного сервера. Я хочу написать фильтр, который заменяет multipart/form-data из входящего запроса сущностью, которая имеет первую часть приложения/json этого запроса.Манипулировать тело запроса с Zuul

Так что, например, запрос с Multiparts:

[multipart/form-data] 
[Part 1] << Application/JSON (name="info") 
[Part 2] << Binary (name="file") 

переводится в:

[application/json] 
[Contents of Part 1] 

Возможно ли это с Zuul фильтрами, и какой тип фильтра я должен использовать?

+0

, что вы пробовали до сих пор ... и я думаю, что вам нужно предварительно фильтр ... так что вы можете изменить запрос, прежде чем он идет вниз по течению –

+0

я попробовал предварительный фильтр, но вы можете только улучшают заголовки. Я не нашел способа манипулировать телом запроса. Я предполагаю, что один из подходов - переопределить фильтр маршрутизации по умолчанию и взломать обработчик тела запроса, но это не мой предпочтительный способ сделать. – Pepster

+0

Я думаю, что zuul requestContext имеет способ изменить весь запрос. Если вы написали какой-нибудь код, добавьте сюда, чтобы кто-то мог вам помочь. Также проверьте это http://stackoverflow.com/questions/30400817/how-to-pass-modified-wrapped-httpservletrequest-to-subsequent-zuul-filters –

ответ

0

Мне недавно пришлось заглянуть в тело, чтобы выяснить, как направлять сообщения, которые поступали. В приведенном ниже коде показано, как вы можете вытащить тело из запроса и преобразовать его в объект JSON. Это может заставить вас начать.

public class ActivateServicePreFilter extends ZuulFilter { 
@Override 
public String filterType() { 
    return PRE_TYPE; 
} 

@Override 
public int filterOrder() { 
    return 4; 
} 

@Override 
public boolean shouldFilter() { 

    HttpServletRequest request = RequestContext.getCurrentContext().getRequest(); 


    return "POST".equals(request.getMethod()) && request.getRequestURI().contains("uri-string"); 
} 

@Override 
public Object run() { 

    HttpServletRequest request = RequestContext.getCurrentContext().getRequest(); 

    StringBuffer jb = new StringBuffer(); 
    String line = null; 
    try { 
     BufferedReader reader = request.getReader(); 
     while ((line = reader.readLine()) != null) 
      jb.append(line); 
    } catch (Exception e) { /*report an error*/ } 

    try { 
     JSONObject jsonObject = new JSONObject(jb.toString()); 
     String jsonField = jsonObject.getString("jsonFieldKey"); 

     System.out.println(jsonField); 

    } catch (JSONException e) { 
     // crash and burn 

    } 




    return null; 
} 
Смежные вопросы