我正在尝试向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但结果相同。
感谢任何帮助。
答案 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
请求中忽略查询字符串参数。这就是为什么它在请求体中传递它时起作用。
参数
许多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