135

私の問題を解決する方法の例が見つからなかったので、助けを求めたい. 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);

私のせいは何ですか?

4

15 に答える 15

175

このテクニックは私のために働いた:

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

HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.put(url, entity);

これが役立つことを願っています

于 2011-05-25T17:24:13.013 に答える
14

ここで指定されているように、 messageConverterfor を追加する必要があると思いますMappingJacksonHttpMessageConverter

于 2010-11-02T12:14:49.383 に答える
12

私はこのようにやっていますが、うまくいきます。

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

// ここにヘッダーを渡します

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

お役に立てれば

于 2017-11-21T11:29:04.773 に答える
10

Spring 3.0 を使用している場合、org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type例外を回避する簡単な方法は、クラスパスに jackson jar ファイルを含め、mvc:annotation-drivenconfig 要素を使用することです。ここで指定されているとおり

mvc-ajaxアプリが特別な設定なしで動作する理由を理解しようとして、私は髪を引っ張っていましたMappingJacksonHttpMessageConverter。上でリンクした記事をよく読んだら:

内部では、Spring MVC は HttpMessageConverter に委任してシリアライゼーションを実行します。この場合、Spring MVC は、Jackson JSON プロセッサー上に構築された MappingJacksonHttpMessageConverter を呼び出します。クラスパスに Jackson が存在する mvc:annotation-driven 構成要素を使用すると、この実装は自動的に有効になります。

于 2011-05-19T17:45:47.640 に答える
7

「415 Unsupported Media Type」エラーは、サーバーが POST 要求を受け入れないことを示しています。あなたの要求はまったく問題ありません。サーバーの構成が間違っています。

MappingJacksonHttpMessageConverterリクエストの content-type ヘッダーを自動的に に設定application/jsonします。サーバーがそれを拒否していると思います。ただし、サーバーのセットアップについては何も言われていないので、それについてアドバイスすることはできません.

于 2010-11-02T08:47:24.147 に答える
4

私はこの問題を抱えていて、クライアントで Spring の RestTemplate を使用し、サーバーで Spring Web を使用しています。どちらの API もエラー レポートが非常に貧弱で、開発が非常に困難です。

あらゆる種類の実験を何時間も試みた後、予想されるリストではなく、POST 本文の null 参照を渡すことによって問題が発生していることを突き止めました。RestTemplate は null オブジェクトから content-type を判断できないと思いますが、それについて不平を言うことはありません。正しいヘッダーを追加した後、サービス メソッドに入る前に、Spring で別のサーバー側例外が発生し始めました。

修正は、null の代わりにクライアントから空のリストを渡すことでした。null 以外のオブジェクトにはデフォルトの content-type が使用されるため、ヘッダーは必要ありません。

于 2015-10-06T15:02:23.633 に答える
4

このコードは私のために働いています。

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);
于 2016-10-20T11:10:39.350 に答える
0

私にとって、このセットアップでエラーが発生しました:

AndroidAnnotations Spring Android RestTemplate Module と ...

GsonHttpMessageConverter

Android アノテーションには、これがPOSTパラメーターなしでリクエストを生成するように変換されると、いくつかの問題があります。単純にパラメーターnew Object()で解決しました。

于 2015-05-05T10:17:23.800 に答える
0

春のブートで次のように試しました:

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;
}
于 2020-07-08T12:46:33.277 に答える