优化参数绑定

1.x
tanghc 5 years ago
parent c40ff46da1
commit a863c00d3f
  1. 31
      sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/bean/OpenContextImpl.java
  2. 34
      sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/util/OpenUtil.java
  3. 7
      sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/controller/AlipayController.java
  4. 2
      sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/controller/TraditionalWebappController.java
  5. 11
      sop-gateway/src/main/java/com/gitee/sop/gateway/controller/RedirectController.java
  6. 56
      sop-test/src/test/java/com/gitee/sop/test/PostFormTest.java

@ -17,18 +17,23 @@ import static com.gitee.sop.servercommon.bean.ParamNames.VERSION_NAME;
* @author tanghc
*/
public class OpenContextImpl<T> implements OpenContext<T> {
private JSONObject jsonObject;
private JSONObject rootJsonObject;
private T bizObject;
public OpenContextImpl(JSONObject jsonObject, Class<?> bizClass) {
this.jsonObject = jsonObject;
JSONObject bizJsonObj = this.jsonObject.getJSONObject(BIZ_CONTENT_NAME);
bizObject = (bizClass == null || bizJsonObj == null) ? null : (T) bizJsonObj.toJavaObject(bizClass);
public OpenContextImpl(JSONObject rootJsonObject, Class<?> bizClass) {
this.rootJsonObject = rootJsonObject;
if (bizClass != null) {
JSONObject bizJsonObj = this.rootJsonObject.getJSONObject(BIZ_CONTENT_NAME);
if (bizJsonObj == null) {
bizJsonObj = rootJsonObject;
}
bizObject = (T) bizJsonObj.toJavaObject(bizClass);
}
}
@Override
public String getAppId() {
return jsonObject.getString(APP_KEY_NAME);
return rootJsonObject.getString(APP_KEY_NAME);
}
@Override
@ -38,36 +43,36 @@ public class OpenContextImpl<T> implements OpenContext<T> {
@Override
public String getBizContent() {
return jsonObject.getString(BIZ_CONTENT_NAME);
return rootJsonObject.getString(BIZ_CONTENT_NAME);
}
@Override
public String getCharset() {
return jsonObject.getString(CHARSET_NAME);
return rootJsonObject.getString(CHARSET_NAME);
}
@Override
public String getMethod() {
return jsonObject.getString(API_NAME);
return rootJsonObject.getString(API_NAME);
}
@Override
public String getVersion() {
return jsonObject.getString(VERSION_NAME);
return rootJsonObject.getString(VERSION_NAME);
}
@Override
public String getFormat() {
return jsonObject.getString(FORMAT_NAME);
return rootJsonObject.getString(FORMAT_NAME);
}
@Override
public String getSignType() {
return jsonObject.getString(SIGN_TYPE_NAME);
return rootJsonObject.getString(SIGN_TYPE_NAME);
}
@Override
public Date getTimestamp() {
return jsonObject.getDate(TIMESTAMP_NAME);
return rootJsonObject.getDate(TIMESTAMP_NAME);
}
}

@ -5,9 +5,9 @@ import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.MediaType;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@ -19,39 +19,37 @@ import java.util.Set;
@Slf4j
public class OpenUtil {
private static final String CONTENT_TYPE_URLENCODED = "application/x-www-form-urlencoded";
private static final String CONTENT_TYPE_JSON = "application/json";
private static final String CONTENT_TYPE_TEXT = "text/plain";
private static final String UTF8 = "UTF-8";
/**
* 从request中获取参数如果提交方式是application/x-www-form-urlencoded则组装成json格式
* 获取request中的参数
*
* @param request request对象
* @return 返回json
* @throws IOException
* @return 返回JSONObject
*/
public static JSONObject getRequestParams(HttpServletRequest request) {
String requestJson = "{}";
String contentType = request.getContentType();
if (StringUtils.isBlank(contentType)) {
return new JSONObject();
if (contentType == null) {
contentType = "";
}
contentType = contentType.toLowerCase();
if (StringUtils.containsAny(contentType, CONTENT_TYPE_JSON, CONTENT_TYPE_TEXT)) {
JSONObject jsonObject;
if (StringUtils.containsAny(contentType, MediaType.APPLICATION_JSON_VALUE, MediaType.TEXT_PLAIN_VALUE)) {
try {
requestJson = IOUtils.toString(request.getInputStream(), UTF8);
} catch (IOException e) {
String requestJson = IOUtils.toString(request.getInputStream(), UTF8);
jsonObject = JSON.parseObject(requestJson);
} catch (Exception e) {
jsonObject = new JSONObject();
log.error("获取文本数据流失败", e);
}
} else if (StringUtils.containsAny(contentType, CONTENT_TYPE_URLENCODED)) {
} else {
Map<String, Object> params = convertRequestParamsToMap(request);
requestJson = JSON.toJSONString(params);
jsonObject = new JSONObject(params);
}
return JSON.parseObject(requestJson);
return jsonObject;
}
/**
* request中的参数转换成map
*
@ -60,7 +58,7 @@ public class OpenUtil {
*/
public static Map<String, Object> convertRequestParamsToMap(HttpServletRequest request) {
Map<String, String[]> paramMap = request.getParameterMap();
if(paramMap == null || paramMap.isEmpty()) {
if (paramMap == null || paramMap.isEmpty()) {
return Collections.emptyMap();
}
Map<String, Object> retMap = new HashMap<String, Object>(paramMap.size());

@ -64,6 +64,13 @@ public class AlipayController {
return story;
}
// 忽略验证
@ApiMapping(value = "story.get", version = "2.1", ignoreValidate = true)
public Story getStory21(Story story) {
story.setName(story.getName() + ", story.get2.1, ignoreValidate = true");
return story;
}
// http://localhost:2222/getStory2
// 遗留接口具备开放平台能力
@ApiAbility

@ -45,7 +45,7 @@ public class TraditionalWebappController {
}
// http://localhost:8081/rest/food/getFoodByObj?id=2
@ApiMapping(value = "ggetFoodByObj", method = RequestMethod.GET)
@ApiMapping(value = "getFoodByObj", method = RequestMethod.GET)
public Food getFoodByObj(Food food) {
return food;
}

@ -1,6 +1,8 @@
package com.gitee.sop.gateway.controller;
import com.gitee.sop.gatewaycommon.bean.SopConstants;
import com.gitee.sop.gatewaycommon.param.ParamNames;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
@ -29,7 +31,14 @@ public class RedirectController {
) throws ServletException, IOException {
request.setAttribute(SopConstants.REDIRECT_METHOD_KEY, method);
request.setAttribute(SopConstants.REDIRECT_VERSION_KEY, version);
request.getRequestDispatcher(path).forward(request, response);
String queryString = request.getQueryString();
String versionQuery = ParamNames.VERSION_NAME + '=' + version;
if (StringUtils.isBlank(queryString)) {
queryString = versionQuery;
} else {
queryString = queryString + '&' + versionQuery;
}
request.getRequestDispatcher(path + '?' + queryString).forward(request, response);
}
}

@ -0,0 +1,56 @@
package com.gitee.sop.test;
import com.alibaba.fastjson.JSON;
import com.gitee.sop.test.alipay.AlipaySignature;
import org.junit.Test;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* post请求模拟表单提交application/x-www-form-urlencoded
*/
public class PostFormTest extends TestBase {
String url = "http://localhost:8081/api"; // zuul
String appId = "2019032617262200001";
// 支付宝私钥
String privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCXJv1pQFqWNA/++OYEV7WYXwexZK/J8LY1OWlP9X0T6wHFOvxNKRvMkJ5544SbgsJpVcvRDPrcxmhPbi/sAhdO4x2PiPKIz9Yni2OtYCCeaiE056B+e1O2jXoLeXbfi9fPivJZkxH/tb4xfLkH3bA8ZAQnQsoXA0SguykMRZntF0TndUfvDrLqwhlR8r5iRdZLB6F8o8qXH6UPDfNEnf/K8wX5T4EB1b8x8QJ7Ua4GcIUqeUxGHdQpzNbJdaQvoi06lgccmL+PHzminkFYON7alj1CjDN833j7QMHdPtS9l7B67fOU/p2LAAkPMtoVBfxQt9aFj7B8rEhGCz02iJIBAgMBAAECggEARqOuIpY0v6WtJBfmR3lGIOOokLrhfJrGTLF8CiZMQha+SRJ7/wOLPlsH9SbjPlopyViTXCuYwbzn2tdABigkBHYXxpDV6CJZjzmRZ+FY3S/0POlTFElGojYUJ3CooWiVfyUMhdg5vSuOq0oCny53woFrf32zPHYGiKdvU5Djku1onbDU0Lw8w+5tguuEZ76kZ/lUcccGy5978FFmYpzY/65RHCpvLiLqYyWTtaNT1aQ/9pw4jX9HO9NfdJ9gYFK8r/2f36ZE4hxluAfeOXQfRC/WhPmiw/ReUhxPznG/WgKaa/OaRtAx3inbQ+JuCND7uuKeRe4osP2jLPHPP6AUwQKBgQDUNu3BkLoKaimjGOjCTAwtp71g1oo+k5/uEInAo7lyEwpV0EuUMwLA/HCqUgR4K9pyYV+Oyb8d6f0+Hz0BMD92I2pqlXrD7xV2WzDvyXM3s63NvorRooKcyfd9i6ccMjAyTR2qfLkxv0hlbBbsPHz4BbU63xhTJp3Ghi0/ey/1HQKBgQC2VsgqC6ykfSidZUNLmQZe3J0p/Qf9VLkfrQ+xaHapOs6AzDU2H2osuysqXTLJHsGfrwVaTs00ER2z8ljTJPBUtNtOLrwNRlvgdnzyVAKHfOgDBGwJgiwpeE9voB1oAV/mXqSaUWNnuwlOIhvQEBwekqNyWvhLqC7nCAIhj3yvNQKBgQCqYbeec56LAhWP903Zwcj9VvG7sESqXUhIkUqoOkuIBTWFFIm54QLTA1tJxDQGb98heoCIWf5x/A3xNI98RsqNBX5JON6qNWjb7/dobitti3t99v/ptDp9u8JTMC7penoryLKK0Ty3bkan95Kn9SC42YxaSghzqkt+uvfVQgiNGQKBgGxU6P2aDAt6VNwWosHSe+d2WWXt8IZBhO9d6dn0f7ORvcjmCqNKTNGgrkewMZEuVcliueJquR47IROdY8qmwqcBAN7Vg2K7r7CPlTKAWTRYMJxCT1Hi5gwJb+CZF3+IeYqsJk2NF2s0w5WJTE70k1BSvQsfIzAIDz2yE1oPHvwVAoGAA6e+xQkVH4fMEph55RJIZ5goI4Y76BSvt2N5OKZKd4HtaV+eIhM3SDsVYRLIm9ZquJHMiZQGyUGnsvrKL6AAVNK7eQZCRDk9KQz+0GKOGqku0nOZjUbAu6A2/vtXAaAuFSFx1rUQVVjFulLexkXR3KcztL1Qu2k5pB6Si0K/uwQ=";
@Test
public void testPostForm() throws Exception {
// 公共请求参数
Map<String, String> params = new HashMap<String, String>();
params.put("app_id", appId);
params.put("method", "demo.post.json");
params.put("format", "json");
params.put("charset", "utf-8");
params.put("sign_type", "RSA2");
params.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
params.put("version", "1.0");
// 业务参数
Map<String, String> bizContent = new HashMap<>();
bizContent.put("name", "葫芦娃");
params.put("biz_content", JSON.toJSONString(bizContent));
System.out.println("----------- 请求信息 -----------");
System.out.println("请求参数:" + buildParamQuery(params));
System.out.println("商户秘钥:" + privateKey);
String content = AlipaySignature.getSignContent(params);
System.out.println("待签名内容:" + content);
String sign = AlipaySignature.rsa256Sign(content, privateKey, "utf-8");
System.out.println("签名(sign):" + sign);
params.put("sign", sign);
System.out.println("----------- 返回结果 -----------");
String responseData = post(url, params);// 发送请求
System.out.println(responseData);
}
}
Loading…
Cancel
Save