2013-06-19 35 views
0

我有一個用Jersey(restful web service)製作的API,非常簡單。我已經能夠通過我的android應用程序提出請求/答案。Ajax請求每次通過錯誤(在服務器端球衣/ java restful WS中沒有回答JSONP?)

現在我正在開發Web後端以管理數據。問題是,當我用ajax進行調用時,每次答案都會通過「錯誤」部分。

看起來很奇怪,看上去螢火蟲的呼叫/回答似乎是正確的,最終200 OK的答案和正確的JSON數據。

的JavaScript代碼如下:

$(document).ready(function(){ 

     var theUrl = "***url****/Rest/provincias"; 
     jQuery.ajax({ 
      beforeSend: function(req) { 
       req.setRequestHeader("Accept", "application/json"); 
      }, 
      cache: false, 
      async: false, 
      crossDomain: true, 
      type: "GET", 
      url: theUrl, 
      dataType: "jsonp", 
      jsonp: false, 
      contentType: "application/json; charset=utf-8", 
      statusCode: { 
       200: function (data){ 
        //OK ANSWER 
        alert("Answer OK: " + data.response); 
       } 
      }, 

      error: function (xhr,err) { 
       alert("Otra vez en error... " + xhr + "' '" + err); 
      }, 
      success: function (data){ 
       //Comprobamos en el json si tenemos true o false. 

       alert("éxito!! " + data); 
      }, 
      complete: function (xhr, status) { 

       if (status === 'error' || !xhr.responseText) { 
        alert("errorrr"); 
       } 
       else { 
        var data = xhr.responseText; 
        alert("Info en complete: " + data); 
       } 
      } 
     }); 


    }); 

當我提出通過瀏覽器調用類似於此寫入的JSON文本:

{ 
    "response": true, 
    "data_int": 0, 
    "data_boolean": false, 
    "data_float": 0.0, 
    "data_double": 0.0, 
    "data_byte": 0, 
    "data_short": 0, 
    "data_long": 0, 
    "data_char": "\u0000", 
    "object": [ 
    { 
    "id": 1, 
    "nombreCas": "Ãlava", 
    "nombreEus": "Araba", 
    "localizacion": { 
    "id": 46, 
    "latitude": "42.847511", 
    "longitude": "-2.679730" 
    }, 
    "pueblos": { 
    "1": { 
     "id": 1, 
     "nombreCas": "Alegría", 
     "nombreEus": "Dulantzi", 
     "provincia": null, 
     "localizacion": { 
     "id": 1, 
     "latitude": "42.841171", 
     "longitude": "-2.512608" 
     }, 
     "barrios": {} 
    }, 

........ 

正如我已經能夠閱讀,錯誤可能是因爲答案不是JSONP格式(寧靜的WS正在回答JSON格式的文本),所以行數據類型:「jsonp」不能被刪除。如果我刪除它,答案不正確。

有什麼東西可以添加到我的網絡服務?例如,如何添加JSONP支持此代碼:提前

package main.java.webService; 

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.HashMap; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 

import main.java.model.AccessManager; 

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 

import main.java.dto.Provincia; 
import main.java.dto.ReturningClass; 

/** 
* @author Jon_Inazio 
* 
*/ 
@Path("provincias") 
public class PueblosProvinciasService { 

    @GET 
    @Produces("application/json") 
    public String getProvincias(){ 
     String provincias = null; 
    HashMap<Integer, Provincia> provinciasList = new HashMap<Integer,  Provincia>(); 
     try{ 
     provinciasList = new AccessManager().getProvincias(); 
       GsonBuilder gb = new  GsonBuilder().serializeNulls().setPrettyPrinting(); 
      Gson gson = gb.create(); 
      Collection<Provincia> arrayProvs = new ArrayList<Provincia>(); 
     arrayProvs = provinciasList.values(); 
      /* 
      * CONVERTIR HASH MAP A UNA LISTA --> JSON LO PIDE ASI 
     */ 
      //ReturningClass<HashMap<Integer, Provincia>> ret = new  ReturningClass<HashMap<Integer, Provincia>>(true, provinciasList); 
      ReturningClass<Collection<Provincia>> ret = new  ReturningClass<Collection<Provincia>>(true, arrayProvs); 
      System.out.println("**Se han consultado las provincias!!"); 
      provincias = gson.toJson(ret); 
     }catch(Exception e){ 
      e.printStackTrace(); 
    } 

     return provincias; 
} 

} 

感謝,並希望大家能理解我:)。

+0

您的回答是'JSON'不是jsonp,請回復jsonp。 – Musa

+0

我想你錯過了URL中的回調佔位符。請看看http://stackoverflow.com/questions/4942004/jsonp-callback-problem例如 – Jk1

+0

感謝您的意見!我已經能夠訪問我的Json數據:)。我需要對我的Web服務進行一些更改:http://nhachicha.wordpress.com/2012/08/05/using-jsonp-with-jax-rs/ – russellhoff

回答

0

當我編寫Jersey Web Services時,通常我的方法會返回Response對象。這使我可以包含有關狀態碼和響應標題的信息。在進行跨域請求時(這看起來像是在做),這一點尤其重要,因爲它允許您指定啓用跨域請求的重要響應頭「Access-Control-Allow-Origin」。

@GET 
@Produces("application/json") 
@Path("myPath") 
public Response getAllCommissions() { 

    // Perform method function 
    String json = "OUTPUT_OF_METHOD"; 

    // Creates a ResponseBuilder 
    ResponseBuilder builder = new ResponseBuilderImpl(); 
    // Sets the header of the return data 
    builder.header("content-type", "application/json"); 
    // Sets the response code as a 200 
    builder.status(Response.Status.OK); 
    // Allows Cross Domain Requests from any origin 
    builder.header("Access-Control-Allow-Origin", "*"); 
    // Adds your result data to the Response 
    builder.entity(json); 
    // Creates the Response 
    return builder.build(); 
} 
相關問題