UrlEncodedFormEntity未按预期工作

时间:2016-07-03 16:43:43

标签: java http-post httpclient

我正在尝试在java中发出POST请求,但这没有按预期工作。

关注this post,这是我目前拥有的代码

UrlEncodedFormEntity entity = new UrlEncodedFormEntity(data, Consts.UTF_8);

我无法理解的是,在调试时,data是一个ArrayList<NameValuePair>,调试器显示的值为

  

[Content-Type = text / json,Authorization = Bearer bZXL7hwy5vo7YnbiiGogKy6WTyCmioi8]

完全可以预料到,在完全失败的情况下,在此次调用之后,实体的值是,

  

[Content-Type:application / x-www-form-urlencoded; charset = UTF-8,Content-Length:78,Chunked:false]

呼叫完全没有做任何事情,只是忽略了我传递的数据。

我在这里做错了什么?

修改

更多代码

呼叫者

    String authURL = "https://api.ecobee.com/1/thermostat";
    authURL += "?format=json&body=" + getSelection();

    // request headers
    ArrayList<BasicNameValuePair> nvps = new ArrayList<BasicNameValuePair>();
    nvps.add(new BasicNameValuePair("Content-Type", "text/json"));
    nvps.add(new BasicNameValuePair("Authorization", "Bearer " + code));

    // make the api call
    String apiResponse = HttpUtils.makeRequest(RequestMethod.POST, authURL, nvps);

makeRequest 方法

public static String makeRequest(RequestMethod method, String url, ArrayList<BasicNameValuePair> data) {

    try {

        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpRequestBase request = null;

        switch (method) {

        case POST:

            // new post request
            request = new HttpPost(url);

            // encode the post data
            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(data, Consts.UTF_8); // <-- this is where I have the issue
            ((HttpPost) request).setEntity(entity);
            break;

            ...

2 个答案:

答案 0 :(得分:1)

正如所讨论的,它不起作用的原因是标题应该直接在请求而不是实体中设置。

所以你可以使用下面的东西:

UrlEncodedFormEntity entity = new UrlEncodedFormEntity(data, Consts.UTF_8);

request.setHeader("Content-type", "application/json");
request.setHeader("Authorization","Bearer bZXL7hwy5vo7YnbiiGogKy6WTyCmioi8");

request.setEntity(entity);

答案 1 :(得分:0)

Content-Type / Authorization是标题,因此应按照评论中的建议使用setHeader()传递。

更新:Content-Type应为 application / json 而不是 text / json

您应该使用StringEntity并传​​递getSelection()的结果,而不是UrlEncodedFormEntity / BasicNameValuePair。