使用Apache HttpClient的Java HTTPPost请求

我需要一个java程序来生成以下请求。 我正在使用Apache HttpClient库,但仍然无法生成这样的请求:

这是我的python程序生成的,我写了一个等效的java程序。 但它的投掷403。

2012-09-10 15:12:05G INFO:G2OAuth auth data =“3,0.0.0.0,0.0.0.0,1347289925,3223833979,crlakamai”2012-09-10 15:12:05G INFO:G2OAuth sign string =“ 3,0.0.0.0,0.0.0.0,1347289925,3223833979,akamai / 182228 \ nx-akamai-acs-action:version = 1&action = dir&format = xml \ n“

send: 'POST /182228 HTTP/1.1\r\nHost: crl.api.akamailab.com\r\nAccept-Encoding: identity\r\nX-Akamai-ACS-Auth-Data: 3, 0.0.0.0, 0.0.0.0, 1347289925, 3223833979, crlsymc\r\nX-Akamai-ACS-Auth-Sign: eFnWtJBIyj4rxV3V0axF3w==\r\nX-Akamai-ACS-Action: version=1&action=dir&format=xml\r\n\r\n' reply: 'HTTP/1.1 200 OK\r\n' header: Server: Apache header: Content-Type: text/html header: Date: Mon, 10 Sep 2012 15:12:09 GMT header: Content-Length: 31 header: Connection: keep-alive 

响应如下:

           

这是我的Java代码:

  final HttpHost targetHost = new HttpHost("a.host.com", 80, "http"); final DefaultHttpClient httpClient = new DefaultHttpClient(); final Credentials credentials = new UsernamePasswordCredentials("user","pass"); httpClient.getCredentialsProvider().setCredentials(new AuthScope(targetHost.getHostName(), targetHost.getPort()), credentials); final HttpPost httpPostRequest = new HttpPost("akamai/182232"); //Add your Data final List nameValuePairs = new ArrayList(6); nameValuePairs.add(new BasicNameValuePair("Host: ", "a.host.com"); nameValuePairs.add(new BasicNameValuePair("Accept-Encoding: ", "identity")); nameValuePairs.add(new BasicNameValuePair("Content-Length: ", "6")); httpPostRequest.setEntity(new UrlEncodedFormEntity(nameValuePairs)); final HttpResponse response = httpClient.execute(targetHost, httpPostRequest); if (response.getStatusLine().getStatusCode() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatusLine().getStatusCode()); } 

我的回答是这样的。

 2012-09-10 11:31:22,600 DEBUG [wire] >> "POST /182228/a.crl HTTP/1.1[\r][\n]" 2012-09-10 11:31:22,601 DEBUG [wire] >> "Content-Length: 394[\r][\n]" 2012-09-10 11:31:22,601 DEBUG [wire] >> "Content-Type: application/x-www-form-urlencoded; charset=ISO-8859-1[\r][\n]" 2012-09-10 11:31:22,601 DEBUG [wire] >> "Host: crl.api.symclab.com:80[\r][\n]" 2012-09-10 11:31:22,601 DEBUG [wire] >> "Connection: Keep-Alive[\r][\n]" 2012-09-10 11:31:22,601 DEBUG [wire] >> "User-Agent: Apache-HttpClient/4.1.3 (java 1.5)[\r][\n]" 2012-09-10 11:31:22,602 DEBUG [wire] >> "[\r][\n]" 

我希望Accept-Encoding另一个标题作为post的一部分,我该如何添加它们? 它应该是我相信的邮件请求的一部分,而不是http标头。

Accept-Encoding是HTTP标头的一部分,除了您错误地作为POST参数发送的参数:

以下是使用HTTP Client发送它的方法:

 httpPostRequest.setHeader("Content-Length", "6"); httpPostRequest.setHeader("Accept-Encoding", "identity"); httpPostRequest.setHeader("Host", "a.host.com"); 

如果你想改变Http Header Accept-Encoding,你会改变这种情况

 httpPostRequest.setHeader("Accept-Encoding", "identity"); 

你的代码

 final List nameValuePairs = new ArrayList(6); nameValuePairs.add(new BasicNameValuePair("Host: ", "a.host.com"); nameValuePairs.add(new BasicNameValuePair("Accept-Encoding: ", "identity")); nameValuePairs.add(new BasicNameValuePair("Content-Length: ", "6")); httpPostRequest.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

用于在http请求主体中发送值对,而不是在HEADER中