2016-10-20 3 views
0

우리는 Zuul을 에지 서버로 사용하고 있습니다. 인바운드 요청의 multipart/form-data를 해당 요청의 첫 번째 application/json 부분을 가진 엔티티로 대체하는 필터를 작성하고 싶습니다.요청 주체를 Zuul로 조작하십시오.

그래서 멀티 파트에 그 예를 들어 요청 :

[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

나는 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; 
} 
관련 문제