http请求Request Payload 415错误

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处理。

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值