与linkedin v2 api共享的图像未发布在页面供稿上

时间:2019-02-28 18:58:11

标签: java curl httprequest linkedin-api

好,所以这是我的问题。.要通过linkedin api共享图像发布,您首先必须注册您的图像文件,然后通过发送二进制文件的发布请求来进行此操作。然后,您使用原始请求中的图片URN提交您的帖子。我的请求通过,返回201代码(应该是成功的请求),但最终没有发布图像或文本。如果我尝试仅发布文本,则可以。我尝试使用curl注册我的图像,并将其发布在linkedin上,所以我认为我没有在请求中正确发送二进制文件,这是我的请求:

            HttpClient client = HttpClientBuilder.create().build();
            HttpPut request = new HttpPut(uploadUrl);
            request.addHeader("Content-Type", "data/binary");
            request.setHeader("X-Restli-Protocol-Version", "2.0.0");
            request.setHeader("Authorization", "Bearer " + myToken);

            File file = new File(pictureUrl);

            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
            builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            builder.addBinaryBody("upload-file", file);
            request.setEntity(builder.build());
            HttpResponse response = client.execute(request);

我收到带有此代码的代码201,但仍未发布。 这是他们在Share API doc上发出的请求的curl示例。

curl -i --upload-file /Users/peter/Desktop/superneatimage.png --header "Authorization: Bearer redacted" 'https://api.linkedin.com/mediaUpload/C5522AQGTYER3k3ByHQ/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&m=AQJbrN86Zm265gAAAWemyz2pxPSgONtBiZdchrgG872QltnfYjnMdb2j3A&app=1953784&sync=0&v=beta&ut=2H-IhpbfXrRow1'

你能告诉我我的Java等同程序出什么事了吗?

编辑:忘了说我什至尝试从java调用curl,这与我在终端中使用的相同代码,但仍然无法正常工作。.

        Process p;
        try {
            p = Runtime.getRuntime().exec("curl -i --upload-file" + " " + pictureUrl + " " + "--header \"Authorization: Bearer " + myToken + "\" '" + uploadUrl + "'");
            p.waitFor();
            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

            String line = "";
            String outputController = "";
            while ((line = reader.readLine()) != null) {
                outputController = outputController + '\n' + line;
            }
            System.out.println("out: ");
            System.out.println(outputController);
            return true;
        } catch (IOException | InterruptedException ex) {
            return false;
        }

输出返回一个空字符串。

Edit2:另一个有趣的事情是,当我执行主要请求时,在其中发送文本,以及提交图像后收到的媒体ns,我再次获得201,就像它成功一样,在响应中我什至得到了邮递区号。然后,我尝试使用另一个api端点,并使用从响应中获取的ID提取该帖子,然后获取所有数据,就像该帖子一样。它甚至在json中说我知道生命周期已发布,媒体的状态为READY。唯一与json上发布的图像帖子不同的是,媒体对象具有缩略图,在这种情况下,它们没有缩略图,只是一个空的json数组。

4 个答案:

答案 0 :(得分:2)

我发现卷曲到C#转换器https://curl.olsh.me/ 下面是生成的代码段:



    using (var httpClient = new HttpClient())
    {
        using (var request = new HttpRequestMessage(new HttpMethod("PUT"), "https://api.linkedin.com/mediaUpload/C5522AQGTYER3k3ByHQ/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&m=AQJbrN86Zm265gAAAWemyz2pxPSgONtBiZdchrgG872QltnfYjnMdb2j3A&app=1953784&sync=0&v=beta&ut=2H-IhpbfXrRow1"))
        {
            request.Headers.TryAddWithoutValidation("Authorization", "Bearer redacted"); 

            request.Content = new ByteArrayContent(File.ReadAllBytes("/test.png")); 

            var response = await httpClient.SendAsync(request);
        }
    }

答案 1 :(得分:0)

不熟悉Java,但是在使用Ruby时遇到了相同的问题,并通过在请求标头中添加要上传的图像的MIME类型作为Content-Type来解决该问题。因此,在您的特定情况下,它将是:

request.addHeader("Content-Type", "image/png");

还要看看我使用Ruby的RestClient和Minimagick的解决方案:https://stackoverflow.com/a/54902863/7844946

答案 2 :(得分:0)

好的,我已经解决了,如果有人遇到相同的问题,这就是我做错了。在请求中,我向请求正文添加了一个多部分,这是错误的,您只需要进行RAW处理即可。因此,而不是

    File file = new File(pictureUrl);
    MultipartEntityBuilder builder = MultipartEntityBuilder.create();
    builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    builder.addBinaryBody("upload-file", file);
    request.setEntity(builder.build());

您刚刚放

request.setEntity(new FileEntity(new File(pictureUrl), ContentType.create(picture.getContentType())));

然后一切正常。

答案 3 :(得分:0)

我正在和kotlin一起写书,在同一个问题上苦苦挣扎了很长时间之后,我设法解决了它,对于那些苦于类似问题的人,我将其示例代码留在下面。为了直观起见,您需要提供直接的URI路径,还应注意标题结构。

这里是密码。

var file = File(ImageURI)
    val urls = URL(url)
    var connection: HttpsURLConnection = urls.openConnection() as HttpsURLConnection
    connection.setRequestProperty("Authorization","Bearer " + accesToken)
    connection.setRequestProperty("Content-Type", "image/png")
    connection.setRequestProperty("cache-control", "no-cache")
    connection.setRequestProperty("X-Restli-Protocol-Version", "2.0.0")
    connection.requestMethod = "POST"
    connection.doOutput = true
    connection.doInput = true

    var request = DataOutputStream(connection.outputStream)
    request.write(file.readBytes())
    request.flush()

    println("Response: "+connection.responseCode)