Римейк POST-запроса с Java на python становится нулевым - PullRequest
1 голос
/ 20 мая 2019

Я совершенно новичок в python flask и столкнулся с проблемой при написании кода с использованием запросов и модулей flask.

Я работаю над проектом с использованием веб-API, предлагаемого платформой Panther.В проекте предоставлен пример с использованием Apache Java.

Исходный код приведен ниже ( Подробнее см. ).

public class TestProject {

public static void main(String args[]) throws Exception {
    CloseableHttpClient httpclient = HttpClients.createDefault();
    try {
        HttpPost httppost = new HttpPost("http://pantherdb.org/webservices/garuda/tools/enrichment/VER_2/enrichment.jsp?");

        StringBody organism = new StringBody("Homo sapiens", ContentType.TEXT_PLAIN);
        FileBody fileData = new FileBody(new File("c:\\data_files\\gene_expression_files\\7_data\\humanEnsembl"), ContentType.TEXT_PLAIN);
        StringBody enrichmentType = new StringBody("process", ContentType.TEXT_PLAIN);       
        StringBody testType = new StringBody("FISHER", ContentType.TEXT_PLAIN);    
        //StringBody cor = new StringBody("FDR", ContentType.TEXT_PLAIN);
        //StringBody cor = new StringBody("BONFERRONI", ContentType.TEXT_PLAIN);
        //StringBody cor = new StringBody("NONE", ContentType.TEXT_PLAIN);
        StringBody type = new StringBody("enrichment", ContentType.TEXT_PLAIN);

        HttpEntity reqEntity = MultipartEntityBuilder.create()
                .addPart("organism", organism)
                .addPart("geneList", fileData)
                .addPart("enrichmentType", enrichmentType)
                .addPart("test_type", testType)
                .addPart("type", type)
                //.addPart("correction", cor)
                .build();
        httppost.setEntity(reqEntity);

        CloseableHttpResponse response = httpclient.execute(httppost);
        try {
        //System.out.println("----------------------------------------");
       //System.out.println(response.getStatusLine());
            HttpEntity resEntity = response.getEntity();
            if (resEntity != null) {
                System.out.println(IOUtils.toString(resEntity.getContent(), StandardCharsets.UTF_8));

            }
            EntityUtils.consume(resEntity);
        } finally {
            response.close();
        }
    } finally {
        httpclient.close();
    }
  }
}

Часть, в которой я больше всего заинтересованэто .addPart("organism", organism) и весь другой код с аналогичными структурами.Они помогут передать параметры со стороннего веб-сайта в веб-API, предлагаемый Panther.

Я переделал код JAVA в python3, используя requests.Код выглядит следующим образом:


uploadTemp = {'file':open('./app/static/data_temp/temp.txt','rb')}

url="http://pantherdb.org/webservices/garuda/tools/enrichment/VER_2/enrichment.jsp?"
params = {"organism":organism,"geneList":pantherName,"enrichmentType":"fullGO_process","test_type":"BINOMIAL","type":"enrichment","correction":"BONFERRONI"}

# or params = {"organism":organism,"geneList":uploadTemp,"enrichmentType":"fullGO_process","test_type":"BINOMIAL","type":"enrichment","correction":"BONFERRONI"} 

Pantherpost= requests.post(url, params = params)
print(Pantherpost.text)

Я ожидаю, что объект XML от веб-API, включая некоторую базовую биологическую информацию.Однако полученный результат был нулевым (или \n\n\rnull\n при печати Pantherpost.content)

Похоже, что параметры, полученные из моего собственного веб-сайта, были неправильно отправлены в веб-API.

В дополнение к этой задаче обнуления, как новичок, я также не совсем уверен, должна ли часть «geneList» получать объект в виде простого текста или файл.В руководстве говорится, что он ожидает файл, однако, эта команда могла быть переформатирована в обычный текст

FileBody fileData = new FileBody(new File("c:\\data_files\\gene_expression_files\\7_data\\humanEnsembl"), ContentType.TEXT_PLAIN);

В любом случае, я попробовал обе интерпретации: pantherName - это список с правильно отформатированным именемв текстовом формате и uploadTemp - это файл .txt, сгенерированный для проекта.В моем коде должны быть некоторые дополнительные ошибки, поскольку в обоих случаях он вернул null.

Может кто-нибудь помочь?Большое спасибо.

1 Ответ

1 голос
/ 21 мая 2019

Я обнаружил следующие проблемы с вашим кодом Python:

Один . Если вы хотите POST файл, используя requests, вы должны использовать ключевое слово files=.

Два . Ключи в files объекте должны соответствовать соответствующим параметрам запроса (вместо этого вы используете file).

Три . Вы указали свои параметры в неправильном месте запроса, написав params=params.

Функция аннотации из requests исходный код:

: param params: (необязательно) Словарь или байты для отправки в строке запроса для: class: Request.

В примере Java-код StringBody используется для создания параметров, что подразумевает, что параметры должны быть помещены в тело HTTP-запроса, а не в строку запроса. Так что вы должны использовать ключевое слово data=. Если вы используете params=, вывод будет null.

ТАКИЕ статьи о разнице между data и params ключевыми словами в requests.


Итак, я потратил некоторое время на чтение их руководства и создал тестовый скрипт:

import requests


url = "http://pantherdb.org/webservices/garuda/tools/enrichment/VER_2/enrichment.jsp?"
filepath = "C:\\data\\YOUR_DATA.txt"  # change to your file location

# all required parameters according to manual, except geneList which is a file (see below)
params = {  # using defaults from manual
    "type": "enrichment",
    "organism": "Homo sapiens",
    "enrichmentType": "process",
    "test_type": "FISHER",
    "correction": "FDR",
}

# note that the key here is the name of paramter: geneList
files = {'geneList': open(filepath, 'rb')}  

# it outputs null, when 'params=params' is used
r = requests.post(url, data=params, files=files)  
print(r.status_code)
print(r.text)

Выход:

200
Id  Name    GeneId  raw P-value FDR
...