2014-08-27 2 views
3

У меня есть несколько вопросов о конкретном вызове REST, который я делаю в JAVA. Я довольно новичок, поэтому я собрал это вместе из нескольких источников. Сам вызов выглядит следующим образом:REST вызов в Java

String src = AaRestCall.subTrackingNum(trackingNum); 

Класс вызова Rest выглядит следующим образом:

public class AaRestCall { 
public static String subTrackingNum (Sting trackingNum) throws IOException { 
    URL url = new URL("https://.../rest/" + trackingNum); 
    String query = "{'TRACKINGNUM': trackingNum}"; 

    //make connection 
    URLConnection urlc = url.openConnection(); 

    //use post mode 
    urlc.setDoOutput(true); 
    urlc.setAllowUserInteraction(false); 

    //send query 
    PrintStream ps = new PrintStream(urlc.getOutputStream()); 
    ps.print(query); 
    ps.close(); 

    //get result 
    BufferedReader br = new BufferedReader(new InputStreamReader(urlc 
     .getInputStream())); 
    StringBuilder sb = new StringBuilder(); 
    String line = null; 
    while ((line=br.readLine())!=null) { 
     sb.append(line); 
    } 
    br.close(); 

    return sb.toString(); 
} 
} 

Теперь у меня есть несколько вопросов, на вершине, что не так с этим вообще.

1) Если этот повторный вызов возвращает объект JSON, это будет запутаться, перейдя на строку?

2) Какой лучший способ разобрать JSON, который возвращается?

3) Я не уверен, как отформатировать поле запроса. Я предполагаю, что это должно быть документировано в REST API?

Заранее спасибо.

ответ

1

О, мой. Есть несколько областей, где вы можете улучшить этот код. Я даже не собираюсь указывать на ошибки, так как хочу, чтобы вы заменили HTTP-вызовы на клиентскую библиотеку HTTP. Я также не знаю спецификации, требуемой вашим API, поэтому, чтобы вы правильно использовали методы POST или GET, на этом уровне абстракции потребуется больше работы.

1) Если остальные вызов возвращает объект JSON, что собирается получить облажался, перейдя в строку?

Нет, но маршаллинг, что json в obect - это ваша работа. Может помочь библиотека, например, google gson.

2) Каков наилучший способ разобрать JSON, который возвращается?

Мне нравится использовать gson, как я уже упоминал выше, но вы можете использовать другую библиотеку маршала/немархала.

3) Я не уверен, как отформатировать поле запроса. Я предполагаю, что , который должен быть задокументирован в REST API?

Да. Взгляните на документацию и придумайте java-объекты, которые отражают структуру json. Затем вы можете проанализировать их с помощью следующего кода.

gson.fromJson(json, MyStructure.class);

Http клиент

Пожалуйста, обратите внимание на написание своего клиента HTTP с использованием библиотеки как apache HTTP client, которые сделают вашу работу намного проще.

Тестирование

Поскольку вы, кажется, знакомы с этим, я также предлагаю вам взглянуть на инструмент, как Postman, который может помочь вам проверить свои API вызовы, если вы подозреваете, что код, который вы написали неисправен.

2

REST - это шаблон, применяемый поверх HTTP. Из ваших вопросов мне кажется, что вам сначала нужно понять, как работают протоколы HTTP (и chatty socket в целом) и что предлагает Java API для решения этой проблемы.

Вы можете использовать любую библиотеку Json для разбора тела ответа HTTP (при условии, что это 200 OK, что вам нужно проверить, а также следить за перенаправлением HTTP!), Но это не так, как обычно делаются вещи ,

Если служба предоставляет реальный интерфейс RESTful (в отличие от простого HTTP + JSON), вам нужно будет использовать четыре HTTP-глагола, а URLConnection не позволит вам это сделать. Кроме того, вы, скорее всего, захотите добавить заголовки для аутентификации или, может быть, файлы cookie (которые на самом деле являются только заголовками HTTP, но по-прежнему стоит рассматривать отдельно). Поэтому мое предложение заключается в создании клиентской части службы с помощью HttpClient из сообщества Apache или, может быть, библиотеки JAX-RS с поддержкой клиентов (например, Apache CXF). Таким образом, вы будете иметь полный контроль над сообщением, а также получать более приятные абстракции для работы, вместо того, чтобы потреблять InputStream, предоставляемые вашим URLConnection, и ручную сериализацию/десериализацию параметров/ответов.

Относительно бит около как отформатировать поле запроса, вам сначала нужно понять основы HTTP. Во всяком случае, однозначный ответ зависит от реализации дистанционного обслуживания, но вы будете сталкиваться четыре варианта:

  1. Строка запроса в URL службы
  2. формы кодированного тело вашего HTTP запрос
  3. многочастного тело вашего HTTP-запроса (похожего на первое, но другого типа MIME достаточно, чтобы дать некоторую головную боль) - это часто используется в службах HTTP + JSON, у которых также есть веб-сайт, и тот же URL-адрес может использоваться для загрузки формы который содержит вход file
  4. Определенный по обслуживанию (например, application/json, или application/xml) для вашего тела HTTP (опять же, это действительно то же самое, что и предыдущие два момента, но различная MIME-кодировка означает, что вам придется использовать другой API)
1

Я думаю, что вы должны использовать REST client library вместо того, чтобы писать свои собственные, если только это не для образовательных целей - тогда непременно сходите с ума!

Служба REST ответит на ваш вызов HTTP response, полезная нагрузка может и не может быть отформатирована как JSON string. Если это так, я предлагаю вам использовать JSON parsing library для преобразования этой строки в представление Java.

И да, вам нужно будет обратиться к конкретной документации REST API: для получения подробной информации.

P.S. Класс URL-адреса java нарушен, вместо этого используйте URI.

Смежные вопросы