title: Spring WebFlux WebClient - How to resolve 400 Bad Request
body: <p>I am a newbie to reactive programming and I am using Spring WebFlux's WebClient to make a POST request to the below URL as part of my Spring Boot application to assign an existing quiz to a candidate. I am having trouble understanding what I've done wrong in constructing my WebClient request.</p>
  
  <p><strong>End-point</strong></p>
  
  <p><code>https://www.flexiquiz.com/api/v1/users/{user_id}/quizzes</code></p>
  
  <p>In my request body, I need to pass the quiz id that I get from another API (works fine).</p>
  
  <pre><code>{
     "quiz_id": ""
  }
  </code></pre>
  
  <p>Apart from passing the request body, I am also passing <strong>X-API-KEY</strong> as part of request header.</p>
  
  <p>However, when I tried hitting the end-point, I am getting a <strong>{"message":"400: Bad Request"}</strong> error.</p>
  
  <p>Below is my code.</p>
  
  <p><strong><em>QuizRequest.java</em></strong></p>
  
  <pre><code>@JsonInclude(JsonInclude.Include.NON_NULL)
  @Data
  public class QuizRequest {
  
    @JsonProperty("quiz_id")
    @NotBlank
    private String quizId;
  
    public QuizRequest(@NotBlank String quizId) {
      this.quizId = quizId;
    }
  }
  </code></pre>
  
  <p><strong><em>FlexiQuizClient.java</em></strong></p>
  
  <pre><code>@Service
  @Slf4j
  public class FlexiQuizClient {
  
    private static final String USER_AGENT = "WebClient for FlexiQuiz";
  
    private final WebClient webClient;
  
    @Value("${flexiquiz.baseurl}")
    private String FLEXIQUIZ_API_BASE_URL;
  
    @Value("${flexiquiz.key}")
    private String FLEXIQUIZ_API_KEY;
  
    @Autowired
    public FlexiQuizClient() {
      this.webClient = WebClient.builder()
          .baseUrl(FLEXIQUIZ_API_BASE_URL)
          .defaultHeader(HttpHeaders.USER_AGENT, USER_AGENT)
          .filter(logRequest())
          .build();
    }
  
    public String assignQuizToCandidate(String userId, QuizRequest quizRequest) {
      return Objects.requireNonNull(webClient.post()
          .uri(FLEXIQUIZ_API_BASE_URL + "/v1/users/" + userId + "/quizzes")
          .header("X-API-KEY", FLEXIQUIZ_API_KEY)
          .body(Mono.just(quizRequest), QuizRequest.class)
          .exchange()
          .block())
          .bodyToMono(String.class)
          .block();
    }
  
    private ExchangeFilterFunction logRequest() {
      return (clientRequest, next) -&gt; {
        log.info("Request: {} {}", clientRequest.method(), clientRequest.url());
        clientRequest.headers()
            .forEach((name, values) -&gt; values.forEach(value -&gt; log.info("{}={}", name, value)));
        return next.exchange(clientRequest);
      };
    }
  }
  </code></pre>
  
  <p>In my resource class (controller), I am calling the web client method as shown below:</p>
  
  <p><strong><em>ResponseResource.java</em></strong></p>
  
  <pre><code>private String assignQuizToCandidate(String userId, QuizRequest quizRequest)
        throws ParseException {
      log.info("Assigning a quiz based on your skill");
      String message = quizClient.assignQuizToCandidate(userId, quizRequest);
      log.info("message from status: " + message);
      JSONParser parser = new JSONParser();
      JSONObject json = (JSONObject) parser.parse(message);
      return (String) json.get("message");
  }
  </code></pre>
  
  <p>Inside another method I am calling the above method as shown below.</p>
  
  <pre><code>QuizRequest quizRequest = new QuizRequest(openQuiz.get().getQuizId());
  String status = assignQuizToCandidate(userId, quizRequest);
  </code></pre>
  
  <p>Below are the logs:</p>
  
  <pre><code>2020-05-17 10:20:09.938 DEBUG 32600 --- [ctor-http-nio-1] r.n.resources.PooledConnectionProvider   : [id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443] Channel acquired, now 1 active connections and 0 inactive connections
  2020-05-17 10:20:09.938 DEBUG 32600 --- [ctor-http-nio-1] r.netty.http.client.HttpClientConnect    : [id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443] Handler is being applied: {uri=https://www.flexiquiz.com/api/v1/users/{userid}/quizzes, method=POST}
  2020-05-17 10:20:09.939 DEBUG 32600 --- [ctor-http-nio-1] r.n.resources.PooledConnectionProvider   : [id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443] onStateChange(POST{uri=/api/v1/users/{userid}/quizzes, connection=PooledConnection{channel=[id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443]}}, [request_prepared])
  2020-05-17 10:20:09.939 DEBUG 32600 --- [ctor-http-nio-1] o.s.http.codec.json.Jackson2JsonEncoder  : [1bbedd72] Encoding [QuizRequest(quizId={quizid})]
  2020-05-17 10:20:09.941 DEBUG 32600 --- [ctor-http-nio-1] r.n.resources.PooledConnectionProvider   : [id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443] onStateChange(POST{uri=/api/v1/users/{userid}/quizzes, connection=PooledConnection{channel=[id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443]}}, [request_sent])
  2020-05-17 10:20:10.189 DEBUG 32600 --- [ctor-http-nio-1] r.n.http.client.HttpClientOperations     : [id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443] Received response (auto-read:false) : [Cache-Control=private, Content-Type=text/html; charset=utf-8, Server=Microsoft-IIS/10.0, Date=Sun, 17 May 2020 04:50:10 GMT, Content-Length=30]
  2020-05-17 10:20:10.189 DEBUG 32600 --- [ctor-http-nio-1] r.n.resources.PooledConnectionProvider   : [id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443] onStateChange(POST{uri=/api/v1/users/{userid}/quizzes, connection=PooledConnection{channel=[id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443]}}, [response_received])
  2020-05-17 10:20:10.189 DEBUG 32600 --- [ctor-http-nio-1] o.s.w.r.f.client.ExchangeFunctions       : [1bbedd72] Response 400 BAD_REQUEST
  2020-05-17 10:20:10.189 DEBUG 32600 --- [ctor-http-nio-1] r.n.http.client.HttpClientOperations     : [id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443] Received last HTTP packet
  2020-05-17 10:20:10.189 DEBUG 32600 --- [ctor-http-nio-1] r.n.resources.PooledConnectionProvider   : [id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443] onStateChange(POST{uri=/api/v1/users/{userid}/quizzes, connection=PooledConnection{channel=[id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443]}}, [response_completed])
  2020-05-17 10:20:10.189 DEBUG 32600 --- [ctor-http-nio-1] r.n.resources.PooledConnectionProvider   : [id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443] onStateChange(POST{uri=/api/v1/users/{userid}/quizzes, connection=PooledConnection{channel=[id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443]}}, [disconnecting])
  2020-05-17 10:20:10.189 DEBUG 32600 --- [ctor-http-nio-1] r.n.resources.PooledConnectionProvider   : [id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443] Releasing channel
  2020-05-17 10:20:10.189 DEBUG 32600 --- [ctor-http-nio-1] r.n.resources.PooledConnectionProvider   : [id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443] Channel cleaned, now 0 active connections and 1 inactive connections
  2020-05-17 10:20:10.190 DEBUG 32600 --- [ctor-http-nio-1] reactor.netty.channel.FluxReceive        : [id: 0x2b404095, L:/192.168.0.106:62197 - R:www.flexiquiz.com/208.117.41.204:443] Subscribing inbound receiver [pending: 1, cancelled:false, inboundDone: true]
  2020-05-17 10:20:10.190 DEBUG 32600 --- [ctor-http-nio-1] o.s.core.codec.StringDecoder             : [1bbedd72] Decoded "{"message":"400: Bad Request"}"
  2020-05-17 10:20:10.190  INFO 32600 --- [nio-8086-exec-6] i.d.ivrauto.resource.ResponseResource    : message from status: {"message":"400: Bad Request"}
  2020-05-17 10:20:10.190  INFO 32600 --- [nio-8086-exec-6] i.d.ivrauto.resource.ResponseResource    : json.get(message): 400: Bad Request
  2020-05-17 10:20:10.190  INFO 32600 --- [nio-8086-exec-6] o.h.e.i.AbstractFlushingEventListener    : Processing flush-time cascades
  2020-05-17 10:20:10.195 DEBUG 32600 --- [nio-8086-exec-6] o.h.e.i.AbstractFlushingEventListener    : Dirty checking collections
  </code></pre>
  
  <p>Below is the end point I am trying to access.</p>
  
  <pre><code>POST: /v1/users/{user_id}/quizzes
  </code></pre>
  
  <p><strong><em>Example Request</em></strong></p>
  
  <pre><code>$ curl https://www.flexiquiz.com/api/v1/users/06e3244f-1381-4da4-aa75-996981b42edb/quizzes 
  -H "X-API-KEY: fcb5f59c-2a2f-44a9-8261-33cbfa97be99"
  -d quiz_id="1153af46-9580-4672-af78-f23ce2577a14"
  </code></pre>
  
  <p><strong><em>Example Response</em></strong></p>
  
  <pre><code>{                             
      "message": "200: OK"
  }
  </code></pre>