【问题标题】:add json object to Java HttpGet request to C# WebApi向 C# WebApi 的 Java HttpGet 请求添加 json 对象
【发布时间】:2015-05-17 00:44:22
【问题描述】:

我正在尝试将 json 对象从 java 客户端发送到 C# WebApi,但输入参数为空。 java代码:

    ObjectMapper mapper = new ObjectMapper();
    Gson gson = new Gson();  
    String json = gson.toJson(per);
    HttpClient httpclient = new DefaultHttpClient();
    List<NameValuePair> qparams = new ArrayList<NameValuePair>();
    qparams.add(new BasicNameValuePair("person", json.toString()));
    HttpGet httpPost = new HttpGet("http://naviserver.azurewebsites.net/api/Person/Get?" + URLEncodedUtils.format(qparams, "UTF-8"));
        httpPost.setHeader("Accept", "application/json");
        httpPost.setHeader("Content-type", "application/json");
        httpPost.setHeader(
                "Authorization",
                "Bearer TokenRemovedBecauseUseless");


        org.apache.http.HttpResponse httpResponse = httpclient.execute(httpPost);

WebApi 方法:

    public List<String> Get([FromUri]Person person)
    {}

谁能告诉我如何发送 json 对象?

【问题讨论】:

    标签: java c# android json asp.net-web-api


    【解决方案1】:

    问题在于 WebApi 不期望 JSON 格式的 person 对象。通过将 FromUri 与复杂对象一起使用,期望 url 对 Person 中的每个字段都有一个查询参数。

    有一个很好的例子here 关于它是如何工作的。

    基本上你会希望你的查询参数看起来像这样:

    http://naviserver.azurewebsites.net/api/Person/Get?name=dave&age=30

    在 Java 中:

    qparams.add(new BasicNameValuePair("name", person.getName()));
    qparams.add(new BasicNameValuePair("age", String.valueOf(person.getAge())));
    

    如果您想以 JSON 格式发送人,更好的方法是使用 HTTP POST 并在正文中设置 JSON。然后在 WebApi 中,您的方法将如下所示:

    public HttpResponseMessage Post([FromBody]Person 个人)

    您还必须更改您的 Java 客户端以发送 POST 请求。

    HttpClient httpClient = HttpClientBuilder.create().build();
    HttpPost httpPost = new HttpPost("http://naviserver.azurewebsites.net/api/Person");
    Person person = new Person("dave", 30);
    Gson gson = new Gson();  
    String json = gson.toJson(person);
    StringEntity body = new StringEntity(json);
    httpPost.setEntity(body);
    HttpResponse response = httpClient.execute(httpPost);
    

    【讨论】:

    • 如果我在 Person 中有另一个字段:“List childrens”如何在 GET 请求中发送它?如果我使用 POST,我会收到 405 错误...
    • 我不确定是否有发送嵌套在复杂对象内的列表的好方法。如果您更改为 post,您还需要将 Java 客户端更改为 post。我已经更新了答案以显示所需的 Java 更改。
    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2013-07-14
    • 2013-03-15
    • 1970-01-01
    相关资源
    最近更新 更多