簡體   English   中英

使用Jakarta HttpClient模仿POST網絡請求

[英]Using Jakarta HttpClient to mimic a POST network request

我嘗試模仿封閉源應用程序發送的網絡請求。 以下是從封閉源應用程序捕獲的網絡請求快照:

- Http: Request, POST /%5bvUpJYKw4QvGRMBmhATUxRwv4JrU9aDnwNEuangVyy6OuHxi2YiY=%5dImage
    Command: POST
  - URI: /%5bvUpJYKw4QvGRMBmhATUxRwv4JrU9aDnwNEuangVyy6OuHxi2YiY=%5dImage?
     Location: /%5bvUpJYKw4QvGRMBmhATUxRwv4JrU9aDnwNEuangVyy6OuHxi2YiY=%5dImage
    ProtocolVersion: HTTP/1.1
  - ContentType:  application/x-www-form-urlencoded
     MediaType:  application/x-www-form-urlencoded
    Cache-Control:  no-cache
    Pragma:  no-cache
    UserAgent:  Mozilla/4.0 (Windows XP 5.1) Java/1.6.0_06
    Host:  www.xxx.com:20000
    Accept:  text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
    Connection:  keep-alive
    ContentLength:  164
    HeaderEnd: CRLF
  - payload: HttpContentType =  application/x-www-form-urlencoded
     [SORT]: 0,1,0,10,5,0,KL,0
     [FIELD]: 33,38,51,58,68,88,78,98,99,101,56,57,69,70,71,72,89,90,91,92,59,60,61,62,79,80,81,82
     [LIST]: 1155.KL,1295.KL,7191.KL,0097.KL,2267.KL

我使用httpclient模仿以上請求。

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    try {
        // TODO code application logic here
        HttpClient httpClient = new HttpClient();
        httpClient.getParams().setParameter(HttpMethodParams.USER_AGENT, "Mozilla/4.0 (Windows XP 5.1) Java/1.6.0_06");

        PostMethod post = new PostMethod("http://www.xxx.com:20000/%5bvUpJYKw4QvGRMBmhATUxRwv4JrU9aDnwNEuangVyy6OuHxi2YiY=%5dImage?");

        NameValuePair[] data = {
            new NameValuePair("SORT", "0,1,0,10,5,0,KL,0"),
            new NameValuePair("FIELD", "33,38,51,58,68,88,78,98,99,101,56,57,69,70,71,72,89,90,91,92,59,60,61,62,79,80,81,82"),
            new NameValuePair("LIST", "1155.KL,1295.KL,7191.KL,0097.KL,2267.KL")
        };
        post.setRequestBody(data);
        httpClient.executeMethod(post);
        System.out.println(post.getResponseBodyAsString());       
    }
    catch (Exception exp) {
        exp.printStackTrace();
    }
}

但是,服務器端沒有響應。 我嘗試捕獲自己的網絡請求快照:

- Http: Request, POST /%5bvUpJYKw4QvGRMBmhATUxRwv4JrU9aDnwNEuangVyy6OuHxi2YiY=%5dImage 
    Command: POST
  - URI: /%5bvUpJYKw4QvGRMBmhATUxRwv4JrU9aDnwNEuangVyy6OuHxi2YiY=%5dImage
     Location: /%5bvUpJYKw4QvGRMBmhATUxRwv4JrU9aDnwNEuangVyy6OuHxi2YiY=%5dImage 
    ProtocolVersion: HTTP/1.1
    UserAgent:  Mozilla/4.0 (Windows XP 5.1) Java/1.6.0_06
    Host:  www.xxx.com:20000
    ContentLength:  234
  - ContentType:  application/x-www-form-urlencoded
     MediaType:  application/x-www-form-urlencoded
    HeaderEnd: CRLF
  - payload: HttpContentType =  application/x-www-form-urlencoded
     SORT: 0%2C1%2C0%2C10%2C5%2C0%2CKL%2C0
     FIELD: 33%2C38%2C51%2C58%2C68%2C88%2C78%2C98%2C99%2C101%2C56%2C57%2C69%2C70%2C71%2C72%2C89%2C90%2C91%2C92%2C59%2C60%2C61%2C62%2C79%2C80%2C81%2C82
     LIST: 1155.KL%2C1295.KL%2C7191.KL%2C0097.KL%2C2267.KL

似乎有兩個主要區別:

(1)URI

(2)有效載荷

我的httpclient代碼中有什么我想念的嗎?

經過幾次試驗,我意識到,httpclient在我的有效負載上執行URL編碼。 它明確地變成

1155.KL,1295.KL,7191.KL,0097.KL,2267.KL

