通过Java创建存储库github v3 api的问题

时间:2015-11-25 00:39:47

标签: java github-api scribe

我正在尝试向github发送post请求以创建存储库。我有oauth 2.0工作,请求正确签名但github只是返回“解析JSON的问题”

我正在使用Scribe作为事情的方面,据我所知,我已经在网址中添加了JSON,但我并不是100%确定我正确地做了,或者我只是缺少标题或者其他的东西?

@POST
@Path("create_repo/{userid}")
@Produces(MediaType.APPLICATION_JSON)
public Response createRepo(@PathParam("userid") String userid) {

    OAuthService service = createService().build();
    User user = collection.findOneById(userid);

    final OAuthRequest request = new OAuthRequest(Verb.POST, "https://api.github.com/user/repos", service);

    Token token = new Token(user.getGithubToken(), "SECRET");
    service.signRequest(token, request);

    request.addHeader("Content-type", "application/vnd.github.v3+json");
    request.addHeader("X-OAuth-Scopes", "repo");
    request.addQuerystringParameter("name", "Test_v1");

    LOGGER.info("Built request: " + request.getCompleteUrl());

    final com.github.scribejava.core.model.Response response = request.send();

    return Response.ok(response.getBody()).build();
}

构建的网址如下所示:https://api.github.com/user/repos?access_token=XXX_SECRET_XXX&name=Test_v1

我也尝试在params之后交换access_token但结果相同。

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我通过创建一个对象,将其序列化并将其添加为有效负载来解决这个问题。

@POST
@Path("create_repo/{userId}/{projectId}")
@Produces(MediaType.APPLICATION_JSON)
public Response createRepo(@PathParam("userId") String userId, @PathParam("projectId") String projectId) {

    // Setup collections
    User user = userCollection.findOneById(userId);
    ProjectDescription projectDescription = projectCollection.findOneById(projectId);

    // Build repository object from project description
    GithubRepository repository = new GithubRepository();
    repository.setName(projectDescription.getTitle());
    repository.setDescription(projectDescription.getDescription());

    // Serialize object
    ObjectMapper mapper = new ObjectMapper();
    String jsonInString = null;
    try {
        jsonInString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(repository);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }

    // Build request
    OAuthService service = createService().build();
    final OAuthRequest request = new OAuthRequest(Verb.POST, PROTECTED_RESOURCE_URL + "/user/repos", service);
    request.addHeader("content-type", "application/json");
    request.addPayload(jsonInString);

    // Sign and send request
    Token token = new Token(user.getGithubToken(), "secret");
    service.signRequest(token, request);
    request.send();

    return Response.status(201).build();
}

但是,我仍然想知道我的第一次尝试出错了。

答案 1 :(得分:0)

POST请求中忽略查询字符串参数。这就是为什么它在请求体中传递它时起作用。

来自GitHub's API Overview docs

  

参数

     

许多API方法都采用可选参数。对于GET请求,未在路径中指定为段的任何参数都可以作为HTTP查询字符串参数传递:

     

curl -i "https://api.github.com/repos/vmg/redcarpet/issues?state=closed"

     

在此示例中,为:owner:repo参数提供了'vmg'和'redcarpet'值,而:state在查询字符串中传递。

     

对于POST,PATCH,PUT和DELETE请求,URL中未包含的参数应编码为JSON,内容类型为“application / json”:

     

$ curl -i -u username -d '{"scopes":["public_repo"]}' https://api.github.com/authorizations