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

标签 java json spring resttemplate

我不断收到错误消息,指出这不是有效的 json 数据,并不断收到错误 400。我认为我的实现没有正确格式化数据。 目标:尝试通过传入 JSON 数据作为正文,使用 REST 模板进行后期调用。看来从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";
        }
    }

最佳答案

正确,您生成的 JSON 无效

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

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

如果禁用 Gson HTMLEscaping

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

你会得到

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

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

您必须使用双引号修复 map 中的venue_queries关键内容使用双引号"

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

那么你生成的 JSON 将是有效的

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

测试片段

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());
        }
    }
}

关于java - 使用 spring 中的 Rest 模板通过 post 调用发送 json 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22856594/

相关文章:

相当于 typeof(SomeClass) 的 Java

java - 我虽然我知道关于 Enum 的一切,但是它是如何工作的

javascript - 是否可以使用包含多个单词的字符串作为 json key?

ios - 将动态数组传递给 ImageSlideshow ios

java - Spring 形式选择选项

java - iBatis 映射 : map a string field into a List<String>

java - RequestFactory 请求 (AutoBeanCodexImpl.doCoderFor) 永远不会完成并使用 100% cpu

ruby - 有效地检查 JSON 响应是否包含数组中的特定元素

java - 在代码中解密 AES 加密的授权 token 方法时 Jar 崩溃。 hs_err _pid 文件提到 arrayof_jbyte_fill

java - 如何使用带注释的查询让 PageRequest 在 Spring Boot 中工作