Рубрики
Без рубрики

Мигелю нужна наша помощь – 7-й день конкурса #25DaysOfServerless Challenge

Эта статья является частью #25DaysOfServerless. Новые задачи будут публиковаться каждый день в Micros… Помечено 25 днями бессерверного, лазурного, java, функционального.

Эта статья является частью #25daysofсервер без сервера . Новые задачи будут публиковаться каждый день от Microsoft Cloud Advocates в течение декабря. Узнайте больше о том, как Microsoft Azure включает ваши Бессерверные функции .

У вас есть идея или решение? Поделитесь своими мыслями в Твиттере!

Итак, злой гринч украл все серверы в мире, и нам придется посетить много стран, чтобы все исправить! Сейчас мы находимся в Гватемале, и здесь 7 декабря отмечается первый день официального рождественского сезона. Все изо всех сил стараются подготовиться к большому la quema del diablo (сожжению дьявола) сегодня вечером — ровно в 6 вечера все разожгут костер, чтобы сжечь мусор и предметы, которые им не нужны, чтобы очистить свои дома от зла.

Наш друг Мигель обеспокоен воздействием на окружающую среду! Последние несколько лет люди сжигают много резины и пластика, которые загрязняют воздух. Некоторые места переходят на сжигание бумажных пиратов дьявола, но Мигель все еще хочет, чтобы люди метафорически очищали свои дома от определенных предметов, которые им не нужны.

Давайте поможем Мигелю, создав веб-API, который позволяет его соседям искать изображения вещей, от которых они хотят избавиться. Создайте приложение (например, облачную функцию с одной конечной точкой), которое принимает текст в качестве входных данных и возвращает изображение, найденное на unsplash или другой платформе изображений.

Совет

Убедитесь, что ваши ключи хранятся в секрете. Для этого вы можете воспользоваться переменными среды;

экспорт экспорт

Решение

Как разработчик Java, я создал свою функцию Azure с помощью Java и maven с использованием Java 8. Начиная с этого пути, автоматически будет сгенерирован пример http-триггера плюс тест, который можно использовать и адаптировать к задаче.

Сгенерированный Http-триггер предоставляет простой пример “Привет, имя”, где Имя изменяется в соответствии с заданными параметрами.

import java.util.*;
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;

/**
 * Azure Functions with HTTP Trigger.
 */
public class Function {
    /**
     * This function listens at endpoint "/api/HttpTrigger-Java". Two ways to invoke it using "curl" command in bash:
     * 1. curl -d "HTTP Body" {your host}/api/HttpTrigger-Java&code={your function key}
     * 2. curl "{your host}/api/HttpTrigger-Java?name=HTTP%20Query&code={your function key}"
     * Function Key is not needed when running locally, it is used to invoke function deployed to Azure.
     * More details: https://aka.ms/functions_authorization_keys
     */
    @FunctionName("HttpTrigger-Java")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel =
                AuthorizationLevel.FUNCTION) HttpRequestMessage> request,
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");

        // Parse query parameter
        String query = request.getQueryParameters().get("name");
        String name = request.getBody().orElse(query);

        if (name == null) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
                .body("Please pass a name on the query string or in the request body").build();
        } else {
            return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
        }
    }
}

Прежде чем вы начнете изменять созданную вами функцию, зарегистрируйтесь на unsplash.com и объявите свое функциональное приложение в разделе для разработчиков , чтобы получить необходимые ключи. Эти ключи были сохранены в моих переменных среды для локального тестирования с помощью инструмента командной строки, а также в local.settings.json в соответствии с форматом.

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "java",
    "UNSPLASH_ACCESS_KEY": "your unsplash access key",
    "UNSPLASH_SECRET_KEY": "your unsplash secret key"
  }
}

Для развертывания в Azure обязательно также установите ключи в качестве переменных среды .

