当前位置: 首页 > 知识库问答 >
问题:

使用spring中的rest模板通过post调用发送json数据

周峻
2023-03-14

我一直收到一个错误,说这不是有效的json数据,并一直收到错误400。我认为我的实现没有正确格式化数据。目标:尝试使用rest模板进行post调用,将JSON数据作为主体传递。似乎从map转换为json数据时,它没有正确转换为json。

public void GetJsonData(String name, String city) {
        Map<String, String> map = new HashMap<String, String>();
        map.put("api_key", apikey);



map.put("venue_queries", "[{'name':'"+name+"', 'location': {'locality': '"+city+"'}}]");

        try {
            String resp = GlobalHelper.calltestService(RestServicesUrl, map);
            System.out.println(resp);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


public String calltestService(String url, Map<String, String> data) throws Exception {
        RestTemplate rest = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
        ResponseEntity<String> response = new ResponseEntity<String>(headers, HttpStatus.OK);
        rest.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
            Gson gson = new Gson();
            System.out.println(gson.toJson(data));
        try {
            response = rest.postForEntity(url, gson.toJson(data), String.class);
            System.out.println(response.getBody()); 
            System.out.println(response.getHeaders());
            return response.getBody();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("error in post entity");
            return "error";
        }
    }

共有1个答案

钱元徽
2023-03-14

正确,您生成的JSON无效

{
    "venue_queries": "[{\u0027name\u0027:\u0027yo\u0027, \u0027location\u0027: {\u0027locality\u0027: \u0027Solares\u0027}}]",
    "api_key": "asfasdfasfdasdfasdfa"
}

JSON无效,因为GSON默认情况下会转义HTML字符,并将单引号作为等效的unicode字符代码U 0027

如果您禁用Gson HTMLEscape ing

GsonBuilder builder = new GsonBuilder();
builder.disableHtmlEscaping();
Gson gson = builder.create();

你会得到

{
    "venue_queries": "[{'name':'yo', 'location': {'locality': 'Solares'}}]",
    "api_key": "asfasdfasfdasdfasdfa"
}

无论如何,您的JSON仍然不正确。

您必须使用双引号修复地图中的场馆查询关键内容

map.put("venue_queries", "[{\"name\":\""+name+"\", \"location\": {\"locality\": \""+city+"\"}}]");

那么生成的JSON将是有效的

{
    "venue_queries": "[{\"name\":\"yo\", \"location\": {\"locality\": \"Solares\"}}]",
    "api_key": "asfasdfasfdasdfasdfa"
}

Tes代码段

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import com.google.gson.Gson;

public class GsonMap {

    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        String apikey = "asfasdfasfdasdfasdfa";
        map.put("api_key", apikey);
        String name = "yo";
        String city = "Solares";
        map.put("venue_queries", "[{\"name\":\""+name+"\", \"location\": {\"locality\": \""+city+"\"}}]");
        Gson gson = new Gson();
        String json = gson.toJson(map);
        System.out.println("Resulting JSON:" + json);
        map = gson.fromJson(json, map.getClass());
        System.out.println("Resulting map values:");
        for (Entry<String, String> entry : map.entrySet()) {
            System.out.println("Key:" + entry.getKey() + ", value:" + entry.getValue());
        }
    }
}
 类似资料:
  • 我需要使用rest模板使用以下详细信息进行post调用: 我需要发送带有4/5个参数的json,需要为内容类型和接受设置标题,并使用be post设置方法。 您可以帮助我使用示例代码来创建json对象、设置头并进行post调用吗

  • 我试图实现同样的事情:如何使用查询参数表示为JSON与Spring RestTemplate?,发送JSON字符串作为URL参数在. 公认的答案提到将JSON对象作为请求参数发送通常不是一个好主意,因为您可能会面临JSON中的花括号问题。这正是当我试图对API进行GET调用时发生的事情。由于这是来自另一个系统的API,我不能要求他们更改格式,必须调用GETendpoint,将JSON作为参数传递。

  • 我正在使用 kafka 和 spring boot,我需要将 JSON 对象发送到 kafka,关键是我能够将一个对象作为配置 KafkaTemplate 的 JSON 发送,但仅适用于此对象。 但是如果现在我想发送一个新的DTO对象呢?我是否必须声明一个新的

  • 我使用spring rest模板作为请求发送json数组。发送请求的源代码如下: 并接受请求: 问题是它给了我以下错误:无法写入请求:找不到适合请求类型[org.json.JSONArray]的HttpMessageConverter。任何建议都是可以接受的。

  • 本文向大家介绍JavaScript 通过POST发送和接收JSON数据,包括了JavaScript 通过POST发送和接收JSON数据的使用技巧和注意事项,需要的朋友参考一下 示例 6 提取请求承诺最初将返回Response对象。它们将提供响应头信息,但它们不直接包含响应主体,而响应主体可能尚未加载。可以使用诸如Response对象上的方法来等待响应主体加载,然后对其进行解析。.json()

  • 我在Java客户端有以下代码,它调用基于Spring的REST服务,我得到一个HTTP 400错误。但它与POST man Client完美配合 Java客户端: 服务器端REST服务代码为 现在,当客户端发送请求时,它会给我http 400错误,这可能是因为在客户端,即时消息发送JSON字符串,而在服务器端,它是一个主体,但这在POST MAN上有效 谁能建议我如何通过Java向基于spring