1155.KL%2C1295.KL%2C7191.KL%2C0097.KL%2C2267.KL

為了避免這種情況,我編寫了一個測試代碼。 以下測試代碼有效!

try {
    Socket socket = new Socket("www.xxx.com", 20000);
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    final String body = "[SORT]=0,1,0,10,5,0,KL,0&[FIELD]=33,38,51,58,68,88,78,98,99,101,56,57,69,70,71,72,89,90,91,92,59,60,61,62,79,80,81,82&[LIST]=1155.KL,1295.KL,7191.KL,0097.KL,2267.KL";
    final int length = body.length();
    final String s = "POST /%5bvUpJYKw4QvGRMBmhATUxRwv4JrU9aDnwNEuangVyy6OuHxi2YiY=%5dImage? HTTP/1.1\r\nContent-Type: application/x-www-form-urlencoded\r\nCache-Control: no-cache\r\nPragma: no-cache\r\nUser-Agent: Mozilla/4.0 (Windows XP 5.1) Java/1.6.0_06\r\nHost: www.xxx.com:20000\r\nAccept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\nConnection: keep-alive\r\nContent-Length: "+length+"\r\n\r\n" + body;
    out.println(s);

     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
     while(true) {
          String ss = in.readLine();
          if (ss == null) break;
            System.out.println(ss);
     }

}
catch (Exception exp) {
}

以下是捕獲的快照:

  Frame: Number = 16, Captured Frame Length = 597, MediaType = ETHERNET 
+ Ethernet: Etype = Internet IP (IPv4),DestinationAddress:[7C-04-20-00-01-00],SourceAddress:[01-00-01-00-00-00]
+ Ipv4: Src = 10.176.181.55, Dest = 202.75.55.23, Next Protocol = TCP, Packet ID = 956, Total IP Length = 583
+ Tcp: Flags=...AP..., SrcPort=49253, DstPort=20000, PayloadLen=543, Seq=3920474750 - 3920475293, Ack=3537289604, Win=4380 (scale factor 0x2) = 17520
- Http: Request, POST /%5bvUpJYKw4QvGRMBmhATUxRwv4JrU9aDnwNEuangVyy6OuHxi2YiY=%5dImage
    Command: POST
  + URI: /%5bvUpJYKw4QvGRMBmhATUxRwv4JrU9aDnwNEuangVyy6OuHxi2YiY=%5dImage?
    ProtocolVersion: HTTP/1.1
  + ContentType:  application/x-www-form-urlencoded
    Cache-Control:  no-cache
    Pragma:  no-cache
    UserAgent:  Mozilla/4.0 (Windows XP 5.1) Java/1.6.0_06
    Host:  n2ntbfd03.asiaebroker.com:20000
    Accept:  text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
    Connection:  keep-alive
    ContentLength:  164
    HeaderEnd: CRLF
  - payload: HttpContentType =  application/x-www-form-urlencoded
     [SORT]: 0,1,0,10,5,0,KL,0
     [FIELD]: 33,38,51,58,68,88,78,98,99,101,56,57,69,70,71,72,89,90,91,92,59,60,61,62,79,80,81,82
     [LIST]: 1155.KL,1295.KL,7191.KL,0097.KL,2267.KL

您還缺少標題:Accept Cache-Control Pragma

單獨的Accept標頭可能足以使服務器做出有意義的響應。 為httpclient 4嘗試這樣的操作:

   httpclient.addRequestInterceptor(new HttpRequestInterceptor() {
      public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException {
        request.setHeader("Pragma","no-cache");
        request.setHeader("Cache-Control","no-cache");
        request.setHeader("Accept","text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2");
      }
    });

或對於httpclient 3.x來說是這樣的:

method.setRequestHeader("Pragma","no-cache");
method.setRequestHeader("Cache-Control","no-cache");
method.setRequestHeader("Accept","text/html, image/gif, image/jpeg, *; q=.2, */*; 

通過參數名稱在捕獲SORT與[SORT]中的顯示方式來判斷。 我懷疑服務器期望您發送帶有多個表單控件的數組,例如

SORT = 0&SORT = 1&SORT = 0 ...

他們可能將此作為一種安全措施,因為HTML無法做到這一點。

編輯:您需要像這樣傳遞您的參數,

    NameValuePair[] data = {
        new NameValuePair("SORT", "0"),
        new NameValuePair("SORT", "1"),
        ...
        new NameValuePair("FIELD", "33"),
        ...
    };

您是如何創建快照的? 參數名稱周圍的括號是什么意思? 同一參數是否有多個值,而不是用逗號分隔的值?還是應該將參數名稱括在方括號中?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM