Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过JSON中的RestTemplate发布请求_Java_Json_Spring_Rest_Resttemplate - Fatal编程技术网

Java 通过JSON中的RestTemplate发布请求

Java 通过JSON中的RestTemplate发布请求,java,json,spring,rest,resttemplate,Java,Json,Spring,Rest,Resttemplate,我没有找到任何解决我问题的例子,所以我想请你帮忙。我不能简单地使用JSON中的RestTemplate对象发送POST请求 每次我得到: org.springframework.web.client.HttpClientErrorException:415不支持的媒体类型 我使用RestTemplate的方式如下: ... restTemplate = new RestTemplate(); List<HttpMessageConverter<?>> list = new

我没有找到任何解决我问题的例子,所以我想请你帮忙。我不能简单地使用JSON中的RestTemplate对象发送POST请求

每次我得到:

org.springframework.web.client.HttpClientErrorException:415不支持的媒体类型

我使用RestTemplate的方式如下:

...
restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> list = new ArrayList<HttpMessageConverter<?>>();
list.add(new MappingJacksonHttpMessageConverter());
restTemplate.setMessageConverters(list);
...
Payment payment= new Payment("Aa4bhs");
Payment res = restTemplate.postForObject("http://localhost:8080/aurest/rest/payment", payment, Payment.class);
。。。
restTemplate=新的restTemplate();
列表>();
添加(新映射JacksonHttpMessageConverter());
restemplate.setMessageConverters(列表);
...
付款=新付款(“Aa4bhs”);
Payment res=restTemplate.postForObject(“http://localhost:8080/aurest/rest/payment“,付款,付款。类别);
什么是我的错?

错误“415不支持的媒体类型”告诉您服务器将不接受您的POST请求。您的请求完全正确,是服务器配置错误


MappingJacksonHttpMessageConverter
将自动将请求内容类型头设置为
application/json
,我猜您的服务器拒绝了。不过,您还没有告诉我们有关服务器设置的任何信息,因此我无法就此向您提供建议。

按照指定,如果您使用Spring 3.0,我想您需要为
MappingJacksonHttpMessageConverter
添加
消息转换器,避免org.springframework.web.client.HttpClientErrorException:415不支持的媒体类型异常的简单方法是在类路径中包含jackson jar文件,并使用
mvc:annotation-driven
config元素

我正在绞尽脑汁想弄明白为什么这个应用程序在没有为
MappingJacksonHttpMessageConverter
进行任何特殊配置的情况下工作。如果你仔细阅读我上面链接的文章:

在封面下面是Spring MVC 将HttpMessageConverter委托给 执行序列化。在这个 在这种情况下,SpringMVC调用 映射JacksonHttpMessageConverter 基于Jackson JSON处理器构建。 此实现已启用 当您使用 mvc:注释驱动的配置 元素与Jackson一起出现在您的 类路径


这项技术对我很有用:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.put(url, entity);
HttpHeaders=newhttpheaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity=新的HttpEntity(requestJson,headers);
ResponseEntity response=restemplate.put(url,实体);

我希望这有帮助

我一直在使用rest模板和JSONObject,如下所示:

// create request body
JSONObject request = new JSONObject();
request.put("username", name);
request.put("password", password);

// set headers
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(request.toString(), headers);

// send request and parse result
ResponseEntity<String> loginResponse = restTemplate
  .exchange(urlString, HttpMethod.POST, entity, String.class);
if (loginResponse.getStatusCode() == HttpStatus.OK) {
  JSONObject userJson = new JSONObject(loginResponse.getBody());
} else if (loginResponse.getStatusCode() == HttpStatus.UNAUTHORIZED) {
  // nono... bad credentials
}
//创建请求主体
JSONObject请求=新建JSONObject();
请求。输入(“用户名”,名称);
请求。输入(“密码”,密码);
//设置标题
HttpHeaders=新的HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity=新的HttpEntity(request.toString(),headers);
//发送请求并解析结果
ResponseEntity loginResponse=restTemplate
.exchange(urlString,HttpMethod.POST,entity,String.class);
if(loginResponse.getStatusCode()==HttpStatus.OK){
JSONObject userJson=新的JSONObject(loginResponse.getBody());
}else if(loginResponse.getStatusCode()==HttpStatus.UNAUTHORIZED){
//不……不好的证件
}

此设置中出现了适用于我的错误:

android注释
Spring Android RestTemplate模块
而且

GsonHttpMessageConverter


Android注释在转换为生成无参数的
POST
请求时存在一些问题。只需使用参数
newobject()
即可解决此问题。

我在尝试调试REST端点时遇到此问题。下面是一个使用Spring的RestTemplate类发出POST请求的基本示例。我花了相当长的时间拼凑来自不同地方的代码,以获得一个工作版本

RestTemplate restTemplate = new RestTemplate();

String url = "endpoint url";
String requestJson = "{\"queriedQuestion\":\"Is there pain in your hand?\"}";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(requestJson,headers);
String answer = restTemplate.postForObject(url, entity, String.class);
System.out.println(answer);
RestTemplate RestTemplate=new RestTemplate();
String url=“端点url”;
String requestJson=“{\”queryedquestion\“:\”你的手疼吗?\“}”;
HttpHeaders=新的HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity=新的HttpEntity(requestJson,headers);
String answer=restTemplate.postForObject(url、实体、String.class);
System.out.println(应答);

我的rest端点使用的特定JSON解析器在字段名周围使用了所需的双引号,因此我在requestJson字符串中转义了双引号。

我遇到了这个问题,我在客户端使用Spring的RestTemplate,在服务器上使用Spring Web。这两个API都有很差的错误报告,这使得它们的开发非常困难

经过几个小时的各种实验,我发现问题是由于为帖子主体传递了一个空引用,而不是预期的列表。我假定RestTemplate无法从空对象确定内容类型,但不会对此表示不满。在添加了正确的头之后,我开始在Spring中获得一个不同的服务器端异常,然后才进入我的服务方法


修复方法是从客户端传入一个空列表,而不是null。由于默认内容类型用于非空对象,因此不需要任何标题

这个代码对我有用

RestTemplate restTemplate = new RestTemplate();
Payment payment = new Payment("Aa4bhs");
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("payment", payment);
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(map, headerObject);

Payment res = restTemplate.postForObject(url, httpEntity, Payment.class);
RestTemplate RestTemplate=new RestTemplate();
付款=新付款(“Aa4bhs”);
MultiValueMap=新链接的MultiValueMap();
地图。添加(“付款”,付款);
HttpEntity HttpEntity=新的HttpEntity(映射,头对象);
Payment res=restemplate.postForObject(url、httpEntity、Payment.class);

我就是这样做的,而且很有效

HttpHeaders headers = createHttpHeaders(map);
public HttpHeaders createHttpHeaders(Map<String, String> map)
{   
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    for (Entry<String, String> entry : map.entrySet()) {
        headers.add(entry.getKey(),entry.getValue());
    }
    return headers;
}
HttpHeaders=createHttpHeaders(map);
公共HttpHeaders创建HttpHeaders(映射)
{   
HttpHeaders=新的HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
for(条目:map.entrySet()){
headers.add(entry.getKey(),entry.getValue());
}
返回标题;
}
//在这里传递标题

 String requestJson = "{ // Construct your JSON here }";
logger.info("Request JSON ="+requestJson);
HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
logger.info("Result - status ("+ response.getStatusCode() + ") has body: " + response.hasBody());
logger.info("Response ="+response.getBody());
private RestTemplate restTemplate = new RestTemplate(); restTemplate.postForObject(serviceURL, request, Void.class);
String result = restTemplate.postForObject(url, entity, String.class);
@Test
public void shouldLoginSuccessfully() {
  // 'restTemplate' below has been @Autowired prior to this
  Map map = new HashMap<String, String>();
  map.put("username", "bob123");
  map.put("password", "myP@ssw0rd");
  ResponseEntity<Void> resp = restTemplate.postForEntity(
      "http://localhost:8000/login",
      map,
      Void.class);
  assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK);
}
RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter()));
ResponseEntity<String> result = restTemplate.postForEntity(uri, yourObject, String.class);
ParameterizedTypeReference<Map<String, Object>> typeRef = new ParameterizedTypeReference<Map<String, Object>>() {};
public Map<String, Object> processResponse(String urlendpoint)
{
    try{
    
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        //reqobj
        JSONObject request = new JSONObject();
        request.put("username", name);
        //Or Hashmap 
        Map<String, Object> reqbody =  new HashMap<>();
        reqbody.put("username",username);
        Gson gson = new Gson();//mvn plugin to convert map to String
        HttpEntity<String> entity = new HttpEntity<>( gson.toJson(reqbody), headers);
        ResponseEntity<Map<String, Object>> response = resttemplate.exchange(urlendpoint, HttpMethod.POST, entity, typeRef);//example of post req with json as request payload
        if(Integer.parseInt(response.getStatusCode().toString()) == HttpURLConnection.HTTP_OK)
        {
            Map<String, Object>  responsedetails = response.getBody();
            System.out.println(responsedetails);//whole json response as map object
            return responsedetails;
        }
    } catch (Exception e) {
        // TODO: handle exception
        System.err.println(e);
    }
    return null;
}