我正在尝试在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;
...
答案 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。