如何在$ http post方法中隐藏params。如果我使用数据而不是给定示例中的params,我已经将近400个服务器端请求getter从request.getParameter(“key”)更改为request.getReader();
我有一个情况。我们即将从request.getParameter
迁移到request.getReader
。
原因:从requet 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 :(得分:2)
我认为改变你的控制器没有任何(好的)方法(为什么你要手工处理参数,这就是Spring的用途)。
在Spring中,params被解析为单独的方法参数@RequestParam
,如下所示:
public String doWork(@RequestParam("name") String value, .......)
您希望更改此设置,以便后端接收JSON数据,即使用@RequestBody
支持的HttpMessageConverter
来处理Spring,该Context-Type
是基于发布的public String doWork(@RequestBody MyDto object)
标头选择的。看起来像这样
public String doRequest(@RequestBody Map<String, String> map) {
String abc = map.get("abc");
String def = map.get("def");
}
我非常了解Spring网络堆栈,我可能会找到解决方法,但这是一个糟糕的主意,并且只会在将来给你带来问题(当有人希望从JSON发布一个列表时) ),我甚至不会尝试提出解决方案。
如果您有400个控制器方法,可能会使转换速度更快,因此要跳过DTO步骤并使用像这样的地图
$table->integer('some_field')->unsigned()->nullable();
答案 1 :(得分:1)
首先,你正在做的这个“隐藏”不会让你的API更安全。如果有人可以看到HTTP请求,那么查看正文中发送的params与请求URL中发送的params相比并不困难。
(如果你想隐藏第三方的参数,请使用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的回答。
答案 2 :(得分:0)
您必须将queryParameters更改为FormParam