HTTP Post Request ohne Daten

8u3631984

Bekanntes Mitglied
Hallo ich möchte gerne einen HTTP Request mittels
Java:
        HttpClient httpClient = HttpClient.newBuilder()
                .version(HttpClient.Version.HTTP_2)
                .connectTimeout(Duration.ofSeconds(10))
                .build();

        Map<String, String> values = new HashMap<String, String>() {{
            put("name", "John Doe");
        }};

        HttpRequest request = HttpRequest.newBuilder()
                .POST(ofFormData(values))
                .uri(URI.create("http://localhost:8080/post"))
                .build();
        log.info("send request {}", request.uri().toString());

       ....
private HttpRequest.BodyPublisher ofFormData(Map<String, String> data) {
    var builder = new StringBuilder();

    for (Map.Entry<String, String> entry : data.entrySet()) {
        if (builder.length() > 0) {
            builder.append("&");
        }

        builder.append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8));
        builder.append("=");
        builder.append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8));
    }

    log.info("request parameter : {}", builder);

    return HttpRequest.BodyPublishers.ofString(builder.toString());
}

Hier noch der Controller :
Java:
@RestController
@Log4j2
public class HelloWorldController {
    @PostMapping("/post")
    public String sayHello(@RequestParam String name) {
        log.info("HELLO {}", name);
        return "HELLO " + name;
    }
}

Wenn ich nun versuche den Controller mit Daten zu befüttern so bekomme ich immer einen Fehler :
Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'name' is not present]

Wenn ich über Postman (externes Tool) die URL aufrufe : http://localhost:8080/post?name=JOHN
Dann klappt es. daher meine Vermutung, dass der generierte Request keine Daten enthällt.

Kann mir jemand einen Tipp geben, was ich falsch mache ?
 
K

kneitzel

Gast
Mit
.POST(ofFormData(values))
schreibst Du das ja in den BODY:
Sets the request method of this builder to POST and sets its request body publisher to the given value.

Aber Du erwartest das ja nicht im Body sondern im Path - daher klappt es ja auch mit dem Test.

Wenn Du es aus dem Body haben wolltest, dann wäre @RequestBody oder so notwendig:
Oder Du musst halt den Request so stellen, dass name in der URL mit angegeben wird.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben