【问题标题】:How to get array from Http Post in a Restful Web Service?如何从 Restful Web 服务中的 Http Post 获取数组?
【发布时间】:2016-03-03 21:44:48
【问题描述】:

我有一个 AngularJS 框架的控制器。我使用 Http Post Request 将数组发送到服务器。如何在java方法中获取这个数组?

这是我的控制器

var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope, $http) {

var indici = new Array();

indici.push(1);
indici.push(2);

$http.post("http://localhost:8080/SistemiDistribuiti/rest/Point/Trovati", indici, {
              headers: { 'Content-Type': 'application/json' }
            }).success(function(receivedData, status) {
                $scope.someData = receivedData;
            });

这是我的 java 类,但我不知道如何获取我的数组。

import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.POST;
import javax.ws.rs.Consumes;

@Path("Point")
public class PointService {


@POST
@Path("Trovati")
@Consumes(MediaType.APPLICATION_JSON)
public void RetrieveData() {
     //how print my array?
}

【问题讨论】:

  • 如果您的问题是在服务器端检索数据,那么请更新您的客户端代码以实际发送内容。
  • 我的问题是我的控制器中有一个数组(indici)。我想将此数组发送到服务器端(我使用tomcat),但我不知道http请求是否正确e以及如何在我的java代码中检索此数组。

标签: java arrays angularjs rest httprequest


【解决方案1】:

Apache 有一个 http 库,可用于发出各种 http 请求。

<dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <version>4.3.2</version>
  </dependency>

您还需要一个可用于将 json 对象转换为 Java 对象的库。 Google 创建了一个名为 gson 的库,我将在我的示例中使用它。

<dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.2.4</version>
  </dependency>

您还必须创建一个代表您的数据的 Java 对象。这将用于将您的 json 对象映射到 java 对象或“pojo”。我不确定您的 JSON 对象是什么样的,但我将使用一个名为 Response 的通用示例。

public class Response
{
    private List<Example> examples;
    private double total;
    private String someString;

    public QuoteResponse()
    {
        super();
    }

    public List<Examples> getExamples() {
        return examples;
    }

    public void setExamples(List<Examples> examples)
    {
        this.examples = examples;
    }

    public double getTotal() {
        return total;
    }

    public void setTotal(double total) {
        this.total = total;
    }

    public String getSomeString() {
        return someString;
    }

    public void setPrint_type(String someString) {
        this.someString = someString;
    }
}

您的 java 对象必须具有与您的 JSON 对象相同类型和名称的相同数量的字段。

接下来,您必须编写一个调用 Angular api 的函数。请参阅下面的示例:

public Response getJsonData()
{
    params = new Params();
    String url = "https://www.yoururl.com/controller/function_you_want;
    Response response = null;
    HttpGet httpGet = new HttpGet(url);

    try
    {
        response = httpClient.execute(httpGet);

        //check to make sure that everything is ok
        if(response.getStatusLine().getStatusCode() == 200)
        {
            entity = response.getEntity();
            jsonResponse = EntityUtils.toString(entity);
            JsonNode root = mapper.readTree(jsonResponse).get("result");
            response = gson.fromJson(root.toString(),Response.class);
        }
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }

    return response;
}

就是这样。如果您有任何问题,请告诉我。

【讨论】:

  • 我的数组 indici(在控制器角度)是一个 int 数组。使用您的代码如何将我的数组保存到 java 中的 int 数组?
  • @legolas07 您只需将类型添加到 java 类。例如,您将拥有 List 示例,而不是 List 示例。
  • 我更改了构造函数的名称,因为它与类的名称不同。明天我会测试代码!
  • 你确定这段代码(getJsonData)是正确的吗?我正在尝试编译它,但是有很多错误。
  • @legolas07 它更多地是一个指南,而不是你可以复制到应用程序中并按原样运行的代码。话虽如此,是的,这是正确的。我从我之前做的一个项目中拿了这个例子,尽管为了简单起见我删除了一些东西。我的项目编译,我能够读取和解析来自我正在调用的 api 的 json 响应。您遇到的任何错误都已经结束,如果不查看您的代码,我无法告诉您为什么它不适合您。
【解决方案2】:

我同意@lex82,您不会在请求中发送有效负载。请参阅$http.post 的文档:https://docs.angularjs.org/api/ng/service/$http#post。请务必了解 Promise 是什么以及如何在 Angular 的 HTTP 支持中使用它们。

这是一个示例:

var dataToSend = {
  // some JSON data
};
$http.post("/some-url", dataToSend, {
  headers: { 'Content-Type': 'application/json' }
}).success(function(receivedData, status) {
        $scope.someData = receivedData;
});

也就是说,您说您没有收到服务器上的数据。首先要做的是检查您的原始请求。这可以使用 Chrome 开发者工具 (CRTL + SHIFT + i) 在 Chrome 中完成。这将使您可以访问包含每个请求的网络选项卡。单击与您的 AJAX 请求对应的请求,并检查您的请求中是否有有效负载。如果是这样,那是您的 JAXRS 应用程序中的服务器端存在问题。

您的 JAXRS 应用程序中有一些例外吗?

希望对你有帮助, 蒂埃里

【讨论】:

  • 也许,您忘记在 AJAX 请求中设置 Content-Type 标头...我在 Angular sn-p 中更新了对此的回答。
  • 好的,我理解 http 请求,但我不知道如何在 java 类上检索这些数据。
  • 这只是您在带有@POST的注释方法中指定的参数...您应该在类路径中拥有像Jackson这样的工具来将有效负载内容从字符串转换为对象...
  • 好的,我找到了这个mkyong.com/java/jackson-2-convert-java-object-to-from-json 现在试试看。
【解决方案3】:

你必须使用@GET,如下:

@GET
@Path("/blabla")
public Response receiveListOfStrings(@QueryParam("list") final List<String> list){
    log.info("receieved list of size="+list.size());
    return Response.ok().build();
}

请求:

GET http://example.com/services/echo?list=balbla&list=asdasd&list=BYE

Post 不支持此功能。或者你可以使用复杂类型的@PUT

例子:

@PUT
public Response putExample(MyObject obj) {
    log.info("receieved list of size="+obj.getList().size());
    return Response.ok().build();
}

在这个 put 示例中,您可以看到我使用了自定义 MyObject 这是它的代码:

public class MyObject{

    private List<String> list = new ArrayList<String>();

    public List<String> getList(){
        return list;
    }

    public void setList( List<String> list ){
        this.list = list;
    }

    @Override
    public String toString(){
        return "MyObject [list=" + list + "]";
    }

}

如您所见,您的 MyObject 类中有一个列表属性。因此,您可以通过调用 getList 作为我上面的示例来打印任何内容。

【讨论】:

  • 如何使用put请求?我在控制器中使用 put 更改帖子,但在 java 类中?
  • 请看我已经编辑了我的答案,您可以创建一个类并在其中放入一个数组,然后您可以像上面一样使用它。
  • 感谢您的回复,但在您的代码中,我的数组在哪里?为什么 putexample 方法有一个对象参数?如何获取我的数组,并使用正常的 system.out.print 打印?抱歉,我是一个有 http 请求的菜鸟。
  • 请在此处查看答案:stackoverflow.com/questions/2697541/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
相关资源
最近更新 更多