Итак, давайте вернемся к нашей сгенерированной функции. Для извлечения запроса из Http-триггера необходимы некоторые незначительные корректировки. Поскольку мы хотим, чтобы люди могли искать не только по одному, но и по нескольким ключевым словам, нам нужно заменить все пробелы на формат, читаемый по URL “%20”. Чтобы сохранить запрос для удобочитаемого вывода, сохраните ключевые слова в другой переменной, разделенной запятыми.

final String query = request.getQueryParameters().get("text");
String text = request.getBody().orElse(query);
String resultText;

if (text == null) {
    return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a text on the query string or in the request body to search for").build();
}
if (text.contains(" ")) {
    resultText = text.replace(" ", ", ");
    text = text.replace(" ", "%20");
} else {
    resultText = text;
}

Объедините URL-адрес для доступа к api unsplash с вашими ключами.

BufferedReader reader;
String line;
StringBuilder responseContent = new StringBuilder();

// Get environment variables and access unsplash
String ACCESS_KEY = System.getenv("UNSPLASH_ACCESS_KEY");
String SECRET_KEY = System.getenv("UNSPLASH_SECRET_KEY");

StringBuilder urlBuilder = new StringBuilder();
urlBuilder.append();
urlBuilder.append(ACCESS_KEY);
urlBuilder.append();
urlBuilder.append(SECRET_KEY);
urlBuilder.append();
urlBuilder.append(text);
urlBuilder.append("&count=1");

Имея URL-адрес, нам просто нужно открыть соединение и прочитать содержимое ответа. Обязательно установите тайм-ауты, чтобы ваш http-запрос не выполнялся вечно, а затем отключите соединение. Да, с более новым Java SDK вы также можете использовать http-клиент apache но в этом решении мы демонстрируем рабочее решение также для Java 8.

try {
    URL url = new URL(urlBuilder.toString());
    connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("GET");
    connection.setConnectTimeout(5000);
    connection.setReadTimeout(5000);

    int responseCode = connection.getResponseCode();
    if (responseCode > 299) {
       reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
    } else {
       reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    }
    while ((line = reader.readLine()) != null) {
       responseContent.append(line);
    }
    reader.close();
} catch (IOException e) {
   e.printStackTrace();
} finally {
   connection.disconnect();
}

Наконец, нам нужно проанализировать ответ на наш запрос api unsplash. В этом решении используются JSONObject и JSONArray из библиотеки org.json . Другим хорошо известным и хорошо используемым анализатором JSON был бы json-simple .

JSONObject answer = new JSONObject(responseContent.toString());
JSONArray results = answer.getJSONArray("results");
String smallImageUrl = results.getJSONObject(0).getJSONObject("urls").getString("small");

И последнее, но не менее важное: верните изображение или URL-адрес изображения людям из Гватемалы.

// return image url
return request.createResponseBuilder(HttpStatus.OK).body("Search for image with keywords:  " + resultText + ". Got url: " + smallImageUrl).build();

Спасибо вам за спасение окружающей среды, не позволяя им сжигать то, от чего они хотят избавиться, но сохраняя их культурную целостность с помощью этой альтернативы.

Мы желаем вам спокойного курортного сезона и счастливого нового года.

Хотите представить свое решение этой проблемы? Создайте локальное решение, а затем отправьте проблему . Если ваше решение не содержит кода, вы можете записать короткое видео и отправить его в качестве ссылки в описании проблемы. Обязательно сообщите нам, для какой задачи предназначено решение. Мы рады видеть, что вы строите! У вас есть комментарии или вопросы? Добавьте их в область комментариев ниже.

Следите за сюрпризами весь декабрь, когда мы празднуем 25 дней без сервера. Оставайтесь с нами здесь на dev.to поскольку мы представляем проблемы и решения! Подпишитесь на бесплатную учетную запись в Azure , чтобы подготовиться к испытаниям!

Оригинал: “https://dev.to/azure/miguel-needs-our-help-day-7-of-the-25daysofserverless-challenge-4jg0”