2016-03-30 7 views
0

http istemci apache API'sini sınamaya başladım. İhtiyacım var çünkü istekleri göndermek ve virustotal API'ye yanıt almak istiyorum. Virüs toplam API sonrası isteğindeki parametrelere gerektirir: Ben kendi web sitesinden anlaşıldığı olarakDosya + api anahtarı ve diğer parametreleri tek bir istek olarak göndermek için apache httpClient API'sini nasıl kullanırım?

  1. api anahtarı değeri (her kullanıcı için benzersiz bir değer)
  2. dosya kendisi. Örneğin

: Şu anda

>>> url = "https://www.virustotal.com/vtapi/v2/url/scan" 
>>> parameters = {"url": "http://www.virustotal.com", 
...    "apikey": "-- YOUR API KEY --"} 
>>> data = urllib.urlencode(parameters) 
>>> req = urllib2.Request(url, data) 

, ben Java yerine Python aynı şeyi yapmaya çalışıyorum.

CloseableHttpClient httpClient = HttpClientBuilder.create().build(); 
    //create post request 
    HttpPost request = new HttpPost("https://www.virustotal.com/vtapi/v2/file/scan"); 
    //http json header 
    request.addHeader("content-type", "application/json"); 

    String str = gson.toJson(param); 

    String fileName = UUID.randomUUID().toString() + ".txt"; 

    try { 
    //API key 
    StringEntity entity = new StringEntity(str); 
    Writer writer = new BufferedWriter(new FileWriter(fileName)); 
    writer.write(VirusDefinitionTest.malware()); 
    request.setEntity(entity); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
    FileBody fileBody = new FileBody(new File(fileName)); 

    builder.addTextBody("my_file", fileName); 
    HttpEntity entity = builder.build(); 
    request.setEntity(entity); 

    HttpResponse response; 
    try { 
    response = httpClient.execute(request); 

...

Ne yazık ki, HTTP/alma 1.1 403 Yasak: Burada adımlar boyunca rehberlik edecek yorumladı benim kaynak kodunun bir parçasıdır. Açıkçası, hata varlıklar içinde bir yer ama nasıl yapacağımı bulamıyorum. Herhangi bir yardım derinden memnuniyetle karşılanacaktır.

cevap

1

Sorun, önce "application/json" olan ve sonunda Muiltipart öğelerini gönderdiğiniz açık "content-type" başlığını eklediğinizden anlaşılıyor. Tüm parametreleri ve dosyayı Muiltipart öğesine eklemeniz gerekir.

CloseableHttpClient httpClient = HttpClientBuilder.create().build(); 
//create post request 
HttpPost request = new HttpPost("https://www.virustotal.com/vtapi/v2/file/scan"); 
//http json header 
request.addHeader("content-type", "application/json"); 

String str = gson.toJson(param); 

String fileName = UUID.randomUUID().toString() + ".txt"; 

try { 
//API key 
StringEntity entity = new StringEntity(str); 
Writer writer = new BufferedWriter(new FileWriter(fileName)); 
writer.write(VirusDefinitionTest.malware()); 
// --> You set parameters here !!! 
request.setEntity(entity); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
FileBody fileBody = new FileBody(new File(fileName)); 

builder.addTextBody("my_file", fileName); 
HttpEntity entity = builder.build(); 
// --> You overwrite the parameters here !!! 
request.setEntity(entity); 

HttpResponse response; 
try { 
response = httpClient.execute(request); 
2

Bu Apache 4.5.2 ile benim için çalıştı HttpClient:

CloseableHttpClient httpclient = HttpClients.createDefault(); 
try { 
    HttpPost httppost = new HttpPost("https://www.virustotal.com/vtapi/v2/file/scan"); 

    FileBody bin = new FileBody(new File("... the file here ...")); 
    // the API key here 
    StringBody comment = new StringBody("5ec8de.....", ContentType.TEXT_PLAIN); 

    HttpEntity reqEntity = MultipartEntityBuilder.create() 
      .addPart("apikey", comment) 
      .addPart("file", bin) 
      .build(); 

    httppost.setEntity(reqEntity); 

    System.out.println("executing request " + httppost.getRequestLine()); 
    CloseableHttpResponse response = httpclient.execute(httppost); 
    try { 
     System.out.println("----------------------------------------"); 
     System.out.println(response.getStatusLine()); 
     HttpEntity resEntity = response.getEntity(); 
     if (resEntity != null) { 
      System.out.println("ToString:" + EntityUtils.toString(resEntity)); 
     } 
     EntityUtils.consume(resEntity); 
    } finally { 
     response.close(); 
    } 
} finally { 
    httpclient.close(); 
} 

önemli bir parçası vardı reqEntity olması edildi onlar Muiltipart varlık üzerine yazılması nedeniyle Şimdi parametreleri göndermek değildir iki özel alan, "apikey" ve "file". Bunu geçerli bir API anahtarı ile çalıştırmak bana API'dan beklenen yanıtı verir.

+0

Bu, VirusTotal with Java için harika çalışıyor. EntityUtils.toString (resEntity) ', bulmacanın son parçasıydı. – nettie

İlgili konular