2014-09-01 2 views
3

Я пытаюсь создать web service, который будет выполнен в JSON response, а затем запросить DB с ним, чтобы вернуть данные магазина (JSON response).JSON Параметр для веб-службы

Я намерен использовать это позже с mobile app. Но во время разработки я тестирую, используя AJAX calls. На данный момент я использую запрос @GET. Я смог успешно вернуть ответ JSON. Я столкнулся с проблемой передачи JSON Object@GET method. При отладке я вижу, что в моем входном параметре есть нулевое значение. Может ли кто-нибудь взглянуть на мой код и сообщить, что я делаю неправильно?

import javax.ws.rs.core.Context; 
import javax.ws.rs.core.UriInfo; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.PUT; 

import java.util.Iterator; 

import org.json.simple.JSONObject; 
import org.json.simple.JSONArray; 
import org.json.simple.JSONValue; 
import org.json.simple.parser.JSONParser; 
import org.json.simple.parser.ParseException; 

/** 
* REST Web Service 
* 
* @author Aj 
* 
* This service will return the offers valid for the IMSI number passed 
*/ 
@Path("getOffers") 
public class GetOffersResource { 

    @Context 
    private UriInfo context; 

    /** 
    * Creates a new instance of GetOffersResource 
    */ 
    public GetOffersResource() { 
    } 

    @GET 
    @Consumes("application/json") 
    @Produces("application/json") 
    public String getJson(final String input) { 

     JSONParser parser = new JSONParser(); 
     String[] response = new String[5]; 

     try { 
      Object obj = parser.parse(input); 
      JSONObject jsonObject = (JSONObject) obj; 
      offerProcess ofc = new offerProcess(); 
      ofc.setLatitude((double) jsonObject.get("latitude")); 
      ofc.setLongitude((double) jsonObject.get("longitude")); 
      ofc.setIMSI((long) jsonObject.get("IMSI")); 

      response = ofc.fetchOffers(); 

     } catch (ParseException e) { 
      JSONObject ser = new JSONObject(); 

      ser.put("status", "error"); 
      ser.put("reason", "Bad request"); 

      return ser.toJSONString(); 
     } 

     //TODO return proper representation object 
     JSONObject ser = new JSONObject(); 
     JSONArray arr = new JSONArray(); 

     arr.add("456TYU"); 
     arr.add("OLED TV"); 
     arr.add("24-JUL-2014"); 
     arr.add("XYZ Enterprises"); 
     arr.add("Gachibowli"); 
     arr.add("9911278366"); 

     ser.put("status", "success"); 
     ser.put("Offers", arr); 

     System.out.println(ser); 

     return ser.toJSONString(); 
    } 

    /** 
    * PUT method for updating or creating an instance of GetOffersResource 
    * 
    * @param content representation for the resource 
    * @return an HTTP response with content of the updated or created resource. 
    */ 
    @PUT 
    @Consumes("application/json") 
    public void putJson(String content) { 
    } 
} 

Вот offerProcess класс -

public class offerProcess { 

    private double longitude; 
    private double latitude; 
    private long IMSI; 

    public double getLongitude() { 
     return longitude; 
    } 

    public double getLatitude() { 
     return latitude; 
    } 

    public void setLongitude(double longitude) { 
     this.longitude = longitude; 
    } 

    public void setLatitude(double latitude) { 
     this.latitude = latitude; 
    } 

    public long getIMSI() { 
     return IMSI; 
    } 

    public void setIMSI(long IMSI) { 
     this.IMSI = IMSI; 
    } 

    public String[] fetchOffers(){ 
     String[] response = new String[5]; 

     response[0] = "456TYU"; 
     response[1] = "OLED TV"; 
     response[2] = "24-JUL-2014"; 
     response[3] = "XYZ Enterprises"; 
     response[4] = "Gachibowli"; 
     response[5] = "9980556990"; 

     return response; 
    } 
} 

Для чего это стоит, я использую библиотеку JSON.Simple.

+0

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

+0

Я не могу представить, чтобы изменить мой оригинальный пост, так что здесь идет - 'код вар requestData = {«долгота»:«77.681307», «широта»:«12,8250278», «IMSI»: «404490585029957»}; $ .ajax ({ типа: "POST", CONTENTTYPE: "применение/JSON", URL: url1, асинхронной: правда, данные: requestData, успех: функция (ответ) { console.log (response.status) } ' –

ответ

1

Я был в состоянии решить мою проблему, делая то же самое, что и в следующем вопросе - Json parameters are passed as null. Также, как было предложено, я изменил с @GET запрос на @POST.

Я создал новый класс под названием jsonFormat, который примет 3 параметра, переданных в запросе @POST.

Вот мой окончательный код, который работает -

