Переделка POST-запроса с Python на Java

Мне нужно переделать следующий код с Python на Java:

import requests
import base64

def search(api_token, image):
    endpoint = "https://trace.moe/api/search"
    params = {"token":api_token}
    data = {"image":image}
    r = requests.post(endpoint, params=params, data=data)
    if r.status_code==403:
        raise Exception("API token invalid")
    elif r.status_code==401:
        raise Exception("API token missing")
    elif r.status_code==413:
        raise Exception("The image is too large, please reduce the image size to below 1MB")
    elif r.status_code==429:
        raise Exception("You have exceeded your quota. Please wait and try again soon.")
    elif r.status_code==200:
        return(r.json())

with open("test.png", "rb") as image_file:
    encoded_string = base64.b64encode(image_file.read())

search = search("token", encoded_string)

Я пробовал использовать Apache HttpClient с MultipartEntity, но мне это не помогло.

HttpClient httpclient = new DefaultHttpClient();

HttpPost httppost = new HttpPost("https://trace.moe/api/search");
File file = getImgFile();

        MultipartEntity mpEntity = new MultipartEntity();
ContentBody cbFile = new FileBody(file, "image/jpeg");
mpEntity.addPart("image", cbFile);


httppost.setEntity(mpEntity);
System.out.println("executing request " + httppost.getRequestLine());
HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();

System.out.println(response.getStatusLine());
if (resEntity != null) {
    System.out.println(EntityUtils.toString(resEntity));
}
if (resEntity != null) {
    resEntity.consumeContent();
}

httpclient.getConnectionManager().shutdown();

Любая моя попытка дает «Данные не получены» или пустые «документы». Что я могу сделать?

В заголовке указано, что вы должны переделать с java на python, а в вашем сообщении говорится, что вы хотите переделать с python на java, пожалуйста, примите решение и отредактируйте сообщение :)

SamHoque 17.11.2018 22:42
https://whatanime.ga/api/search также не является действующей ссылкой
SamHoque 17.11.2018 22:43

srr, моя ошибка. обновлено

nesclass 17.11.2018 22:45

Хорошо, я посмотрю, что я могу сделать.

SamHoque 17.11.2018 22:45

Можете ли вы связать мне сайт, на котором я могу сгенерировать токен api?

SamHoque 17.11.2018 22:48

Токен не является обязательным параметром, вы можете вызывать api без него.

nesclass 17.11.2018 22:51

Эй, тебе стоит взглянуть на ответ, который я опубликовал :)

SamHoque 19.11.2018 19:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
7
173
1

Ответы 1

Хорошо, после нескольких минут взлома клавиатуры я создал код, который работает с ним, но он не обрабатывает код запроса и не обрабатывает фактический JSON. Вам нужно будет его реализовать. На данный момент он распечатывает ответ. Это основной старт того, чем вы хотите заниматься. вот код

public static void main(String[] args){
    File file = new File("C:\\Users\\Rab\\Desktop\\lol\\anime.jpg");
    try {
        byte[] fileContent = Files.readAllBytes(file.toPath());
        String imageData = Base64.getEncoder().encodeToString(fileContent);
        search("", imageData);
    } catch (IOException e) {
        e.printStackTrace();
    }

}

public static void search(String token, String image){
    try {
        String urlParameters = String.format("token=%s&image=%s", token, image);
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);
        int postDataLength = postData.length;
        URL url = new URL("https://trace.moe/api/search");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        conn.addRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.addRequestProperty("charset", "utf-8");
        conn.addRequestProperty("User-Agent", "Mozilla/4.76");
        conn.addRequestProperty("Content-Length", Integer.toString(postDataLength));
        conn.setUseCaches(false);
        try (DataOutputStream wr = new DataOutputStream(conn.getOutputStream())) {
            wr.write(postData);
        }
        InputStream inputStream = conn.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
        String wtf = br.readLine();
        System.out.println(wtf);

        //Handle your data `wtf` is the response of the server


    } catch (Exception e){
        e.printStackTrace();
    }
}

и импорт

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.Base64;

Боковое примечание: anime.jpg - это

Другие вопросы по теме