DefaultHttpClient устарела в Scala - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь подключить внешний API (требуется аутентификация) с данными LD-Json с другого URL.Не понимаю, как добавить ключ и пароль для этого внешнего API.Пытался использовать DefaultHttpClient, но он устарел.

Первый подход -

import java.nio.charset.StandardCharsets
import java.util.Base64

import org.apache.http.auth.{AuthScope, UsernamePasswordCredentials}
import org.apache.http.client.methods.{HttpGet, HttpPost}
import org.apache.http.entity.StringEntity
import org.apache.http.impl.client.{BasicCredentialsProvider, DefaultHttpClient, HttpClientBuilder}
import org.jsoup.Jsoup

class Scraper(url: String) {
  def getJson(url: String) = {
    val doc = Jsoup.parse(url)
    val api_url = "external_api"
    val username = "my_username"
    val password = "my_password"
    val ldJsons = doc.select("script[type=\"application/ld+json\"]")
    val base64EncodedDoc = Base64.getEncoder.encodeToString(doc.toString().getBytes(StandardCharsets.UTF_8))

    val post = new HttpPost(api_url)
    post.setHeader("Content-type", "application/json")
    post.setEntity(new StringEntity(base64EncodedDoc))
    val response = (new DefaultHttpClient).execute(post)
//need an alternative for this in Scala
  }
}

Второй подход -

import java.nio.charset.StandardCharsets
import java.util.Base64

import org.apache.http.auth.{AuthScope, UsernamePasswordCredentials}
import org.apache.http.client.methods.{HttpGet, HttpPost}
import org.apache.http.entity.StringEntity
import org.apache.http.impl.client.{BasicCredentialsProvider, DefaultHttpClient, HttpClientBuilder}
import org.jsoup.Jsoup

class Scraper(url: String) {
  def getJson(url: String) = {
    val doc = Jsoup.parse(url)
    val api_url = "external_api"
    val username = "my_username"
    val password = "my_password"
    val ldJsons = doc.select("script[type=\"application/ld+json\"]")
    val base64EncodedDoc = Base64.getEncoder.encodeToString(doc.toString().getBytes(StandardCharsets.UTF_8))
    val credentialsProvider = new BasicCredentialsProvider()
    credentialsProvider.setCredentials(
      AuthScope.ANY,
      new UsernamePasswordCredentials(username, password)
    )

    val httpClient =
      HttpClientBuilder.create()
        .setDefaultCredentialsProvider(credentialsProvider)
        .build()

    val httpResponse = new HttpGet(api_url)
    httpResponse.setHeader("Content-type", "application/json")
    httpClient.execute(httpResponse)
//how to pass my LD-Json data here?
  }
}

Это мой первый вопрос здесь.Если это слишком тривиально, пожалуйста, извините.Я пытаюсь написать класс скребка в Scala, который извлекает LD-Json из URL и публикует его во внешнем API.

1 Ответ

0 голосов
/ 12 июня 2019

Вы должны использовать HttpClientBuilder .

Простой пример:

String url = "http://example.com";

HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(url);

HttpResponse response = client.execute(request);

System.out.println("Result: " + response.getStatusLine().getStatusCode());

BufferedReader bufferedReader = new BufferedReader(
        new InputStreamReader(response.getEntity().getContent()));

StringBuffer result = new StringBuffer();
String line = "";
while ((line = rd.readLine()) != null) {
        result.append(line);
}
...