0

我有一个用 Jersey(宁静的网络服务)制作的 API,非常简单。我已经能够通过我的 android 应用程序提出请求/回答。

现在我正在开发一个 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 格式(restful WS 使用 JSON 格式文本回答),所以行 dataType: "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;
}

}

在此先感谢,我希望每个人都能理解我:)。

4

1 回答 1

0

当我编写 Jersey Web 服务时,我通常让我的方法返回 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();
}
于 2013-06-21T07:32:44.743 回答