import javax.ws.rs.core.Context; 
    import javax.ws.rs.core.UriInfo; 
    import javax.ws.rs.PathParam; 
    import javax.ws.rs.Produces; 
    import javax.ws.rs.Consumes; 
    import javax.ws.rs.GET; 
    import javax.ws.rs.Path; 
    import javax.ws.rs.PUT; 
    import javax.ws.rs.POST; 

    import java.util.Iterator; 

    import org.json.simple.JSONObject; 
    import org.json.simple.JSONArray; 
    import org.json.simple.JSONValue; 
    import org.json.simple.parser.JSONParser; 
    import org.json.simple.parser.ParseException; 

    /** 
    * REST Web Service 
    * 
    * @author Aj 
    * 
    * This service will return the offers valid for the IMSI number passed 
    */ 
    @Path("getOffers") 
    public class GetOffersResource { 

     @Context 
     private UriInfo context; 

     /** 
     * Creates a new instance of GetOffersResource 
     */ 
     public GetOffersResource() { 
     } 

     @POST 
     @Consumes("application/json") 
     @Produces("application/json") 
     public String getJson(jsonFormat jsonObj) { 

      String[] response = new String[5]; 

      offerProcess ofc = new offerProcess(); 

      try { 

       ofc.setLatitude(jsonObj.latitude); 
       ofc.setLongitude(jsonObj.longitude); 
       ofc.setIMSI(jsonObj.IMSI); 

      } catch (Exception e) { 
       JSONObject ser = new JSONObject(); 

       ser.put("status", "error"); 
       ser.put("reason", jsonObj.latitude); 

       return ser.toJSONString(); 
      } 

      //TODO return proper representation object 
      JSONObject ser = new JSONObject(); 
      JSONArray arr = new JSONArray(); 

      arr.add("456TYU"); 
      arr.add("OLED TV"); 
      arr.add("24-JUL-2014"); 
      arr.add("XYZ Enterprises"); 
      arr.add("Gachibowli"); 
      arr.add("9911278366"); 

      ser.put("status", "success"); 
      ser.put("Offers", ofc.getIMSI()); 

      System.out.println(ser); 

      return ser.toJSONString(); 
     } 

     /** 
     * PUT method for updating or creating an instance of GetOffersResource 
     * 
     * @param content representation for the resource 
     * @return an HTTP response with content of the updated or created resource. 
     */ 
     @PUT 
     @Consumes("application/json") 
     public void putJson(String content) { 
     } 
    } 

Вот класс jsonFormat я создал -

import javax.xml.bind.annotation.XmlRootElement; 

    /** 
    * 
    * @author Aj 
    * This class forms the format of the JSON request which will be recieved from the App 
    */ 
    @XmlRootElement 
    public class jsonFormat { 
     public double longitude; 
     public double latitude; 
     public long IMSI; 

     jsonFormat(){} 

     jsonFormat(double longitude,double latitude, long IMSI){ 
      this.longitude = longitude; 
      this.latitude = latitude; 
      this.IMSI = IMSI; 
     } 

    } 

Наконец, AJAX код -

<script type="text/javascript"> 

     var url1 = "http://localhost:8080/Offers/webresources/getOffers"; 

     var requestData = {"longitude": "77.681307", 
      "latitude": "12.8250278", 
      "IMSI": "404490585029957"}; 

     var jsonObj = JSON.stringify(requestData); 

     $.ajax({ 
      type: "POST", 
      contentType: "application/json", 
      url: url1, 
      async: true, 
      data: jsonObj, 
      success: function(response) { 

       //var obj = JSON.parse(response); 
       console.log(response.status); 
       console.log(response.reason); 
       console.log(response.Offers); 
      } 
     }); 
    </script> 

Thank you f или вся ваша помощь и время! Надеюсь, это может быть полезно кому-то.

1

Попробуйте изменить POST. Вы не передаете тело JSON серверу с запросом GET.

4

Если предположить, что input является параметра Я параметр запроса для запроса GET, то вам нужно добавить @QueryParam аннотацию к параметру:

@GET 
    @Consumes("application/json") 
    @Produces("application/json") 
    public String getJson(@QueryParam("input") final String input) { 
      ... 
    } 

Edit:

Однако, как @troylshields упоминалось, если вы пытаетесь отправить объект JSON, вы должны использовать POST или PUT (в зависимости от обстоятельств). Запрос GET поддерживает только параметр запроса, и попытка отправить строку JSON с помощью параметра запроса не является хорошей идеей.

+0

Хорошо, спасибо - я заметил! Я пытаюсь модифицировать запрос POST. Я настраиваю код и отправляю его немного. Также есть ли какая-либо ссылка что вы знаете, где я могу читать эти типы запросов? –

+0

Использование POST сейчас. Теперь я понимаю, что строка не анализируется в веб-службе. Это то, что я передаю в запросе POST - 'code requestData = {" долгота ":" 77. 681307" , "широта": "12,8250278", "IMSI": "404490585029957"} '. Но по какой-то причине входной параметр содержит это: «longitude = 77.681307 & latitude = 12.8250278 & IMSI = 404490585029957», и, следовательно, синтаксический анализ не выполняется, так как это явно не JSON. Должен ли я менять подпись параметра из String? –

+0

Не могли бы вы обновить вопрос с помощью кода, который вы используете сейчас? Мне понравится подпись на методе, который вы вызываете. –

0

Неверный код клиента. Вы должны отправить запрос в

var requestData = {"longitude" : "77.681307", "latitude" : "12.8250278", "IMSI": "404490585029957"};  
// ... 
$.ajax({ 
// ... 
    data: {input : requestData} // 'input' should be the root element 
// ... 
)}; 

В этом случае на серверной части input строка будет правильно.

Кроме того, как я вижу, вы посылаете POST запрос, но GET запрос ожидается на стороне сервера