使用AngularJS的REST API无法获得GET参数

时间:2018-09-07 10:35:11

标签: javascript java angularjs rest jaxb

我正在尝试通过GET请求将单个参数传递给服务器。我在浏览器中看到带有参数“已加载”的GET请求是正确的,并且已成功发送。问题在于它没有成功转换为服务器端的对象。请求失败,因为参数中的对象为空,因此引发异常。该应用程序是我计划使其可动态加载的表。当您到达站点的末尾时,接下来的25个条目应通过GET请求进行加载,并以参数的形式已经加载了多少个条目。

服务器端

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class Hello {

TableUtils tu = new TableUtils();

@GET
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public List<Eintrag> fetchEntries(String loaded) {
    List<KeyEntry> entries = tu.getEntries();
    Integer entriesLoaded = Integer.parseInt(loaded);

    if(entries.size() > (entriesLoaded+25)) {
        entries = entries.subList(entriesLoaded, entriesLoaded + 25);
    }
    else if(entries.size() == (entriesLoaded+25)){
        entries.clear();
    }
    else {
        entries = entries.subList(entriesLoaded, entries.size());
    }

    return convert(entries);
}

@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public String add(final Eintrag input) {
    if(input.getlKey()!= "" && input.getOs() != "" && 
tu.addEntry(input.getOs(), input.getlKey()))
        return "success";
    else
        return "error";
}

private List<Eintrag> convert(List<KeyEntry> entries) {
    List<Eintrag> eintraege = new ArrayList<Eintrag>();
    for (KeyEntry entry : entries) {
        Eintrag eintrag = new Eintrag();
        eintrag.setId(entry.getId());
        eintrag.setOs(entry.getOs());
        eintrag.setlKey(entry.getlKey());
        eintraege.add(eintrag);
    }
    return eintraege;
}
}

控制器

angular.module("keyDB", []).controller("Entries", function($scope, $http){
$http.get("http://localhost:8080/keyDBmaven/rest/hello",{params : {loaded : 
"0"}}).then(function(response){
    $scope.keys = response.data;
});
});

请求标头

GET /keyDBmaven/rest/hello?loaded=0 HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json, text/plain, */*
DNT: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36
Referer: http://localhost:8080/keyDBmaven/index.jsp
Accept-Encoding: gzip, deflate, br
Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7,zh CN;q=0.6,zh;q=0.5,zh-TW;q=0.4
Cookie: JSESSIONID=8B5227C67F86B7B50B8E180066E5B055

我还尝试使用额外的java bean 作为目标对象来接收参数:

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class bean {
    public String loaded;

    @XmlElement
    public String getLoaded() {
        return loaded;
    }

    public void setLoaded(String loaded) {
    this.loaded = loaded;
    }
}

也总是为空。

我在这个问题上待了很长时间,因此非常感谢您提供解决方案。

1 个答案:

答案 0 :(得分:0)

您的“已加载”参数是查询参数,要通过Jax-Rs实现从请求中获取该参数,您需要使用@QueryParam(“ param_name”)批注。所以您的通话应该看起来像

@GET
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public List<Eintrag> fetchEntries(@QueryParam("loaded") String loaded) {
    ...
}