2016-10-20 45 views
0

我們使用Zuul作爲邊緣服務器。我想編寫一個過濾器,它將來自入​​站請求的multipart/form-data替換爲具有該請求的第一個應用程序/ json部分的實體。用Zuul操縱請求主體

使得例如與multipart內容要求:

[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; 
}