2

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

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

2012-09-10 15:12:05G 信息:G2OAuth 身份验证数据 =“3、0.0.0.0、0.0.0.0、1347289925、3223833979、crlakamai”2012-09-10 15:12:05G 信息:G2OAuth 签名字符串 =“ 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

响应如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>
<stat directory="/182232">
        <file type="file" name="log4j.properties" mtime="1346780907" size="301" md5="c92268157f1732a05c2027d151fc539a"/>
</stat>

这是我的 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<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(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]"

我想接受编码另一个标题作为帖子的一部分,我该如何添加它们?我相信它必须是发布请求的一部分,而不是 http 标头。

4

2 回答 2

8

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

以下是使用 HTTP 客户端发送它的方法:

httpPostRequest.setHeader("Content-Length", "6"); 
httpPostRequest.setHeader("Accept-Encoding", "identity"); 
httpPostRequest.setHeader("Host", "a.host.com");
于 2012-09-10T21:03:12.790 回答
6

如果你想改变 Http Header Accept-Encoding,你可以这样改变

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

您的代码

final List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(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 请求正文中发送值对,而不是在标题中

于 2013-08-12T13:45:36.037 回答