java 模拟发送http请求,需要发送Request Payload的请求。
相关的curl命令如下:
curl --request POST \ --user user:password \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --data ' "something"' \ --url 'url'
浏览器的开发者工具中的参数如下:
使用java模拟请求代码如下,返回状态码为415
public static String post(String url, String data) throws IOException {
logger.debug("url:{}, data:{}", url, data);
String password = new BASE64Encoder().encode(("user:password").getBytes()).replaceAll("\n", "");
HttpClient httpClient = HttpUtil.genHttpClient();
HttpPost post = new HttpPost(url);
post.setHeader("Content-Type", "application/x-www-form-urlencoded");
post.setHeader("Authorization", "Basic " + password);
StringEntity entity = new StringEntity(data, "UTF-8");
HttpContext context = new BasicHttpContext();
post.setEntity(entity);
HttpResponse response = httpClient.execute(post, context);
String result = EntityUtils.toString(response.getEntity(), "UTF-8");
return result;
}
public static HttpClient genHttpClient() {
// HttpClient配置
HttpParams mHttpParams = new BasicHttpParams();
//设置网络链接超时
HttpConnectionParams.setConnectionTimeout(mHttpParams, 60 * 1000);
//设置socket响应超时
HttpConnectionParams.setSoTimeout(mHttpParams, 60 * 1000);
//设置socket缓存大小
HttpConnectionParams.setSocketBufferSize(mHttpParams, 20 * 1024);
// 按照配置生成HttpClient实例
HttpClient httpClient = new DefaultHttpClient(mHttpParams);
return httpClient;
}
返回的状态码: 415
问题: Request Payload的参数怎么设置?
问题解决方案:
httpclient模拟发送的请求的参数data中没有加双引号。
该问题是jira的二次开发,添加watcher中遇到的,看了jira 相关jar包的实现的源码如下:
//com.atlassian.jira.rest.client.internal.async.AsynchronousIssueRestClient
@Override
public Promise<Void> addWatcher(final URI watchersUri, final String username) {
return post(watchersUri, JSONObject.quote(username));
}
//org.codehaus.jettison.json.JSONObject
public static String quote(String string) {
if(string != null && string.length() != 0) {
boolean c = false;
int len = string.length();
StringBuffer sb = new StringBuffer(len + 4);
sb.append('\"');
for(int i = 0; i < len; ++i) {
char var6 = string.charAt(i);
switch(var6) {
case '\b':
sb.append("\\b");
break;
case '\t':
sb.append("\\t");
break;
case '\n':
sb.append("\\n");
break;
case '\f':
sb.append("\\f");
break;
case '\r':
sb.append("\\r");
break;
case '\"':
case '\\':
sb.append('\\');
sb.append(var6);
break;
case '/':
sb.append('\\');
sb.append(var6);
break;
default:
if(var6 < 32) {
String t = "000" + Integer.toHexString(var6);
sb.append("\\u" + t.substring(t.length() - 4));
} else {
sb.append(var6);
}
}
}
sb.append('\"');
return sb.toString();
} else {
return "\"\"";
}
}
解决方案:对传递的data参数进行quote处理。