2016-06-25 4 views
4

Я пытаюсь выяснить, можно ли передать объект JSON для использования API-интерфейсов, или передать несколько параметров этому API? И как читать эти параметры весной? Давайте предположим, что URL выглядит как ниже примеров:Пропустить несколько параметров для отдыха API - Spring

Ex.1 http://localhost:8080/api/v1/mno/objectKey?id=1&name=saif

Справедливо ли передать объект JSON, как в приведенном ниже URL?

Ex.2 http://localhost:8080/api/v1/mno/objectKey/{"id":1, "name":"Saif"}

Вопросы:

1) Можно ли передать объект JSON в URL, как в Ex.2?

2) Как мы можем передавать и анализировать параметры в Ex.1?

Я попытался написать некоторые методы для достижения своей цели, но не смог найти правильное решение?

Я попытался передать объект JSON в качестве @RequestParam

http://localhost:8080/api/v1/mno/objectKey?id=1 Был непредвиденная ошибка (type=Unsupported Media Type, status=415). Content type 'null' not supported

http://localhost:8080/api/v1/mno/objectKey/id=1 Был непредвиденная ошибка (type=Not Found, status=404). No message available

http://localhost:8080/api/v1/mno/objectKey/%7B%22id%22:1%7D Был непредвиденная ошибка (type=Not Found, status=404). No message available

@RequestMapping(value="mno/{objectKey}", 
       method = RequestMethod.GET, 
       consumes="application/json") 
    public List<Book> getBook4(@RequestParam ObjectKey objectKey) { 
     ... 
    } 

Я попытался передать объект JSON в качестве @PathVariable

@RequestMapping(value="ghi/{objectKey}",method = RequestMethod.GET) 
    public List<Book> getBook2(@PathVariable ObjectKey objectKey) { 
     ...   
    } 

Я создал этот объект, чтобы держать идентификатор параметра и другие параметры, такие как имя, и т.д ....

class ObjectKey{ 
     long id; 
     public long getId() { 
      return id; 
     } 
     public void setId(long id) { 
      this.id = id; 
     } 
    } 
+0

насчет аннотацию [@RequestBody] (http://docs.spring.io/spring/docs/current/javadoc-api/ org/springframework/web/bind/annotation/RequestBody.html) и передать объект как тело? – bilak

+0

Любая конкретная причина, почему вы хотите сделать это таким образом? Вы должны иметь возможность получить объект из запроса, который соответствует сущности. – ChiefTwoPencils

+0

Извините, если пример не является точным, это всего лишь доказательство концепции, я хочу, чтобы получить список предлагаемых элементов из БД на основе критериев поиска. У меня будет виджет, который вызывает API остального и передает параметры. Но я стараюсь сосредоточиться на бэкэнд-части в данный момент –

ответ

19

(1) Можно ли передать объект JSON на url, как в Ex.2?

Нет, поскольку http://localhost:8080/api/v1/mno/objectKey/{"id":1, "name":"Saif"} недействительный URL.

Если вы хотите сделать это в RESTful способ, использовать http://localhost:8080/api/v1/mno/objectKey/1/Saif, и определил свой метод так:

@RequestMapping(path = "/mno/objectKey/{id}/{name}", method = RequestMethod.GET) 
public Book getBook(@PathVariable int id, @PathVariable String name) { 
    // code here 
} 

(2) Как мы можем передавать и анализировать параметры в Ex.1?

Просто добавьте два параметра запроса и укажите правильный путь.

@RequestMapping(path = "/mno/objectKey", method = RequestMethod.GET) 
public Book getBook(@RequestParam int id, @RequestParam String name) { 
    // code here 
} 

UPDATE(с комментариями)

Что делать, если мы имеем сложную структуру параметров?

"A": [ { 
    "B": 37181, 
    "timestamp": 1160100436, 
    "categories": [ { 
     "categoryID": 2653, 
     "timestamp": 1158555774 
    }, { 
     "categoryID": 4453, 
     "timestamp": 1158555774 
    } ] 
} ] 

Отправить это как POST с данными JSON в теле запроса, а не в URL, а также указать тип содержимого application/json.

@RequestMapping(path = "/mno/objectKey", method = RequestMethod.POST, consumes = "application/json") 
public Book getBook(@RequestBody ObjectKey objectKey) { 
    // code here 
} 
+0

Спасибо @ Andreas, он работает :) Но у меня еще есть вопрос? Что делать, если у нас сложная структура параметров? ** "А": [ { "В": 37181, "метка времени": 1160100436, "категории": [ { "CategoryId": 2653, "метка времени": 1158555774 }, { "CategoryId": 4453, "метка": 1158555774 } ] } ] ** –

+0

вы не отправить что-то подобное в 'GET', вы используете' Post', и включают в себя JSON в полезную нагрузку, указав тип содержимого 'application/json'. – Andreas

+0

Спасибо за последнее обновление Андреас, возможно ли создать POST с использованием JavaScript, потому что я не хочу использовать этот API остатка, используя форму, я хотел, чтобы JavaScript ее потреблял. –

0

Да его можно передать объект JSON в URL

queryString = "{\"left\":\"" + params.get("left") + "}"; 
httpRestTemplate.exchange(
        Endpoint + "/A/B?query={queryString}", 
        HttpMethod.GET, entity, z.class, queryString); 
Смежные вопросы