Я получаю сообщение об ошибке «400 неверных запросов» при попытке опубликовать новую проблему в репозитории GitHub - PullRequest
0 голосов
/ 25 января 2019

Я создаю сеть с пружиной, которая позволит пользователю видеть репозитории, их проблемы и добавлять новые проблемы, если они захотят.Проблема появляется, когда пользователь хочет создать новую проблему.Я получаю «Ошибка 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

Ответы [ 2 ]

0 голосов
/ 25 января 2019

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

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

Чем вы все!

0 голосов
/ 25 января 2019

В соответствии с документацией, предоставленной вами в разделе «Создать проблему», значение «этап» должно быть целым числом.Поэтому, глядя на ваш запрос, ни одно не является целым числом.Я не уверен, что 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": []
}

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

...