2017-01-11 34 views
-1

如何在$ http post方法中隱藏params。如果我使用數據而不是參數給出的例子,我已經將request.getParameter(「key」)中的近400個服務器端請求獲取器更改爲request.getReader(); 我在這裏有一個情況。我們即將從request.getParameter遷移到request.getReader。 原因:從請求URL中刪除表單參數。

從此:http://localhost:8080/myApp/test.do?test1=abc&test2=def

這樣:http://localhost:8080/myApp/test.do

這裏是我所取得的成就。 樣本請求(舊):

  $scope.myJson = { 
     'abc' : '123', 
     'def' : '456', 
    }; 

    $http({ 

     method : 'POST', 
     url : 'test.do', 
     param : { 
      'test1' : $scope.myJson, 
     }, 
     headers : { 
      'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8' 
     } 
    }). success(function(data, status, headers, config) { 


    }). 
    error(function(data, status, headers, config) { 
    }); 

樣品要求新

  $scope.myJson = { 
     'abc' : '123', 
     'def' : '456', 
    }; 

    $http({ 

     method : 'POST', 
     url : 'test.do', 
     data: { 
      'test1' : $scope.myJson, 
     }, 
     headers : { 
      'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8' 
     } 
    }). success(function(data, status, headers, config) { 


    }). 
    error(function(data, status, headers, config) { 
    }); 

,你可以看到我已經改變參數去的數據。

服務器端(舊);

final String myJson= request.getParameter("test1"); 

服務器端(新):

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

     try { 
     JSONObject jsonObj = new JSONObject(jb.toString()); 
     JSONObject jsonObj1 =jsonObj.getJSONObject("test1"); 
     String test1= jsonObj1.toString(); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

這是處理這個之情況的方式,我們在應用周圍400+服務。任何快速解決方法?

編輯1:

public class myController extends AjaxBaseController { 


    @Override 
    public ModelAndView executeAjaxCall(final HttpServletRequest request, final HttpServletResponse response) { 


     final String test1= request.getParameter("test1");    

     final InputParam loginParam = JsonUtil.convertPojo(test1,InputParam .class); // POJO class 
//other logics 

    }; 
} 
+0

你缺少Spring MVC中的全部要點。你應該幾乎從不直接使用HttpServletRequest,在Spring控制器中你定義了請求的信息,而Spring完成所有的解析,所以你只需要擔心邏輯。 –

回答

0

您必須更改queryParameters到FormParam

+0

您的意思是將param:{「name」:「abc」}更改爲data:{「name」:「abc」}? –

+0

不,有5個策略在http發送數據 https://www.soapui.org/rest-testing/understanding-rest-parameters.html – HichMAN

1

首先,這種「隱藏」你正在做的是不會讓你的API的更安全。如果有人可以看到HTTP請求,那麼在正文中發送的參數與在請求URL中發送的參數相比,並不是那麼難。

(如果你想隱藏來自第三方的參數,可以使用HTTPS。如果你想從用戶隱藏它們....抱歉,這是不可能的。)


假設你在做什麼是值得的,並且你想保持重新編碼的努力將服務器端改變到最低限度,那麼我建議你設計一個實用程序/幫助器方法,它等價於你的「新」服務器端代碼。這裏是一個起點......

public JSONObject getRequestParams(Request request) { 
    StringBuffer jb = new StringBuffer(); 
    String line = null; 
    try { 
     BufferedReader reader = request.getReader(); 
     while ((line = reader.readLine()) != null) { 
      jb.append(line); 
     } 
    } catch (IOException e) { 
     /*report/handle error*/ 
    } 

    try { 
     return = new JSONObject(jb.toString()); 
    } catch (JSONException e) { 
     /* report/handle error */ 
    } 
} 

那麼你的具體的例子可以被編碼爲:

final JSONObject myJson = 
     getRequestParams(request).getJSONObject("test1"); 

取決於你需要處理參數的範圍,你可以有不同的輔助方法獲取單個參數,多個參數,處理「可選」和「必需」參數,爲響應生成一致的狀態碼和錯誤報告等等。

一般原則是檢查400個左右REST API調用的代表性樣本,並花時間設計輔助方法,以便可以簡潔高效地提取參數。


UPDATE - 我沒有注意到,這是一個Spring MVC的項目。這大大改變了事情。如果您使用Spring MVC的請求映射基礎結構(正確),它將透明地處理在URL和主體中傳遞的參數;見Klaus Groenbaek的回答。

+0

是的..這是我的想法。我真的在想如果可以在$ http本身更好地處理。實際上,新的要求是構造api調用,其中params不與請求URL一起提供。 –

2

我不認爲圍繞改變你的控制器有什麼(好的)方法(以及爲什麼地球上你手工處理參數,這是Spring的原因)。

在春天PARAMS被解析成單獨的方法參數與@RequestParam這樣的:

public String doWork(@RequestParam("name") String value, .......) 

你想改變這種做法,後端,而不是接收JSON數據,這是春季使用@RequestBody辦理了由HttpMessageConverter這是支持根據發佈的Context-Type標題選擇。而像這樣

public String doWork(@RequestBody MyDto object) 

我知道春天的網絡堆棧非常好,我可能會找到解決的辦法,但它是一個壞主意,而只會讓你在未來的問題(當一些一個想從JSON發佈一個列表),我甚至不會嘗試提出一個解決方案。

一兩件事,可能使轉換得更快,如果你有400種控制器方法,所以跳過DTO一步,使用Map這樣

public String doRequest(@RequestBody Map<String, String> map) { 
    String abc = map.get("abc"); 
    String def = map.get("def"); 
} 
+0

其實它已經部分完成了遷移項目。我已經更新了我的答案。查看EDIT1:。 –