Я получаю сообщение об ошибке 400 Bad request при попытке опубликовать новую проблему в репозиторий GitHub.

Я создаю сеть с Spring, которая позволит пользователю видеть репозитории, их проблемы и добавлять новые проблемы, если они хотят. Проблема возникает, когда пользователь хочет создать новую задачу. Я получаю «Ошибка 400 Bad Request», и я не могу понять, почему.

Я пытался отправить запрос через параметры URL, но это тоже не сработало. Я также пытался автоматически создать тело с помощью ObjectMapper, но получил тот же результат. Итак, я строю тело сам, но... опять тот же результат.

В строке с комментарием «XXX» происходит сбой программного обеспечения, и в Интернете отображается указанная ошибка.

@PostMapping("newIssue/{user}/{repo}/{fullName}")
public String registerUser(@PathVariable String user, @PathVariable String repo, @PathVariable String fullName, @Valid NewIssue newissue, Errors errors, Model model, OAuth2AuthenticationToken authentication) throws JsonProcessingException {

    //To debug
    System.out.println("### Registering issue");

    //Check errors
    List<String> errorsStrings = new ArrayList<>();
    errors.getAllErrors().forEach(e->errorsStrings.add(e.getDefaultMessage()));
    model.addAttribute("errors", errorsStrings);
    model.addAttribute("newissue", newissue);
    if(errors.hasErrors()) {
        //To debug
        System.out.println("### HAS ERRORS");
        for (String err: errorsStrings )
            System.out.println("    " + err);
        //If has errors show again the page
        return "newIssue";
    }

    //To debug
    System.out.println("### Does not have ERRORS");

    //Create the client variable
    OAuth2AuthorizedClient client = authorizedClientService.loadAuthorizedClient( authentication.getAuthorizedClientRegistrationId(), authentication.getName() );

    //Construct the necessary headers
    HttpHeaders headers = new HttpHeaders();
    headers.add(HttpHeaders.AUTHORIZATION, "token " + client.getAccessToken().getTokenValue());
    headers.add(HttpHeaders.ACCEPT, "application/vnd.github.v3+json");

    //Construct the html petition's body
    ObjectMapper mapper = new ObjectMapper();
    //String body = mapper.writeValueAsString(newissue);
    String body =
            "{\n" +
            "  \"title\": \"" + newissue.getTitle() + "\",\n" +
            "  \"body\": \"" + newissue.getBody() + "\",\n" +
            "  \"assignees\": [],\n" +
            "  \"milestone\": none,\n" +
            "  \"labels\": []\n" +
            "}"
    ;

    //Merge the header and the body
    HttpEntity<String> request = new HttpEntity<String>(body, headers);

    //To debug
    System.out.println("### Going to send post: ");
    System.out.println(body);

    //Send the issue to the api
    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<String> response = restTemplate.exchange("https://api.github.com/repos/" + user + "/" + repo + "/issues", HttpMethod.POST, request, String.class); //XXX

    //To debug
    System.out.println("### Post sent");

    //To debug
    System.out.println("### RESPONSE: " + response);

    //Go to the repos' issues webpage
    return "redirect:issues/"+user+"/"+repo+"/"+fullName;
}

Я ожидал, что этот метод создаст новую проблему в репозитории, а затем перенаправит к списку проблем репозитория. Я проверил тело, и мне кажется, что это правильно:

{
  "title": "TestTitle",
  "body": "TestBody",
  "assignees": [],
  "milestone": none,
  "labels": []
}

Я сделал все это, ознакомившись с документацией GitHub API: https://developer.github.com/v3/issues/#create-an-issue


person Guillem Poy    schedule 25.01.2019    source источник
comment
Согласно документации, milestone должно быть целым числом.   -  person NeplatnyUdaj    schedule 25.01.2019
comment
Если я не изменю ни одного на любое целое число, ответ станет 422 Unprocessable Entity. Я предполагаю, что это связано с отсутствием какой-либо вехи в репозитории. (я пробовал с 1, 0 и -1)   -  person Guillem Poy    schedule 25.01.2019


Ответы (2)


Согласно документации, которую вы предоставили в разделе «Создать задачу», значение «вехи» должно быть целым числом. Поэтому, глядя на ваш запрос, none не является целым числом. Я не уверен, какой int вы бы указали в запросе, но я не верю, что «none» сработает.

   String body =
        "{\n" +
        "  \"title\": \"" + newissue.getTitle() + "\",\n" +
        "  \"body\": \"" + newissue.getBody() + "\",\n" +
        "  \"assignees\": [],\n" +
        "  \"milestone\": 0,\n" +
        "  \"labels\": []\n" +
        "}"
   ;

Это создаст следующее тело:

{
    "title": "TestTitle",
    "body": "TestBody",
    "assignees": [],
    "milestone": 0,
    "labels": []
}

Кроме того, глядя на раздел «Список проблем для репозитория», кажется, что они упоминают только об использовании «none» в качестве строки.

person Brandon    schedule 25.01.2019
comment
Спасибо, что заставил меня задуматься. Как я упоминал ранее в другом комментарии, если я не изменю ни одного целого числа, ответ станет 422 Unprocessable Entity. Я предполагаю, что это связано с отсутствием какой-либо вехи в репозитории. Изменение none на строку (добавление кавычек) дало мне тот же результат, что и без. Однако я могу полностью удалить веху и тогда все работает! Я думал, что это обязательно. Благодарю вас! - person Guillem Poy; 25.01.2019

Как сказали Брэндон и НеплатныУдай, проблема, вероятно, была связана с «веховой линией», поскольку она обязательно должна быть целым числом. Я поставил «нет», потому что я не хотел добавлять какие-либо вехи, и это ключевое слово, используемое, если вы хотите удалить вехи после создания проблемы.

Благодаря людям, которые ответили мне, я понял, что вы можете удалить «линию вехи», потому что нет способа сообщить API, что «нет вех» в создании задачи (несмотря на то, что вы можете удалить все вехи после создание по документации).

Чем вы все!

person Guillem Poy    schedule 25.01.2019