2009-09-24 6 views
0

J'essaie d'imiter une demande de réseau envoyée par une application de source fermée. Ce qui suit est le instantané de demande de réseau capturées à partir de l'application source fermé:Utilisation de Jakarta HttpClient pour imiter une requête réseau POST

- 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 

J'utilise httpclient pour imiter la demande ci-dessus.

/** 
* @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(); 
    } 
} 

Cependant, il n'y a pas de réponse du côté serveur. J'essaie de capturer mon instantané de requête réseau:

- 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 

Il semble qu'il y ait deux grandes différentes:

(1) URI

(2) Charge utile

Est-ce que je manquer dans mon code httpclient?

Après plusieurs expériences, je me rends compte que httpclient effectue un encodage d'URL sur ma charge utile. Il se explicitement

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

à

1155.KL% 2C1295.KL% 2C7191.KL% 2C0097.KL Pour éviter ceci, j'écris un code de test. Le code de test suivant fonctionne!

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) { 
} 

Ce qui suit est l'instantané capturé:

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 
+0

Pouvez-vous saisir la demande brute? Peut-être que les listes qui apparaissent dans votre instantané sont affichées comme ceci: SORT = 0 & SORT = 1 & SORT = 0 ... mais le logiciel que vous utilisez pour capturer la demande fait une jolie impression des listes. – Serxipc

+0

Maintenant la vraie question est, comment je peux éviter HttpClient d'effectuer le codage d'URL sur mon payload? –

+0

S'il vous plaît, essayez http://www.fiddler2.com/ ou http://www.charlesproxy.com/ pour capturer la demande brute afin que nous puissions voir comment les listes sont affichées. Fiddler est gratuit mais ne fonctionne que sur Windows. Charles a un essai gratuit de 30 jours. – Serxipc

Répondre

1

A en juger par la façon dont les noms de paramètres sont affichés dans votre SORT de capture vs [SORT]. Je soupçonne que le serveur vous attend d'envoyer le tableau avec plusieurs contrôles de formulaire, comme

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

Ils font probablement cela comme une mesure de sécurité, car cela peut Ne soyez pas fait avec HTML.

EDIT: Vous devez passer vos paramètres comme celui-ci,

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

C'est la façon dont les multiples valeurs sélectionnées sont affichées. – Serxipc

+0

Voir ma modification .................... –

+0

Non. Cela ne fonctionne pas. Le serveur s'attend à voir l'original "[SORT] = 0,1,0,10,5,0, KL, 0 & [FIELD] = 33, ....". Mais HttpClient va toujours effectuer un encodage d'URL. Je teste en utilisant le socket TCP brut avec des données sans encodage, ça marche très bien. Cependant, j'ai besoin d'utiliser HttpClient car il supporte NTLM. –

0

Comment avez-vous créé l'instantané? Que signifient les parenthèses autour des noms de paramètres? Existe-t-il plusieurs valeurs pour le même paramètre au lieu d'une avec une valeur séparée par une virgule ou le nom du paramètre doit-il être placé entre crochets?

1

Il vous manque aussi les en-têtes: Encaisser Cache-Control Pragma

Accepter seul en-tête peut être suffisant pour que le serveur répond avec quelque chose de significatif. Essayez quelque chose comme ça pour 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"); 
     } 
    }); 

Ou quelque chose comme ça pour 3.x httpclient:

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

Désolé. J'utilise HttpClient 3.1 –

Questions connexes